База знаний GetMyBot

Платежи и баланс

Приём платежей ботом: подключение своей кассы (MIXPLAT, ЮKassa, Telegram Payments, Робокасса, Продамус, CloudPayments, Т-Касса, Stripe, Lava.top, CryptoCloud, NOWPayments, VK Pay), сценарий «оплата → доступ», статусы счетов и возвраты. Плюс баланс запросов и тарифы платформы.

На этой странице

В GetMyBot два разных платёжных контура, и их важно не путать.

  • Приём платежей ботом: бот выставляет счета своим подписчикам, деньги идут напрямую вам. Об этом почти вся статья.
  • Баланс запросов платформы: то, что вы платите за работу самого GetMyBot. Об этом последний раздел.

Что такое касса

Кассой здесь называется ваш аккаунт в платёжной системе, подключённый к боту. Вы получаете реквизиты в личном кабинете провайдера, вносите их в GetMyBot, и бот выставляет счета вашими же ключами.

Деньги при этом идут напрямую вам, на ваш мерчант-аккаунт. GetMyBot не платёжный агент: он не принимает и не хранит ваши деньги, не участвует в расчётах и не удерживает процент с оборота. Платформа делает две вещи: просит провайдера создать счёт и слушает уведомление об оплате, чтобы запустить нужную реакцию.

Отсюда несколько следствий:

  • договор, комиссия, вывод средств, проверки и лимиты относятся к вашим отношениям с платёжной системой, а не с GetMyBot;
  • секретные ключи хранятся в зашифрованном виде и никогда не показываются обратно. При повторном открытии настроек поле секрета пустое, и пустое значение означает «оставить прежний»;
  • возврат тоже ваша операция: платформа лишь вызывает API провайдера вашими ключами.

У бота может быть несколько касс, например рублёвая и валютная. Одну из них можно пометить как кассу по умолчанию: её берут счета, где касса не выбрана явно.

Доступность приёма платежей зависит от тарифа. Если текущий тариф её не включает, экран «Кассы» покажет подсказку об этом, а действие «Выставить счёт» не создаст счёт.

Как подключить кассу

  1. Откройте раздел Кассы. Из журнала платежей туда ведёт кнопка Кассы в правом верхнем углу.
  2. Нажмите Подключить кассу и выберите провайдера. Форма подстраивается под него: у каждой платёжной системы свой набор полей.
  3. Заполните название кассы и реквизиты. Название видите только вы, оно нужно, чтобы различать кассы в списках.
  4. Включите Касса по умолчанию, если бот будет выставлять счета в основном через неё.
  5. Сохраните. На карточке кассы появится Callback URL: адрес, на который провайдер шлёт уведомления об оплате.
  6. Нажмите Копировать и вставьте этот адрес в личном кабинете провайдера как адрес уведомлений. У разных систем он называется по-разному: webhook, Result URL, URL уведомлений, notification URL.
  7. Нажмите Проверить подключение. Проверка смотрит, что реквизиты заполнены и провайдер их принимает. Ответ «Подключение работает» означает, что можно выставлять счёт.

Обязательно укажите Callback URL у провайдера. Без него провайдер спишет деньги, но GetMyBot об этом не узнает: счёт останется в статусе «Ожидает оплаты», а реакция на оплату не запустится.

Переключатель на карточке кассы временно выключает её, не удаляя реквизиты. Удаление кассы не удаляет её платежи: они остаются в журнале.

Провайдеры

Ниже: что понадобится взять в личном кабинете каждой системы. Точный набор полей вы увидите в форме подключения: она строится по описанию самого провайдера.

Поле Система налогообложения встречается у нескольких провайдеров и нужно для чека по 54-ФЗ. Варианты: ОСН, УСН доход, УСН доход минус расход, ЕНВД, ЕСХН, патент.

MIXPLAT

  • ID проекта: личный кабинет MIXPLAT, раздел «Проекты».
  • API-ключ: проект, «Настройки API». Секретное поле.
  • Способ оплаты: карта, мобильный платёж, кошелёк или банк. По умолчанию карта.
  • Тестовый режим: переключатель для проверки сценария без реальных денег.

Валюты: RUB, EUR, BYN, KZT, UAH. Поддерживаются чеки, полные и частичные возвраты.

ЮKassa

  • ID магазина: личный кабинет ЮKassa, «Настройки → Магазин».
  • Секретный ключ: «Настройки → API». Секретное поле.

