Оплата и тарифы

Otapush тарифицируется по MAU — monthly active users (unique devices): количеству уникальных устройств, обратившихся к вашему серверу обновлений в течение календарного месяца. Всё остальное — опубликованные обновления, каналы, хранилище, трафик — не тарифицируется ни на одном тарифе. Цены указаны в рублях, платежи проводятся через Т-Банк.

Черновые цены — финальные будут объявлены до запуска.

Откуда берётся device id и как сервер привязывает запросы к устройствам, описано в Протоколе; регистрация идентификатора в приложении — часть Быстрого старта и Настройки Expo.

Что считается за MAU, а что нет

«Устройство» — это строка идентификатора, которую клиент отправляет с каждым запросом к протокольным эндпоинтам: в query-параметре, в заголовке x-device-id или в extra-параметре deviceid. Сервер хранит ровно одну запись на пару (приложение, устройство, календарный месяц): первая проверка манифеста или скачивание ассета в месяце создаёт её, и всё, что устройство делает до конца месяца, счётчик больше не меняет.

Последствия стоит проговорить явно:

  • Устройство считается один раз. Проверяющее обновления каждый час весь месяц устройство — это один MAU.
  • Проверки без результата тоже считаются. Запись об устройстве создаётся до того, как сервер решит, есть ли обновление, поэтому «холостые» опросы тихого канала тарифицируются наравне с остальными.
  • Запросы, отклонённые рано, не считаются. Запрос, отклонённый из-за отсутствия device id, неизвестного slug приложения или неизвестного канала, получает ответ до создания какой-либо записи об устройстве.
  • Неучитываемый трафик существует. При REQUIRE_DEVICE_ID=false на сервере запросы без идентификатора обслуживаются как обычно, но остаются неатрибутированными — в счёт они не идут.
  • Тестовые устройства считаются. curl с ?deviceId=curl-test — это MAU, как и эмулятор. Держите нагрузочные тесты и CI-проверки на сервере, за который не платите.

Месяц — UTC: счётчик обнуляется в 00:00 UTC первого числа, а не по вашему местному времени. Устройство, не обращавшееся к серверу в течение месяца, в этом месяце просто отсутствует — постоянного реестра устройств, помнящего прошлые месяцы, нет.

Текущее значение видно на вкладке Обзор приложения и на странице Оплата портала.

Один лимит на все приложения аккаунта

Лимит MAU действует на сумму по всем вашим приложениям, а не на каждое в отдельности: страница «Оплата» складывает устройства текущего месяца по всем приложениям. Вкладка «Обзор» отдельного приложения показывает его собственное число устройств относительно того же лимита аккаунта.

Число приложений — отдельный лимит, и работает он иначе. На Free (1 приложение), Start (3) и Pro (10) сервер откажет в создании нового приложения с ошибкой 403 plan_limit, когда лимит достигнут; у Business и Enterprise лимита нет. То есть превышение по приложениям блокируется на создании, а превышение по MAU — никогда, о чём следующий раздел.

Что происходит при превышении лимита

Обновления никогда не блокируются. Эндпоинты, раздающие манифесты и ассеты, вообще не смотрят на лимит тарифа — в коде нет ни одного пути, при котором раздача остановится после превышения MAU, ни на одном тарифе. Вместо этого:

  • API статистики возвращает overLimit: true рядом со счётчиком и лимитом;
  • страницы «Обзор» и «Оплата» показывают полосу использования в предупреждающем состоянии: «Лимит превышен — обновления продолжают работать, но, пожалуйста, перейдите на тариф выше».

Email-уведомлений нет — в коде нет ни почтового клиента, ни какой-либо системы уведомлений. Предупреждающее состояние в портале — весь сигнал целиком.

Переход на тариф выше вступает в силу в момент подтверждения оплаты, и новый лимит применяется к текущему месяцу сразу.

Тарифы

Тариф MAU Приложения В месяц В год
Free 10 1 0 ₽ 0 ₽
Start 1 000 3 490 ₽ 4 900 ₽
Pro 10 000 10 2 490 ₽ 24 900 ₽
Business 100 000 Безлимит 9 990 ₽ 99 900 ₽
Enterprise Индивидуально Безлимит Свяжитесь с нами Свяжитесь с нами

Год стоит десять месяцев: годовая цена равна десяти месячным платежам — 4 900 ₽ вместо 5 880 ₽ на Start, 24 900 ₽ вместо 29 880 ₽ на Pro. Free и Start ориентированы на индивидуальных разработчиков; Pro и Business могут оплачивать и юридические лица (счётом — ниже). Enterprise недоступен через самообслуживание: портал вместо оплаты показывает ссылку на менеджера, а checkout API отклоняет попытку оформить этот тариф напрямую.

Месячный и годовой периоды

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

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

