# Жазылымдық бизнеске

> Жазылым — счётты кестеге сай автоматты шығару, ақша клиенттің шотынан өздігінен шешілмейді. Қайталау сатысы, өткізіп алу саясаты, pause/resume, ескерту және есеп.

## Қысқаша

Жазылым дегеніміз — **счётты кестеге сай автоматты шығару**. Белгіленген күн келгенде жүйе клиентке жаңа счёт жасайды, клиент оны Kaspi-де **өзі растайды**. Ақша клиенттің шотынан өздігінен шешілмейді. Бұл техникалық жағынан да, заңды жағынан да солай: Kaspi QR төлемі клиенттің әр жолғы растауын талап етеді, ал біз кассир рөлі арқылы жұмыс істейміз — бізде клиенттің шотына қол жеткізу мүмкіндігі жоқ және болмайды.

Сондықтан жазылымдық бизнесті құрғанда басты сұрақ басқаша қойылады: **клиентті әр айда төлеуге қалай ыңғайлы етесіз**, ал төлемегендерге не істейсіз.

## Не автоматтандырылады, не автоматтандырылмайды

| Не | Автоматты ма |
|---|---|
| Счёт шығару | Иә, кестеге сай |
| Клиентке счёт жету | Иә, телефонға счёт болса Kaspi-ге push келеді |
| Төлемді растау | **Жоқ.** Клиент өзі растайды |
| Төленбесе қайта жіберу | Иә, қайталау сатысы бойынша |
| Қолжетімділікті ашу/жабу | Сіздің жағыңызда, webhook бойынша |

Бұл ұстанымды клиентке де түсіндіріп қойған дұрыс: «ай сайын Kaspi-ге счёт келеді, растап қоясыз». Күтпеген жерден ақша шешіліп кетті деген шағым да болмайды — бұл жағынан бұл схема тіпті ыңғайлы.

## Жұмыс схемасы қадамдап

| Қадам | Кім | Не болады |
|---|---|---|
| 1 | Сіз | Клиентке жазылым жасайсыз: сома, аралық, бастау күні |
| 2 | Qut Pay | Кезек келгенде счёт шығарады |
| 3 | Клиент | Kaspi-де растайды |
| 4 | Qut Pay | Сіздің адреске `invoice.paid` оқиғасын жібереді |
| 5 | Сіздің сервер | Қолжетімділікті келесі кезеңге ұзартады |
| 6 | Төленбесе | Қайталау сатысы бойынша қайта шығарылады |
| 7 | Саты бітсе | Кезек тасталады, кесте келесі айға жалғасады |

## Аралық және кесте

Аралықтар: `day`, `week`, `month`. Оларға кратность қосылады — `every` өрісі. Мысалы `month` + `every: 3` деген тоқсан сайын деген сөз.

Жазылым да қай кассир арқылы жасалғанын есте сақтайды. Кассир ауысса, оны ескеріңіз.

Толық өрістер мен әдістер: [Жазылым API](/kb/subscriptions-api).

## Қайталау сатысы

Клиент счётты бірден растамаса, жүйе оны қайта шығарады. Қанша рет және қандай аралықпен — `retryDelaysMin` өрісінде, минутпен.

**Әдепкі мәні: `[15, 60, 360]`** — яғни 15 минуттан кейін, сосын бір сағаттан кейін, сосын алты сағаттан кейін. Ең көбі 5 мән бере аласыз.

Саты аяқталғанда сол кезек тасталады, бірақ жазылым өлмейді — кесте келесі кезеңге жалғасады. Жазылымда `failedRuns`, `lastError` және `lastRunStatus` өрістері сақталады, олардан не болғанын көресіз.

Сатыны таңдау:

| Бизнес | Ұсыныс | Себебі |
|---|---|---|
| Спортзал, курс | `[60, 720, 1440]` | Клиент асықпайды, күндіз-түні мазалаудың қажеті жоқ |
| SaaS, қызмет | `[15, 60, 360]` | Әдепкі, жеткілікті |
| Жеткізу, тағам | `[10, 30, 60]` | Күн ішінде шешілуі керек |

Тым жиі қайталау клиентті мазалайды: Kaspi-ге қайта-қайта счёт келеді.

## Өткізіп алу саясаты

Кезек өз уақытында жүрмей қалатын жағдай болады (жазылым тоқтатылып тұрған, байланыс үзілген, техникалық үзіліс). Ондайда не істеу керегін `misfirePolicy` шешеді:

| Мән | Не болады |
|---|---|
| `run_once` (әдепкі) | Өткізіп алған кезек бір рет жіберіледі |
| `skip` | Өткізіп алған кезек тасталады, келесісін күтеді |

`misfireAfterMin` — кезек қанша кешіксе «өткізіп алынды» деп саналады. Әдепкі мәні `1440` минут, яғни тәулік.

Қайсысын таңдау: айлық абонемент болса `run_once` дұрыс (клиент бәрібір сол айға төлеуі керек). Күнделікті жеткізу болса `skip` дұрыс — өткен күннің тамағы үшін счёт шығарудың мәні жоқ.

## Тоқтату, жалғастыру және catchUp