Валюта: RUB. Поддерживаются чеки, полные и частичные возвраты.

Telegram Payments

Эта касса устроена иначе остальных. Счёт приходит подписчику не ссылкой, а встроенным счётом Telegram прямо в чате, а подтверждение оплаты Telegram присылает обычным обновлением бота, а не запросом на Callback URL. Поэтому адрес уведомлений для такой кассы никуда вставлять не нужно, а подстановка {payment:url} для неё пустая.

  • Токен платёжного провайдера: в BotFather: /mybots → ваш бот → Payments → подключите провайдера (ЮKassa, Сбербанк и другие) и скопируйте выданный токен. Токен не нужен, если бот принимает только Telegram Stars.
  • Валюта по умолчанию: RUB, USD, EUR или XTR (Telegram Stars). Применяется, если счёт не задал валюту явно.

Возвраты по такой кассе из панели GetMyBot не оформляются: по обычным платежам их делают в личном кабинете подключённого провайдера. Позиции чека для этой кассы в конструкторе не показываются: чек формирует подключённый к боту провайдер.

Робокасса

  • Идентификатор магазина (MerchantLogin): личный кабинет Робокассы, настройки магазина.
  • Password1 и Password2. Это разные пароли с разными ролями: первым подписывается ссылка на оплату, вторым проверяется входящее уведомление. Перепутать их: классическая ошибка интеграции.
  • Отдельная пара тестовых паролей, если включён тестовый режим.
  • Система налогообложения и переключатель Тестовый режим.

Валюта: RUB. Чеки поддерживаются. Возвраты оформляются в личном кабинете Робокассы, из панели GetMyBot они недоступны.

Продамус

  • Поддомен формы оплаты: например my-shop, если ваша форма находится на my-shop.payform.ru.
  • Секретный ключ формы оплаты.

Валюта: RUB. Чеки поддерживаются, возвраты из панели недоступны.

CloudPayments

  • Public ID: личный кабинет CloudPayments, «Настройки → API».
  • API-секрет оттуда же. Секретное поле.
  • Система налогообложения.

Валюты: RUB, USD, EUR. Поддерживаются чеки, полные и частичные возвраты.

Т-Касса

  • TerminalKey: личный кабинет Т-Кассы, раздел «Терминалы».
  • Пароль терминала. Секретное поле.
  • Система налогообложения.

Валюта: RUB. Поддерживаются чеки, полные и частичные возвраты.

Stripe

  • Секретный ключ (Secret key): Stripe Dashboard, «Developers → API keys». Секретное поле.
  • Секрет вебхука (Signing secret): Stripe Dashboard, «Developers → Webhooks», нужный endpoint. Секретное поле.

Счёт открывается как размещённая у Stripe страница Checkout. У уведомления проверяется не только подпись, но и время: колбэк старше пяти минут отклоняется, поэтому перехваченное уведомление не получится переиграть позже.

У валют без дробной части, например JPY и KRW, сумма счёта должна быть целой. Счёт на 199.90 в таких валютах не выставится: у иены нет сотых долей.

Валюты: USD, EUR, GBP, JPY, AUD, CAD, CHF, CNY, HKD, SGD, SEK, NOK, DKK, PLN, CZK, KRW, INR, BRL, MXN, ZAR, TRY, AED, ILS, NZD, THB, IDR, PHP, VND, BHD, KWD. Поддерживаются полные и частичные возвраты. Чеков по 54-ФЗ у этой кассы нет, поэтому блок позиций чека для неё не показывается.

Lava.top

  • ID магазина (Shop ID): личный кабинет Lava.top, раздел «Магазин».
  • API-ключ: там же, «API-ключи». Секретное поле.
  • Секрет вебхука: там же, «Webhook». Им подписывается уведомление об оплате. Секретное поле.

Валюты: USD, EUR, GBP. Чеки и возвраты из панели не поддерживаются: возврат оформляется в личном кабинете Lava.top.

У этой кассы нет и опроса статуса. Если уведомление не дошло, счёт сам по себе не станет оплаченным: сверьте платёж в личном кабинете Lava.top и обратитесь в поддержку за ручной сверкой.

CryptoCloud

  • ID магазина (Shop ID): личный кабинет CryptoCloud, раздел «Магазины».
  • API-ключ: раздел «API». Секретное поле.
  • Секрет постбэка: «Магазин → Postback». Им подписывается токен уведомления. Секретное поле.