Смена тарифа

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

  • Пересчёта нет. Переход с Pro на Business посреди месяца стоит полную цену Business; сервер не считает частичные суммы ни в одну сторону.
  • Понижение тарифа — та же операция. Меньший лимит действует сразу, а новый период всё равно начнётся после окончания текущего.

Оплата картой (Т-Банк)

Карточные платежи идут через интернет-эквайринг Т-Банка; в портале способ называется «Банковская карта / СБП (Т-Банк)» — платёжная страница Т-Банка принимает банковские карты и СБП. По каждому платежу оформляется фискальный чек (54-ФЗ), который уходит на email аккаунта.

  1. Откройте Оплату в портале, выберите тариф, период и способ «карта».
  2. Вас перенаправит на платёжную страницу Т-Банка (это paymentUrl, который возвращает checkout API).
  3. После оплаты Т-Банк подтвердит её подписанным вебхуком; сервер проверит токен и активирует тариф. Повторные уведомления по тому же платежу ничего не меняют.
  4. Обновите страницу Оплаты — текущий тариф и дату окончания периода портал берёт из GET /api/billing/subscription.

Оплата по счёту (юридические лица)

На тарифах Pro и Business юридическое лицо может оплатить безналичным переводом:

  1. На странице Оплата выберите тариф, укажите плательщика Юридическое лицо и способ Счёт.
  2. Сервер запишет платёж и покажет номер счёта и реквизиты получателя. PDF-документ не генерируется — реквизиты берутся из конфигурации биллинга на сервере, и по умолчанию там стоят заглушки.
  3. Оплатите счёт с расчётного счёта компании.

Об одном стоит сказать прямо: в коде нет автоматической активации для оплат по счёту. Единственное, что включает тариф, — вебхук подтверждения от Т-Банка, тот же, что и у карт; пока подтверждение по счёту не придёт, запись о платеже остаётся в статусе pending. (Тесты API фиксируют это поведение дословно: «Invoice payments never activate a subscription on their own».)

Тариф Free не требует оплаты — checkout его отвергает. Enterprise checkout тоже отвергает; пользуйтесь ссылкой на менеджера.

Конец периода, отмена, возвраты

Говорим прямо, потому что это деньги:

  • Автопродления нет. Каждый платёж разовый. Карта не сохраняется, списаний по подписке нет, и фонового задания, которое выставит счёт снова, тоже нет.
  • Кнопки отмены нет. Раз ничего не продлевается, отменять нечего: тариф просто работает до конца оплаченного периода, и после ничего не списывается.
  • Код никогда не «выключает» тариф. Задания, которое вернуло бы аккаунт на Free по окончании периода, нет; лимит в каждый момент читается из текущего тарифа аккаунта.
  • Возвраты не автоматизированы. Эндпоинта возврата в API нет; платёжный вебхук умеет лишь записывать статусы возвратов, присланные Т-Банком, но сам возврат Otapush не выполняет.

Вопросы и ответы

Проверка, вернувшая «обновлений нет», всё равно считается за MAU?

Да. Запись об устройстве создаётся на каждом запросе манифеста, прошедшем поиск приложения и канала, до того как сервер решит, чем ответить, — noUpdateAvailable, манифест и директива отката идут после записи.

У нас три приложения на одном аккаунте. Каждому положено свои 10 000 MAU на Pro?

Нет. Лимит действует на аккаунт: устройства всех трёх приложений складываются и сравниваются с одним лимитом 10 000. Страница «Оплата» всегда показывает суммарное число.

Что будет, если всплеск трафика за ночь удвоит MAU?

Ничего не остановится. Манифесты и ассеты продолжат раздаваться — ни на одном тарифе нет отсечки раздачи. Портал покажет предупреждающее состояние, а API статистики — флаг overLimit; что делать дальше (переходить на тариф выше или нет), решаете вы.

Может ли юридическое лицо заплатить картой?

Да. Тип плательщика и способ оплаты независимы: юридическое лицо может заплатить картой через Т-Банк либо счётом на тех тарифах, где оплата по счёту вообще есть (Pro и Business).

Когда именно обнуляется счётчик?

В 00:00 UTC первого числа месяца. Все ключи месяцев вычисляются в UTC независимо от того, где находитесь вы и ваши пользователи.

Спишут ли деньги автоматически, когда период закончится?

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

Можно ли вернуть деньги за неиспользованное время?

Автоматически — нет. Эндпоинта возврата и сценария возврата в портале нет; платёжный вебхук лишь записывает уведомления о возвратах, присланные Т-Банком.

Считаются ли эмуляторы, CI-запуски и curl устройствами?

Да — всё, что отправляет device id с запросом к протокольным эндпоинтам, становится MAU на этот месяц. В том числе curl с query-параметром deviceId и каждый запуск release-сборки в эмуляторе.

Где посмотреть, сколько лимита уже использовано?

В двух местах: вкладка Обзор приложения (число устройств этого приложения за текущий месяц относительно лимита аккаунта) и страница Оплата портала (сумма по всем приложениям, а также тариф и дата окончания периода).