- `POST /api/v1/subscriptions/{id}/pause` — уақытша тоқтату. Клиент демалысқа кетсе, ауырып қалса.
- `POST /api/v1/subscriptions/{id}/resume` — жалғастыру.
- `POST /api/v1/subscriptions/{id}/resume` денесінде `{ "catchUp": true }` — жалғастырумен қатар өткізіп алған кезекті **бірден** жібереді.

`catchUp` абайлап қолданыңыз: ұзақ тоқтап тұрған жазылымда ол клиентке бірнеше счётты бірден жіберіп жіберуі мүмкін. Тоқтату ұзаққа созылса, `catchUp` қоспай жалғастырыңыз да, өткен кезең үшін қолмен бір счёт шығарыңыз.

## Клиентке алдын ала ескерту

Бұл — жазылымдық бизнестегі ең пайдалы әдет, әрі оны толығымен өзіңіз істейсіз. Счёт шығатын күннен бір-екі күн бұрын клиентке хабарлама жіберіңіз:

> «Ертең абонементіңіздің төлем счёты Kaspi-ге келеді, сомасы 12 000 ₸. Растап қойсаңыз, қолжетімділік үзілмейді.»

Не береді:

- Клиент дайын болады, счёт «күтпеген жерден» келмейді
- Бірінші қайталауға дейін-ақ төлейді
- Тоқтатқысы келсе, алдын ала айтады — сіз босқа счёт шығармайсыз

Хабарламаны WhatsApp, SMS немесе өз қосымшаңыз арқылы жіберіңіз. Telegram ботын қоссаңыз, өзіңіз де жазылым оқиғаларын көріп отырасыз.

## Есеп

Webhook арқылы келетін оқиғалар: `subscription.created`, `subscription.status`, ал әр счёт бойынша әдеттегі `invoice.created`, `invoice.paid`, `invoice.expired`.

Не бақылау керек:

| Көрсеткіш | Қайдан аласыз |
|---|---|
| Бірінші жолы төлегендер үлесі | `invoice.paid` пен `invoice.created` арақатынасы |
| Қайталауға дейін кеткендер | Қай кезек нөмірінде төленгенін өзіңіз белгілеп отырыңыз |
| Мүлдем төлемегендер | `failedRuns` өскен жазылымдар |
| Айлық кіріс | Кабинеттегі Счёттар бөлімі, CSV экспорт |

CSV-ды бухгалтерияға беру: [CSV экспорт және есеп](/kb/csv-export).

## Кодсыз нұсқасы бар ма

Ішінара. Жазылымды кабинеттің **Жазылымдар** бөлімінен қолмен жасауға болады — әзірлеуші керек емес. Ал webhook арқылы қолжетімділікті автоматты ашу үшін сервер керек.

Клиент саны аз болса (20-30 адам), webhook-сыз да жұмыс істейді: төлемдерді кабинеттен көріп, қолжетімділікті қолмен жүргізесіз. Тұрақты сома болса, [төлем сілтемесі](/kb/payment-links) де жарайды — клиент айына бір рет сол сілтемені ашады.

## Ерекше ескертулер

- **Жазылым — счёт шығару кестесі, автоматты есептен шығару емес.** Маркетингте де осылай жазыңыз, әйтпесе клиент алданғандай сезінеді.
- **Сома өзгерсе, жазылымды жаңартыңыз.** Ескі сомамен счёт шығып кетуі мүмкін.
- **Айлық лимитті есептеңіз.** 500 жазылымшы × ай сайын 1 счёт + қайталаулар — тарифке сыюы керек: [Қай тарифті таңдау керек](/kb/tariff-choose).
- **Кассир байланысы үзілсе, кезектер шықпайды.** Telegram ботын қосып қойыңыз, бірден білесіз.
- **Счёт шықпай жатса** себебін осы жерден қараңыз: [Жазылым бойынша счёт шықпай жатыр](/kb/subscription-not-running).

## Жиі қойылатын сұрақтар

**Клиенттен әр ай сайын растауды сұрамай-ақ ақшаны алуға бола ма?** Жоқ. Бұл схемада мүмкін емес — клиент әр төлемді Kaspi қосымшасында өзі растайды.

**Клиент растамай қойса, қолжетімділікті қашан жабамын?** Өзіңіз шешесіз. Жиі кездесетін тәжірибе: қайталау сатысы біткеннен кейін 1-3 күн «жеңілдік мерзімі», сосын жабу.

**Жылдық абонемент сатсам, жазылым керек пе?** Жоқ. Жылына бір рет төлейтін болса, жай ғана бір счёт шығарыңыз.

**Клиент тоқтатқысы келсе не істеймін?** Жазылымды `pause` немесе мүлдем тоқтатасыз. Ол Kaspi-де ештеңе өшірудің қажеті жоқ — біздің жақтан счёт шықпаса болды.

**Спортзалға немесе онлайн мектепке нақты қалай құрамын?** Сол салаларға арналған бөлек мақалалар бар: [Спортзал мен фитнеске](/kb/for-gym), [Онлайн мектеп пен курс платформасына](/kb/for-education-online).