Счёт выставляется в обычной валюте, а криптовалюту для оплаты покупатель выбирает сам на странице CryptoCloud. Курс фиксирует провайдер в момент выставления счёта.

Уведомление подписано, но само по себе оплатой не считается: платформа перезапрашивает счёт у CryptoCloud и берёт сумму из ответа, а не из уведомления. Недоплата счёт не закрывает: он остаётся в статусе «Ожидает оплаты», и реакция на оплату не сработает. Переплата считается оплатой.

Валюты: USD, EUR, RUB. Опрос статуса поддерживается. Чеки и возвраты недоступны: перевод в блокчейне необратим, поэтому вернуть деньги можно только отдельным переводом покупателю.

NOWPayments

  • API-ключ: личный кабинет NOWPayments, «Settings → API keys». Секретное поле.
  • Секрет IPN: «Settings → IPN». Им подписывается уведомление. Секретное поле.

Как и у CryptoCloud, счёт выставляется в обычной валюте, а криптовалюту выбирает плательщик на странице NOWPayments. Уведомление (IPN) подписано целиком, вместе со статусом и суммой, поэтому дополнительный запрос к провайдеру не нужен.

Адрес уведомлений платформа передаёт провайдеру прямо в счёте, но сам механизм IPN должен быть включён в настройках аккаунта NOWPayments.

Частичная оплата счёт не закрывает: пока пришло меньше выставленного, счёт остаётся в статусе «Ожидает оплаты».

Валюты: USD, EUR, RUB. Опрос статуса поддерживается, чеки и возвраты недоступны.

VK Pay

Эта касса, как и Telegram Payments, живёт только внутри своего мессенджера. Счёт приходит не ссылкой, а кнопкой оплаты прямо в переписке ВКонтакте, а подтверждение приходит обычным событием сообщества, а не запросом на Callback URL. Поэтому адрес уведомлений для такой кассы никуда вставлять не нужно, а подстановка {payment:url} для неё пустая.

  • ID сообщества VK (group_id): числовой идентификатор сообщества, которому уходит перевод, без минуса.

Если реакция с такой кассой сработает в Telegram или WhatsApp, счёт не выставится: кнопку VK Pay умеет показать только ВКонтакте. Причина отказа будет видна в шаге «Счёт» карточки реакции.

Валюта: RUB. Чеки, опрос статуса и возвраты из панели не поддерживаются: спорные переводы разбираются в личном кабинете VK Pay.

Сценарий «оплата → доступ»

Сценарий всегда состоит из двух реакций: одна выставляет счёт, вторая срабатывает на оплату. Разделение не формальность: между этими моментами проходит время, а подписчик может уйти и вернуться.

Реакция 1: выставить счёт

Триггер: то, с чего начинается покупка: команда, текст, нажатие кнопки. Дальше добавьте действие Выставить счёт и настройте его:

  • Касса: конкретная или «Касса по умолчанию».
  • Сумма: в основной единице валюты, то есть в рублях, а не в копейках. Можно писать дробную часть через точку или запятую (199.90). Вместо числа допустима подстановка или формула, например {user:cart_total}.
  • Валюта: из списка валют выбранной кассы или «Валюта кассы по умолчанию».
  • Описание: то, что подписчик увидит на странице оплаты. Поддерживает подстановки.
  • Локальный срок жизни счёта в MyBot, сек.: 0 отключает локальное истечение MyBot. Иначе укажите целое число от 300 до 2592000 секунд. Это не закрывает ссылку у провайдера: она может остаться платёжной. Если провайдер позднее подтвердит поступление, счёт всё равно станет «Оплачен».
  • Сохранить ссылку в параметр подписчика: необязательно. Пригодится, если ссылку нужно напомнить позже, в другой реакции.
  • Позиции чека: наименование и сумма в копейках для каждой позиции. Блок показывается только у касс, которые умеют чеки.
  • Подарок: получатель: необязательно. Подстановка или число с tg_user_id подписчика, для которого делается покупка, например {user:gift_to}. Если указан другой подписчик, счёт считается подарочным.
  • Подарок: сообщение: текст от дарителя для адресата. Поддерживает подстановки и сохраняется только у подарочного счёта.

