База данных
Блок База данных позволяет читать и изменять данные прямо из сценария: профили пользователей, товары, файлы, заказы, платежи, подписки и другие объекты.
Каждый блок работает с одним источником данных. Внутри источника добавляются одно или несколько действий, которые выполняются последовательно.
После выбора источника его нельзя изменить, пока в блоке есть добавленные действия. Сначала удалите все действия.
Доступные источники
| Источник | Что хранит |
|---|---|
| Пользователь | Профиль, баланс, кредиты, метки и другие поля участника бота |
| Товар | Карточки товаров из магазина: название, цена, количество, статистика |
| Файлы | Медиафайлы из библиотеки бота |
| Заказы | Заказы из встроенного магазина |
| Конфиг пользователя | Произвольные настройки, привязанные к участнику бота |
| Записи пользователя | Логи, история диалогов, счётчики токенов AI |
| Статистика пользователя | Произвольные данные по дням и типам (ключ–значение) |
| Платежи | Записи об оплатах через бота |
| Подписки | Записи о рекуррентных (периодических) подписках |
| Расписания пользователя | Персональные расписания рассылок: тип + время + дни + часовой пояс |
Пользователь
Чтение и изменение данных профиля любого участника бота.
Доступные действия
| Действие | Описание |
|---|---|
| Получить пользователя | Загружает данные участника в переменную (по умолчанию "user") |
| Изменить имя | Устанавливает новое имя |
| Изменить фамилию | Устанавливает фамилию |
| Изменить отчество | Устанавливает отчество |
| Изменить язык | Двухбуквенный код: "ru", "en" и т.д. |
| Изменить статус | Включён или Заблокирован |
| Изменить пол | Мужской / Женский / Неизвестен |
| Изменить телефон | Устанавливает номер телефона |
| Изменить email | Устанавливает адрес электронной почты |
| Изменить возраст | Целое число от 1 до 200 |
| Изменить дату рождения | Дата в формате "ГГГГ-ММ-ДД" |
| Изменить время рождения | Произвольная строка |
| Изменить место рождения | Произвольная строка |
| Изменить город | Устанавливает город |
| Изменить адрес | Устанавливает адрес доставки |
| Изменить локацию | Координаты или текстовая локация |
| Изменить биографию | Произвольный текст |
| Изменить интересы | Произвольный текст |
| Изменить устройство | Информация об устройстве |
| Указать метку | Произвольная строка-тег (например: "vip", "partner") |
| Заблокировать | Блокирует пользователя в боте |
| Разблокировать | Снимает блокировку |
| Начислить кредиты | Увеличивает счётчик кредитов (целое число) |
| Списать кредиты | Уменьшает счётчик кредитов (целое число) |
| Начислить бонусы | Увеличивает сумму бонусов (десятичное число) |
| Вычесть бонусы | Уменьшает сумму бонусов; при превышении текущего значения становится 0 |
| Увеличить доступный баланс | Добавляет к балансу (десятичное число) |
| Уменьшить доступный баланс | Вычитает из баланса; при превышении становится 0 |
| Увеличить заработок | Добавляет к полю «заработано» (десятичное число) |
| Уменьшить заработок | Вычитает из поля «заработано»; при превышении становится 0 |
| Увеличить заработок с рефералов | Добавляет к заработку с рефералов |
| Уменьшить заработок с рефералов | Вычитает из заработка с рефералов; при превышении становится 0 |
| Обновить срок оплаты | Дата в формате "ГГГГ-ММ-ДД ЧЧ:ММ" или Unix-timestamp |
| Обновить время оплаты | Дата последней оплаты |
Свойства пользователя
После действия «Получить пользователя» переменная ("user") содержит:
| Переменная | Описание |
|---|---|
| "{{user.id}}" | ID участника |
| "{{user.name}}" | Имя |
| "{{user.last_name}}" | Фамилия |
| "{{user.login}}" | Логин (@username) |
| "{{user.avatar}}" | Ссылка на аватар пользователя (URL из публичного хранилища, например https://example.com/storage/img/photos/123/abc.jpg). null, если аватара нет |
| "{{user.phone}}" | Телефон |
| "{{user.email}}" | |
| "{{user.credits}}" | Кредиты |
| "{{user.balance}}" | Доступный баланс |
| "{{user.bonuses}}" | Бонусы |
| "{{user.earn}}" | Заработано |
| "{{user.earn_from_ref}}" | Заработано с рефералов |
| "{{user.status}}" | Статус (1 — включён, 2 — заблокирован) |
| "{{user.ban}}" | Заблокирован (0 / 1) |
| "{{user.sex}}" | Пол ("male" / "female" / "unknown") |
| "{{user.lang}}" | Язык ("ru", "en" и т.д.) |
| "{{user.age}}" | Возраст |
| "{{user.date_birth}}" | Дата рождения |
| "{{user.place_birth}}" | Место рождения |
| "{{user.city}}" | Город |
| "{{user.address}}" | Адрес |
| "{{user.bio}}" | Биография |
| "{{user.interests}}" | Интересы |
| "{{user.device}}" | Устройство |
| "{{user.tag}}" | Метка |
| "{{user.pay_until}}" | Срок оплаты |
| "{{user.last_payment}}" | Дата последней оплаты |
| "{{user.is_premium}}" | Telegram Premium (0 / 1) |
Товар
Работа с карточками товаров из встроенного магазина.
Доступные действия
| Действие | Описание |
|---|---|
| Получить товар | Загружает данные товара по ID в переменную (по умолчанию "shop") |
| Изменить название | Устанавливает новое название товара |
| Изменить описание | Краткое описание |
| Изменить длинное описание | Полный текст описания |
| Изменить цену | Десятичное число (например: "99.99") |
| Изменить старую цену | Отображается как зачёркнутая цена |
| Изменить SKU | Уникальный артикул товара |
| Изменить валюту | Выбрать из списка (₽, $, € и др.) |
| Увеличить количество | Добавляет к остатку на складе |
| Уменьшить количество | Вычитает из остатка |
| Увеличить сумму продаж | Добавляет к общей сумме продаж |
| Уменьшить сумму продаж | Вычитает из суммы продаж |
| Увеличить заказы | Увеличивает счётчик заказов |
| Уменьшить заказы | Уменьшает счётчик заказов |
| Увеличить ожидающих | Увеличивает счётчик ожидающих покупателей |
| Уменьшить ожидающих | Уменьшает счётчик ожидающих |
| Увеличить просмотры | Добавляет к счётчику просмотров |
| Увеличить добавления в корзину | Добавляет к счётчику добавлений в корзину |
Свойства товара
| Переменная | Описание |
|---|---|
| "{{shop.id}}" | ID товара |
| "{{shop.name}}" | Название |
| "{{shop.description}}" | Описание |
| "{{shop.description_full}}" | Полное описание |
| "{{shop.price}}" | Цена |
| "{{shop.old_price}}" | Старая цена |
| "{{shop.currency}}" | Валюта |
| "{{shop.amount}}" | Количество в наличии |
| "{{shop.status}}" | Статус товара |
| "{{shop.sku}}" | SKU |
| "{{shop.orders}}" | Количество заказов |
| "{{shop.summa}}" | Сумма продаж |
| "{{shop.waiting}}" | Ожидающих покупателей |
| "{{shop.views}}" | Просмотры |
| "{{shop.cart_added}}" | Добавлений в корзину |
| "{{shop.image}}" | Изображение |
| "{{shop.video}}" | Видео |
| "{{shop.last_order}}" | Последний заказ |
| "{{shop.created_at}}" | Дата создания |
Файлы
Работа с медиафайлами из библиотеки бота.
Доступные действия
| Действие | Описание |
|---|---|
| Получить файл | Загружает данные файла по ID в переменную (по умолчанию "file") |
| Получить файл по внешнему ID | Загружает данные файла по полю «Внешний ID» (out_id) в переменную (по умолчанию "file") |
| Изменить название | Устанавливает новое название файла |
| Изменить описание | Текстовое описание |
| Изменить описание для Telegram | Подпись, которая отображается при отправке файла в чат |
| Изменить исполнителя | Для аудиофайлов — имя исполнителя |
| Увеличить счётчик отправлений | Шаг — целое число 1–100 |
Свойства файла
| Переменная | Описание |
|---|---|
| "{{file.id}}" | ID файла |
| "{{file.name}}" | Название |
| "{{file.description}}" | Описание |
| "{{file.file_size}}" | Размер файла |
| "{{file.file_type}}" | Тип файла |
| "{{file.file_ext}}" | Расширение |
| "{{file.file_telegram_id}}" | Telegram file_id |
| "{{file.caption}}" | Подпись для Telegram |
| "{{file.duration}}" | Длительность (секунды) |
| "{{file.width}}" | Ширина |
| "{{file.height}}" | Высота |
| "{{file.performer}}" | Исполнитель |
| "{{file.sent}}" | Количество отправлений |
| "{{file.status}}" | Статус |
| "{{file.votes}}" | Голоса |
| "{{file.rate}}" | Рейтинг |
| "{{file.out_id}}" | Внешний ID |
| "{{file.created_at}}" | Дата создания |
Заказы
Работа с заказами из встроенного магазина.
Доступные действия
| Действие | Описание |
|---|---|
| Получить заказ по ID | Загружает данные заказа в переменную (по умолчанию "order") |
| Получить заказы | Выборка заказов с фильтрами: статус, диапазон сумм, даты и др. |
| Получить заказы пользователя | Все заказы конкретного участника |
| Добавить заказ | Создаёт новый заказ |
| Обновить заказ | Изменяет поля существующего заказа |
| Добавить товар в заказ | Добавляет позицию в заказ |
| Удалить товар из заказа | Удаляет позицию из заказа |
| Изменить количество товара в заказе | Устанавливает новое количество для позиции |
| Удалить заказ | Удаляет заказ по ID |
Статусы заказа: Новый · В обработке · Ожидает оплаты · Оплачен · Отправлен · Доставлен · Отменён · Ожидание · Выполнен
Свойства заказа
| Переменная | Описание |
|---|---|
| "{{order.id}}" | ID заказа |
| "{{order.status}}" | Статус |
| "{{order.summa}}" | Сумма |
| "{{order.delivery_cost}}" | Стоимость доставки |
| "{{order.delivery_days}}" | Дней доставки |
| "{{order.discount}}" | Скидка |
| "{{order.used_promo}}" | Использованный промокод |
| "{{order.delivery_date}}" | Дата доставки |
| "{{order.created_at}}" | Дата создания |
| "{{order.goods}}" | Товары в заказе (массив) |
Конфиг пользователя
Хранит произвольные настройки, привязанные к конкретному участнику бота. Структура данных — объект с ключами на ваш выбор.
Доступные действия
| Действие | Описание |
|---|---|
| Получить настройки пользователя | Загружает весь конфиг в переменную (по умолчанию "user_config") |
| Обновить настройки | Изменяет указанные ключи. Поддерживает вложенные ключи через точку, например "settings.theme" |
| Добавить настройки | Добавляет только отсутствующие ключи; существующие значения не перезаписывает |
| Удалить настройки | Удаляет указанные ключи из конфига |
Доступ к данным
После получения конфига поля доступны через точку:
{{user_config.theme}} {{user_config.settings.color}} {{user_config.notifications}}
Блок содержит кнопку Тест — загружает реальные данные пользователя и автоматически обновляет список доступных полей для автодополнения.
Записи пользователя
Хранит произвольные записи, привязанные к пользователю. Используется для логов действий, истории диалогов с AI и любых других задач.
Доступные действия
| Действие | Описание |
|---|---|
| Получить все записи пользователя | Список записей с фильтрами (тип, значение, диапазон дат, лимит, сортировка). Результат в переменную "user_logs" |
| Получить все записи бота | Список записей по всему боту без привязки к пользователю. Результат в переменную "bot_logs" |
| Получить запись по ID | Загружает одну запись в переменную (по умолчанию "user_log") |
| Добавить запись | Создаёт новую запись. ID созданной записи сохраняется в переменную (по умолчанию "new_log_id") |
| Обновить запись | Изменяет поля существующей записи по ID |
| Удалить запись | Удаляет запись по ID |
| Количество записей | Возвращает число записей по условию в переменную (по умолчанию "user_logs_count") |
| Очистить диалог | Удаляет историю диалога в указанной записи |
| Очистить все диалоги пользователя | Удаляет историю диалогов во всех записях пользователя |
| Добавить в список | Добавляет значение в конец поля list указанной записи |
| Обновить список | Обновляет элемент поля list по указанному индексу |
| Удалить из списка | Удаляет элемент поля list по указанному индексу |
Свойства записи
| Переменная | Описание |
|---|---|
| "{{user_log.id}}" | ID записи |
| "{{user_log.tg_user_id}}" | ID пользователя |
| "{{user_log.type}}" | Тип записи |
| "{{user_log.name}}" | Название |
| "{{user_log.value}}" | Значение |
| "{{user_log.total_tokens}}" | Расход токенов (AI-интеграции) |
| "{{user_log.dialog_history}}" | История диалога (массив сообщений) |
| "{{user_log.dialog_history_count}}" | Количество сообщений в истории |
| "{{user_log.list}}" | Список (массив значений) |
| "{{user_log.list.0}}" | Значение элемента списка по индексу (0, 1, 2...) |
| "{{user_log.list_count}}" | Количество элементов в списке, по умолчанию 0 |
| "{{user_log.created_at}}" | Дата создания |
| "{{user_log.updated_at}}" | Дата обновления |
Для массива записей обращайтесь через индекс: "{{user_logs[0].value}}", "{{bot_logs[0].type}}" и т.д.
Платежи
Чтение записей об оплатах, проведённых через бота.
Доступные действия
| Действие | Описание |
|---|---|
| Получить платёж по ID | Загружает данные платежа в переменную (по умолчанию "payment") |
| Получить платёж по Order ID | Поиск платежа по уникальному номеру заказа |
| Получить платежи пользователя | Список платежей конкретного участника с фильтром по статусу и лимитом |
| Получить все платежи | Список всех платежей бота с фильтром по статусу и лимитом |
Статусы платежа: Ожидает оплаты · Оплачен · Ошибка · Истёк
Свойства платежа
| Переменная | Описание |
|---|---|
| "{{payment.id}}" | ID записи |
| "{{payment.order_id}}" | Уникальный номер заказа |
| "{{payment.status}}" | Статус |
| "{{payment.amount}}" | Сумма |
| "{{payment.currency}}" | Валюта |
| "{{payment.description}}" | Описание |
| "{{payment.pay_url}}" | Ссылка на страницу оплаты |
| "{{payment.paid_at}}" | Дата и время оплаты |
| "{{payment.payload}}" | Дополнительные параметры (JSON-объект) |
| "{{payment.payload.KEY}}" | Конкретный доп. параметр, переданный в кнопке оплаты |
Для массива: "{{payments[0].status}}", "{{payments[0].amount}}" и т.д.
Подписки
Чтение и изменение записей о рекуррентных (периодических) подписках.
Доступные действия
| Действие | Описание |
|---|---|
| Получить все подписки | Список подписок с фильтрами: пользователь, провайдер, статус, сумма, период, диапазон дат, лимит и сортировка |
| Получить активную подписку пользователя | Первая активная подписка пользователя. ID пользователя необязателен — по умолчанию берётся текущий участник |
| Обновить статус подписки | При смене на «Отменена» автоматически проставляется дата отмены |
| Обновить период подписки | Изменяет количество дней между списаниями |
| Обновить сумму подписки | Изменяет сумму следующего списания |
| Обновить валюту подписки | Изменяет валюту (например, "RUB", "USD") |
Статусы подписки: Ожидает · Активная · Просроченная · Неудачная · Отменённая
Свойства подписки
| Переменная | Описание |
|---|---|
| "{{subscription.id}}" | ID подписки |
| "{{subscription.chat_id}}" | Telegram chat_id пользователя |
| "{{subscription.tg_user_id}}" | ID пользователя в боте |
| "{{subscription.payment_provider_id}}" | ID провайдера оплаты |
| "{{subscription.card_mask}}" | Последние 4 цифры карты |
| "{{subscription.card_type}}" | Тип карты (Visa, MasterCard и др.) |
| "{{subscription.amount}}" | Сумма списания |
| "{{subscription.currency}}" | Валюта |
| "{{subscription.period_days}}" | Период в днях |
| "{{subscription.max_attempts}}" | Максимальное число попыток списания |
| "{{subscription.charge_attempts}}" | Число неудачных попыток |
| "{{subscription.status}}" | Статус |
| "{{subscription.payload}}" | Дополнительные данные |
| "{{subscription.next_charge_at}}" | Дата следующего списания |
| "{{subscription.last_charged_at}}" | Дата последнего успешного списания |
| "{{subscription.expires_at}}" | Дата окончания подписки |
| "{{subscription.cancelled_at}}" | Дата отмены |
| "{{subscription.created_at}}" | Дата создания |
| "{{subscription.updated_at}}" | Дата обновления |
Для массива: "{{subscriptions[0].status}}", "{{subscriptions[0].amount}}" и т.д.
Статистика пользователя
Источник Статистика пользователя позволяет хранить произвольные данные в виде набора ключ–значение, привязанных к конкретному пользователю, дате и типу. Удобен для фиксации ежедневных показателей, накопленных значений, результатов тестов и т.п.
Данные хранятся в таблице bot_user_stat. Уникальный ключ: bot_id + tg_user_id + date + type. Если запись с такой комбинацией уже существует, её данные обновляются (поведение updateOrCreate).
Действия
| Действие | Описание |
|---|---|
| Создать запись | Создаёт новую запись или обновляет существующую для указанного пользователя, даты и типа. Данные задаются в виде пар «название → значение» (мин. 1 пара). |
| Получить записи | Возвращает список записей с фильтрацией по пользователю, диапазону дат, типу, лимиту и сортировке. |
| Удалить запись | Удаляет одну запись по её ID. |
| Удалить записи пользователя | Удаляет все записи пользователя с возможностью фильтрации по диапазону дат и типу. |
Создать запись — поля
| Поле | Обязательное | Описание |
|---|---|---|
| ID пользователя | ✅ | Telegram ID пользователя. По умолчанию {{USER_ID}}. |
| Дата | ✅ | Дата записи в формате YYYY-MM-DD. По умолчанию {{$NOW.toDate()}}. |
| Тип | ✅ | Произвольная строка-классификатор (например, steps, score, mood). |
| Данные | ✅ | Одна или несколько пар «название → значение». Оба поля поддерживают переменные. |
Получить записи — фильтры и результат
| Поле | Описание |
|---|---|
| ID пользователя | Фильтр по пользователю. |
| Дата от | Начало диапазона (включительно). По умолчанию {{$NOW.subDays(7).toDate()}}. |
| Дата до | Конец диапазона (включительно). По умолчанию {{$NOW.toDate()}}. |
| Тип | Фильтр по типу. |
| Лимит | Максимальное количество записей (1–100, по умолчанию 10). |
| Сортировать | дата ↓ (новые вперёд) или дата ↑ (старые вперёд). |
| Префикс переменной | Имя переменной для сохранения массива результатов. По умолчанию result_stat. |
Каждый элемент результирующего массива содержит следующие свойства:
| Переменная | Описание |
|---|---|
{{result_stat[0].id}} |
ID записи |
{{result_stat[0].date}} |
Дата (YYYY-MM-DD) |
{{result_stat[0].type}} |
Тип записи |
{{result_stat[0].tg_user_id}} |
ID пользователя Telegram |
{{result_stat[0].data}} |
Данные (объект JSON) |
Удалить запись — поля
| Поле | Описание |
|---|---|
| ID записи | ID записи для удаления (например, из результата «Получить записи»). |
Удалить записи пользователя — поля
| Поле | Обязательное | Описание |
|---|---|---|
| ID пользователя | ✅ | Telegram ID пользователя. |
| Дата от | — | Начало периода удаления. |
| Дата до | — | Конец периода удаления. |
| Тип | — | Удалять только записи указанного типа. |
Пример сценария
- Добавьте блок База данных, выберите источник Пользователь.
- Добавьте действие Получить пользователя, укажите переменную "user".
- В блоке «Условие» проверьте "{{user.credits}}" — если кредитов достаточно, выполните следующий шаг, иначе предложите их пополнить.
- После оплаты снова добавьте блок База данных и действие Начислить кредиты, чтобы обновить счёт пользователя.
Расписания пользователя
Источник Расписания пользователя позволяет управлять персональными расписаниями рассылок каждого пользователя. Это необходимо, если вам нужно отправлять несколько рассылок в разное время с учётом часового пояса конкретного пользователя — например, утренняя и вечерняя рассылки.
Как это работает в связке с Автосообщениями
- Включите в ноде «Автосообщение» (Общий таймер → Календарный) опцию Индивидуальное расписание.
- Укажите Тип расписания, например
morningилиevening. - Боtra будет отправлять сообщение только тем пользователям, у которых в базе есть запись с данным типом.
- Управляйте записями через блок «База данных» → источник «Расписания пользователя».
Если поле «Тип расписания» оставить пустым — используется устаревшее поведение: поля preferred_time и preferred_days из профиля пользователя.
Действия
| Действие | Описание |
|---|---|
| Создать / обновить расписание | Добавляет или обновляет запись по типу. Поля: тип, время (ЧЧ:ММ), дни, часовой пояс |
| Получить расписание по типу | Возвращает объект записи в переменную или null |
| Получить все расписания | Возвращает массив всех записей пользователя |
| Удалить расписание | Удаляет запись по типу |
Поля объекта расписания ({{schedule.поле}})
| Поле | Описание |
|---|---|
{{schedule.id}} |
ID записи |
{{schedule.schedule_type}} |
Тип расписания |
{{schedule.time}} |
Время в формате HH:MM |
{{schedule.days}} |
Дни недели через запятую (mon,tue,wed) или пусто = все дни |
{{schedule.timezone}} |
IANA часовой пояс или пусто (используется timezone пользователя) |
{{schedule.created_at}} |
Дата создания |
{{schedule.updated_at}} |
Дата обновления |
Пример: утренняя и вечерняя рассылки
Шаг 1. Пользователь выбирает удобное время — бот сохраняет:
База данных → Расписания пользователя → Создать/обновить
Тип: morning
Время: {{user_input_time}} ← например 08:00
Дни: mon,tue,wed,thu,fri
Часовой пояс: {{user.timezone}}
Шаг 2. Создайте ноду «Автосообщение» → Общий таймер → Календарный:
- Включите «Индивидуальное расписание»
- Тип расписания:
morning
Шаг 3. Повторите для вечерней рассылки (тип evening, время 20:00).
Результат: каждый пользователь получает рассылки ровно в своё время, а у разных пользователей могут быть разные времена для одного и того же типа.
