Qut Pay Сайт Кабинет База знаний Инструкции Документация API ҚАЗРУС
ГлавнаяБаза знаний → Для вашего бизнеса

Спортзал и фитнес

Обновлено: 2026-09-14 · Версия в Markdown

Коротко

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

Продажа абонемента

Клиент пришёл на ресепшен и хочет абонемент на три месяца.

  1. Администратор заводит карточку абонемента в CRM или учётной системе.
  2. Система выставляет счёт:
POST /api/v1/invoices
{
  "amount": 45000,
  "kind": "qr",
  "description": "Абонемент 3 месяца, взрослый",
  "externalOrderId": "ABN-2026-1187",
  "metadata": { "client_id": "1187", "plan": "3m", "starts": "2026-09-15" }
}
  1. На экране ресепшена появляется QR, клиент сканирует и платит.
  2. Приходит webhook invoice.paid — система активирует абонемент и выдаёт карту или браслет.

Активируйте абонемент только по invoice.paid, а не в момент создания счёта. Иначе в зал будут ходить те, кто так и не заплатил.

Если клиент покупает удалённо — из Instagram, WhatsApp или с сайта — отправляйте kind: "phone", ему придёт push в Kaspi. Телефон в формате 7XXXXXXXXXX, description не длиннее 60 символов.

Продление

Продление — это новый счёт, отдельного метода API для него нет. Важно другое: когда отправлять и что написать.

ЧтоКак
НапоминаниеСчёт за 3–5 дней до окончания
Типkind: "phone" — клиента нет в зале
Описание«Продление абонемента, октябрь» — чтобы было понятно, за что платят
СвязьВ externalOrderId номер продления, в metadataclient_id и новый срок
Не оплатилиПо окончании срока абонемент закрывается, новый счёт — при следующем визите

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

Ежемесячный платёж через подписку

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

Что настраивается:

Клиент ушёл в заморозку — ставите подписку на pause, вернулся — resume. Нужно сразу догнать пропущенный запуск: POST /subscriptions/{id}/resume с { catchUp: true }.

Подробнее: API подписок и Бизнес по подписке.

Заморозка и возврат

Заморозка. Клиент уехал на две недели. Срок абонемента сдвигаете в своей системе, подписку ставите на pause. На стороне Qut Pay ничего возвращать не нужно, деньги не двигаются.

Возврат. Клиент хочет вернуть абонемент целиком:

POST /api/v1/invoices/{id}/refund
{ "amount": 30000, "reason": "Возврат абонемента, использован 1 месяц" }

Без поля amount вернётся вся сумма. При частичном возврате счёт переходит в статус partially_refunded. Расчёт делаете вы: вычитаете использованные дни и возвращаете остаток — пропорцию Qut Pay не считает.

Берегитесь двойного возврата: Как не вернуть деньги дважды. Если возврат не проходит: Возврат не проходит.

Турникет

Разовый вход можно автоматизировать: клиент сканирует QR, платит, турникет открывается.

Как это устроено:

  1. Экран у турникета (планшет или небольшой монитор) запрашивает счёт у вашего сервера: amount: 2500, metadata: { "gate": "north" }.
  2. На экране показывается qrImageUrl.
  3. Клиент платит.
  4. На ваш сервер приходит webhook invoice.paid. По metadata.gate он понимает, какой это турникет, и отправляет контроллеру команду на открытие.

Подпись webhook проверяйте обязательно: HMAC-SHA256(secret, timestamp + "." + rawBody), причём тело — в неизменном байтовом виде, до разбора JSON. Там, где открывается физическая дверь, это особенно важно: Безопасность вебхуков.

Обработчик должен быть идемпотентным: если вы не ответили 2xx, доставка повторится до 11 раз — турникет не должен открыться одиннадцать раз. Храните пару (invoice.id, status) и игнорируйте повторы.

Место чувствительно к задержке, поэтому вместе с webhook опрашивайте и статус: Вебхук или опрос статуса. Точно такая же схема используется на парковках: Парковки и шлагбаумы.

Вариант без кода

Что учесть заранее

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

При подписке клиенту нужно подтверждать оплату каждый месяц? Да. Подписка выставляет счёт, а оплату клиент подтверждает сам в приложении Kaspi. Деньги сами не уходят.

Что будет, если клиент пропустит месяц? Когда шаги повтора (по умолчанию 15, 60, 360 минут) закончатся, запуск этого месяца отбрасывается, расписание идёт дальше. Закрывать абонемент или нет — решает ваша система.

Нужно ли возвращать деньги при заморозке? Нет. Заморозка — это сдвиг срока в вашей учётной системе, подписку просто ставите на паузу.

Как быстро открывается турникет? После оплаты webhook обычно приходит в пределах 5 секунд. Это зависит от Kaspi и от сети, гарантировать точное время мы не можем — поэтому параллельно опрашивайте статус.

У нас два зала, можно разделить отчётность? Да: каждому залу свой API-ключ, привязанный к своему кассиру: Раздельная отчётность по точкам.

Связанные статьи

Бизнес по подпискеПодписка — это выставление счёта по расписанию, деньги со счёта клиента сами не уходят. Лестница повторов, политика пропусков, pause/resume, напоминания и отчётность.API подписок — счета по расписаниюПодписка выставляет счета по расписанию, а каждую оплату подтверждает сам покупатель. Все поля создания, интервалы, лестница повторов, политика пропуска, методы pause/resume/run и поля состояния.Ссылки на оплату — постоянный адрес для приёма платежейПостоянная ссылка вида qut.kz/p/<slug>: свой адрес, фиксированная и открытая сумма, остановка и возобновление, чем отличается от ссылки на счёт, отчётность по ссылкам и коды ошибок.API возвратов — полный и частичный возвратСправочник по методу POST /invoices/{id}/refund: поля запроса, полный и частичный возврат, ограничение суммы, все коды ошибок, что делать при refund_unknown и какие события приходят после возврата.Парковки и шлагбаумыQR на экране у выезда или счёт по номеру билета, вебхук открывает шлагбаум через IP-реле. Динамический и печатный QR, номер машины в metadata, борьба с задержкой.

Остались вопросы? WhatsApp +77788813333 · kazprose@gmail.com
Написать можно и из кабинета: Поддержка.

Qut Pay — независимый сервис, не аффилирован с АО «Kaspi Bank». Kaspi и Kaspi Pay — товарные знаки их правообладателя.