После действия добавьте сообщение со ссылкой на оплату: вставьте в текст подстановку {payment:url}, иначе подписчик просто не получит ссылку. Конструктор предупреждает об этом, если счёт выставляется, а подстановки в сообщении нет.

Кроме {payment:url} доступны {payment:id} (внутренний номер в MyBot), {payment:provider_id} (номер платежа у провайдера, например payment_id ЮKassa), {payment:order} (номер заказа), {payment:amount}, {payment:currency}, {payment:description}, {payment:charge_kind} (one_off, initial или recurring) и {payment:plan} (ключ подписки). Для подарков доступны {payment:gift} (1/0), {payment:gift.from_id}, {payment:gift.to_id} и {payment:gift.message}. В реакции на изменение статуса {payment:audience} содержит buyer или recipient.

Реакция 2: выдать доступ

Создайте отдельную реакцию и выберите триггер Платёж. У него есть:

  • Статус платежа: «Оплачен», «Не удался» или «Возвращён». По умолчанию «Оплачен».
  • Касса: реагировать только на платежи через конкретную кассу или на любые.
  • Минимальная сумма, коп.: отсечь мелкие счета. Сравнивается сумма счёта, указана в копейках.
  • Тип списания: любой, «Разовый», «Первый платёж подписки» или «Автосписание». Связка «Не удался» + «Автосписание» – событие неуспешного автосписания.
  • Ключ подписки: реагировать только на платежи по конкретному плану подписки.
  • Кому доставить: «Покупателю» (по умолчанию) или «Получателю подарка». Реакция для получателя срабатывает только у подарочного счёта. Она отправляется в личный чат Telegram адресата, если он уже писал боту; покупатель независимо получает реакции для своей аудитории.

Дальше: обычные действия: выдать доступ, поставить метку «Оплатил», записать заказ в коллекцию, отправить материалы. В тексте доступны те же подстановки {payment:...}, включая {payment:status} и {payment:refunded}.

Триггер «Платёж» работает по обеим сторонам: реакцию на статус «Возвращён» удобно использовать, чтобы автоматически снимать доступ после возврата.

Подписки с автосписанием

Подписка подписчика – это регулярное списание по сохранённому способу оплаты. Полный сценарий автосписания реализован для ЮKassa (save_payment_method) и Stripe (setup_future_usage и привязка карты к customer).

Оформить подписку

Действие Оформить подписку выставляет первый счёт и просит кассу сохранить способ оплаты. Укажите кассу, ключ подписки (например, premium), сумму, валюту, период (week, month или year), описание и при необходимости позиции чека. После оплаты подписка становится активной, а первое автосписание планируется через один период. Если касса не вернула сохранённый способ оплаты, подписка отменяется с причиной method_not_saved; уже оплаченный первый период остаётся.

Пока первый счёт не оплачен, повторный запуск действия отменяет прежний неоплаченный счёт и создаёт новый. Если подписка с тем же ключом уже имеет статус active или past_due, новый счёт не выставляется.

Автосписание и неуспешные попытки

Списание запускается автоматически в дату окончания периода. Каждая попытка – отдельный счёт в журнале с типом recurring. После первой неудачи подписка получает статус past_due, следующий запуск назначается через сутки; после второй – через трое суток. Третья неудача переводит подписку в статус expired. Неудачная попытка запускает реакции с триггером «Платёж» → «Не удался» + «Автосписание», успешная – «Оплачен» + «Автосписание».

Остановка и смена условий

Действие Отменить подписку останавливает автосписания подписчика по ключу или сразу для всех его активных планов. Действие Изменить подписку меняет период и/или сумму начиная со следующего списания. Оба действия разрешены внутри реакции на платёж, например для остановки автосписаний после возврата; Оформить подписку внутри платёжной реакции запрещено.

Подстановки подписки

В реакциях доступны {subscription:id}, {subscription:plan}, {subscription:status} (none, pending, active, past_due, canceled, expired), {subscription:period}, {subscription:amount}, {subscription:currency}, {subscription:period_end}, {subscription:next_charge_at}, {subscription:attempts} и {subscription:method} (маскированное название способа оплаты). Вне платёжной реакции используется самая свежая подписка подписчика со статусом active или past_due; если её нет, статус равен none.

Подписки доступны владельцу через REST и MCP. Остановка через cancel_subscriber_subscription не возвращает уже списанные деньги.

Доступ на срок: закрытый клуб по подписке

Чтобы доступ заканчивался вместе с оплаченным периодом, используйте временную метку:

  1. В реакции на оплату (триггер Платёж) действие Изменить метки → добавить метку «Клуб», Срок, дней = 30. Затем отправьте сообщение со ссылкой на закрытый чат и инструкцией подать заявку на вступление.
  2. Создайте отдельную реакцию на Системное событие → Заявка на вступление. Добавьте условие есть метка «Клуб», чтобы не одобрять неоплаченные заявки, затем действие Изменить права → Одобрить заявку с явным chat_id закрытого чата. Бот может одобрить только уже поданную заявку, а эта реакция выполняется для подписчика, который её подал.
  3. Реакция на Системное событие → Метка истекла: действие Изменить права → Исключить с тем же chat_id. Во время реакции метка ещё назначена и снимается автоматически только после успешной обработки события. Если действие завершается ошибкой, событие будет повторено, а метка не потеряется. В тексте доступны {{event.label_name}} и {{event.expired_at}}.
  4. Напоминание перед окончанием: в любом сообщении подписчику {{label.Клуб.days_left}} и {{label.Клуб.expires_at}} покажут остаток срока. Повторная оплата просто переназначает метку на новые 30 дней от момента оплаты.

Тот же контур работает для VK Donut (события подписки вместо триггера «Платёж», см. Каналы → VK Donut) и для кампаний: узел Задержка и следом Действие → Изменить права с явным chat_id.

Статусы счёта

Статус виден в журнале платежей и в карточке платежа.

  • Создан: счёт заведён у нас, провайдер о нём ещё не отчитался. Обычно так выглядят несколько секунд перед появлением ссылки.
  • Ожидает оплаты: ссылка выдана, подписчик пока не заплатил.
  • Оплачен: деньги дошли, сумма и валюта совпали с выставленным счётом. Именно этот момент запускает реакцию на оплату.
  • Ошибка: оплата не прошла: банк отклонил, карта не прошла проверку и тому подобное. Не окончательный статус: если провайдер позже подтвердит платёж, счёт станет «Оплачен».
  • Отменён: платёж отменён, дальнейших изменений не будет.
  • Истёк: срок жизни счёта вышел. Если оплата всё же придёт позже, счёт станет «Оплачен»: деньги, которые реально пришли, всегда фиксируются.
  • Возвращён: возвращена вся сумма.
  • Частично возвращён: возвращена часть суммы. Остаток можно вернуть позже, тогда счёт станет «Возвращён».

Два правила работают на вашу защиту. Повторное уведомление с тем же статусом ничего не меняет, поэтому доступ не выдаётся дважды. И статус никогда не откатывается назад: оплаченный счёт нельзя «разоплатить» опоздавшим уведомлением.

Журнал платежей

Раздел Платежи: список всех счетов бота. Есть поиск по номеру заказа, фильтр по статусу и по кассе. В карточке платежа также показаны номер платежа у провайдера, подарочные поля и ссылка на подписку, если счёт относится к ней.

Клик по строке открывает карточку платежа: сумма, статус, касса, плательщик, время создания и оплаты, описание и журнал событий. В журнале видно каждую попытку изменить статус и её тип: колбэк (уведомление от провайдера), опрос статуса, ручная сверка, возврат. Это первое место, куда стоит смотреть, если что-то пошло не так.

Возвраты

Возврат из панели доступен для касс, которые это умеют: MIXPLAT, ЮKassa, CloudPayments, Т-Касса, Stripe. У Робокассы, Продамуса, Lava.top, VK Pay и Telegram Payments возврат оформляется в личном кабинете провайдера. У CryptoCloud и NOWPayments возврата нет вовсе: перевод в блокчейне необратим, деньги возвращают отдельным переводом покупателю.

Как оформить: Платежи → нужный платёж → в карточке кнопка Оформить возврат. Кнопка появляется только у оплаченного счёта и только если касса поддерживает возвраты. Подтверждение спрашивается отдельным вопросом.

Возврат не обязан быть полным. Все пять касс из списка выше умеют и частичный возврат, поэтому рядом с кнопкой появляется поле с суммой: по умолчанию в нём весь непогашенный остаток счёта, но можно вернуть меньше и вернуть остаток позже. Больше остатка вернуть нельзя.

После подтверждения от провайдера счёт получает статус «Возвращён», а если вернули часть суммы: «Частично возвращён». Событие возврата попадает в журнал событий платежа. Если у вас настроена реакция на триггер «Платёж» со статусом «Возвращён», она сработает.

Фискализация и чеки

Чек по 54-ФЗ формирует ваш платёжный провайдер, а не GetMyBot. Платформа лишь передаёт ему позиции, которые вы задали в действии «Выставить счёт», и систему налогообложения из настроек кассы.

Что из этого следует:

  • сумма позиций должна совпадать с суммой счёта, иначе провайдер отклонит счёт;
  • ставка НДС у позиции выбирается явно (по умолчанию «без НДС»); количество считается равным единице, если не задано иное;
  • корректность наименований, ставок НДС и признаков предмета расчёта: ваша ответственность как продавца. Проверьте пробный чек в личном кабинете провайдера до первой боевой продажи.

Если что-то пошло не так

Деньги списались, а реакция не сработала

Откройте карточку платежа и посмотрите статус и журнал событий. Дальше по порядку:

  • Статус не «Оплачен»: провайдер не прислал подтверждение или оно было отклонено. Проверьте, что Callback URL с карточки кассы вставлен в личном кабинете провайдера, и посмотрите события платежа.
  • Статус «Оплачен», но реакции нет: проверьте фильтры триггера «Платёж»: касса и минимальная сумма. Реакция с фильтром по другой кассе не сработает.
  • Счёт выставлен вне диалога: если у платежа нет плательщика, отправлять реакцию некому. Платёж записан в журнал, но сообщения не уходят.
  • Тариф не включает приём платежей: в этом случае и счёт не выставляется, и события платежа не запускают реакции.
  • Подписчик не получил ссылку: в сообщении не было подстановки {payment:url}. Проверьте текст реакции, выставляющей счёт.

Если нужно понять, что именно произошло в реакции, откройте диалог подписчика в разделе Люди или Чаты: под сообщением видна карточка с шагами сработавшей реакции. Шаг «Счёт» показывает и успешное выставление, и причину отказа, например «касса не найдена» или «касса не принимает USD».

Провайдер шлёт уведомления по кругу

Это нормальное поведение: платёжные системы повторяют уведомление, пока не получат подтверждение. Повторы безопасны: уведомление с уже применённым статусом ничего не меняет, доступ не выдаётся дважды.

Если повторы не прекращаются, значит провайдер не получает подтверждения. Обычные причины: в личном кабинете указан неверный адрес уведомлений или не совпадает подпись, то есть в кассе введены не те ключи. Уведомление с неверной подписью отклоняется целиком и никогда не меняет статус счёта: так подделанный колбэк не сможет выдать доступ.

Оплата прошла на другую сумму

Если провайдер сообщает сумму, отличную от выставленной, счёт не помечается оплаченным, а в журнале событий появляется отказ. Это защита, а не ошибка: иначе оплата ста рублей открывала бы доступ к товару за десять тысяч.

Что делать: сверьте сумму в личном кабинете провайдера. Деньги у вас, поэтому дальше это ваше решение: вернуть платёж покупателю или выставить счёт на верную сумму. Если платёж корректный и его нужно провести, обратитесь в поддержку: сверку делает отдельная операция, она попадает в журнал событий как «ручная сверка».

Касса недоступна на тарифе

Экран «Кассы» показывает подсказку и предлагает перейти к тарифам, кнопка подключения при этом не работает. Уже подключённые кассы не удаляются, но счета не выставляются, а события платежей не запускают реакции. После перехода на подходящий тариф всё продолжает работать с прежними реквизитами.

Баланс и тарифы платформы

Это второй контур, никак не связанный с деньгами ваших покупателей. Работу самого бота платформа считает в запросах: реакция списывает с баланса аккаунта сумму весов своих действий, минимум один запрос за вызов. Подробный разбор: в разделе Статистика и журнал.

Раздел Оплата показывает текущий баланс и доступные тарифы. У тарифа есть цена, объём запросов и лимиты, например максимальное число ботов. Кнопка Выбрать подключает тариф.

Баланс рассчитывается по неизменяемому журналу начислений и списаний: бонус при регистрации, начисление тарифа, пополнение, расход. Записи в него только добавляются, поэтому историю всегда можно сверить, а текущий баланс равен сумме по журналу.

Пополнение создаёт платёж на нужный объём запросов. После подтверждения провайдером баланс начисляется автоматически, повторное уведомление начисление не задвоит.

Что дальше