13 минут уншина Subscription Billing Portal Laravel

Byl өөрийнхөө сарын төлбөрийг Byl-ээр авдаг. Одоо танд ч нээлттэй.

Монголд автомат суутгал байхгүй. Тэгвэл давтагдах төлбөрийг яаж бодитоор ажиллуулах вэ — бид өөр дээрээ туршсан хариултаа Subscription модуль болгож нээлээ.

Бидэнд байнга ирдэг нэг асуулт бий:

«Та бүхэн мерчантуудаасаа сарын багцын төлбөрийг юугаар авдаг вэ?»

Хариулт нь энгийн: Byl-ээр.

Та Byl-ийн Billing хуудсан дээр багц сонгоод төлөхөд тэр төлбөр Byl-ийн өөрийнх нь checkout API-аар дамждаг. Төлбөр төлөгдөхөд Byl-д өөр дээрээ webhook ирдэг, тэр webhook таны эрхийг сунгадаг. Хугацаа дуусахаас 7 хоногийн өмнө сануулга илгээгддэг. Дуусмагц эрх хаагддаг.

  1. Мерчант багDashboard → Billing
  2. Hosted checkoutByl-ийн өөрийн API
  3. Webhookcheckout.completed
  4. Эрх сунгагдавends_at + N сар
  5. Сануулга и-мэйлдуусахаас 7 хоногийн өмнө
Byl-ийн өөрийн давтагдах орлого яг энэ гогцоон дээр ажилладаг.

Энэ бол dogfooding — өөрийн бүтээсэн хэрэгслээ өөрөө хэрэглэх. Бидний давтагдах орлого хэдэн жилийн турш яг ийм гогцоон дээр ажиллаж ирсэн. Сунгалтын хугацааг хаанаас тоолох, үлдсэн хоногийг яаж кредит болгох, багц ахиулахад хэдийг хасах, сануулгыг хэзээ илгээж хэзээ илгээхгүй байх — эдгээрийг бид өөр дээрээ туршиж, өвдөж, зассан.

Тэр логик өнөөдрийг хүртэл манай дотоод код байсан.

Одоо тэр нь бүтэн модуль болж, API, Billing Portal, Laravel SDK-ийн хамт нээлттэй болж байна.

Юуны тухай ярьж байна вэ

Хэрэв та сар бүр давтагддаг зүйл зардаг бол — контентын эрх, гишүүнчлэл, SaaS багц, онлайн сургалт, түрээс — таны бизнесийн жинхэнэ асуудал нь төлбөр авах биш. Хэн хэзээ дуусахыг мэдэх, сануулах, хаах явдал.

Бид энэ зовлонг манай хэрэглэгчид дээр өдөр тутам хардаг. Хоёр жишээ:

Манга/манхуа орчуулгын хуудас. 800 гишүүн, сард 5,000₮. Гишүүн бүр «төлсөн шүү» гээд Messenger-т зураг тавьдаг. Админ хүн зураг бүрийг хараад эрхийг нь нээдэг. Сар шинэ болоход тэр 800 хүн дахин эхнээсээ дамжина.

Жижиг SaaS. 60 харилцагч. Хэн нь дуусаад хэн нь үргэлжлүүлж байгааг тод мэдэхгүй. Дуусчихсан 6 харилцагчийн эрх 2 сар нээлттэй үлдсэн — учир нь тэр 6 хүнийг хэн ч мартчихсан.

Хэрэглэгч 10 байхад энэ асуудал биш. 300 болоход энэ нь ажил. 800 болоход энэ нь бүтэн хүний цалин.

Byl-гүй бол Byl хийхэд
Хэн хэзээ төлсөн, хэзээ дуусахыг та өөрөө санаж явна Мөчлөг, төлбөрийн түүх самбарт өөрөө бүртгэгдэнэ
Сар бүр хүн нэг бүрд мессеж бичиж сануулна Сануулга и-мэйлээр өөрөө явна — та юу ч дарахгүй
Хэнийх нь дууссаныг мартаж эрхийг нь хаахгүй үлдээнэ Хугацаа дуусмагц статус өөрчлөгдөж, танд webhook ирнэ
Сунгах, багц солих хүсэлт бүр чат руу ирнэ Хэрэглэгч portal дээрээ өөрөө сунгаж, багцаа солино
Хэрэглэгч олших тусам ажил шугаман нэмэгдэнэ Мянган багц ч нэг багцтай ижил хэмжээний ажил

Яагаад Stripe-ийн кодыг шууд хуулж болохгүй вэ

Stripe, Paddle, Lemon Squeezy — бүгд нэг таамаглал дээр босгогдсон: картын мэдээллийг хадгалж, мөчлөг дуусахад автоматаар суутгах эрх байна. Тэр таамаглал ажилладаг учраас гадаадын SaaS-ууд «subscription» гэдгийг «мартаад байж болох орлого» гэж ойлгодог.

Монголд тэр боломж огт байхгүй биш — карт холбоод давтан төлбөр татдаг үйлчилгээ байдаг, ажилладаг. Гэхдээ хэрэглэгчийн зан төлөв одоогоор тийшээ суугаагүй байна. Ихэнх хүн гүйлгээ бүрээ өөрөө хараад, өөрөө батлахыг илүүд үздэг: QPay, SocialPay, Pocket — аппаа онгойлгож, QR уншиж, push дээр дарж батална. Тэгэхээр «карт хадгалаад чимээгүй суутгана» гэсэн таамаглал дээр бүтэн бүтээгдэхүүн барих нь өнөөдрийн Монголд эрсдэлтэй.

Гол хэсэг нь энд: тийм гэдгээс болж «автомат subscription» гэж нэрлээд, цаана нь хүн нэг бүрд мессеж бичээд сууж байдаг хуурамч шийдэл гаргах шалтгаан болохгүй.

Бид өөр замыг сонгосон. Түүнийг request-to-pay гэж нэрлэдэг: суутгалыг автоматжуулах боломжгүй бол бусад бүхнийг автоматжуулах.

Гадаадын модель — auto-charge
  1. Карт хадгална
  2. Мөчлөг дуусна
  3. Системээс автоматаар суутгана
  4. Эрх сунгагдана
Byl — request-to-pay
  1. Мөчлөг дуусах дөхнө
  2. Byl сануулга өөрөө илгээнэ
  3. Хэрэглэгч 1 даралтportal дээр
  4. Эрх сунгагдана

Ялгаа нь нэг даралт. Түүнээс өмнөх, түүнээс хойшхи бүх зүйл — мөчлөгийн тоолол, сануулгын хуваарь, кредитийн тооцоо, статусын шилжилт, эрх хаах webhook — Byl дээр автоматаар болно.

Ил цагаанаар: нэг даралт нь conversion-д тэг биш. Гэхдээ сар бүр 800 мессеж бичихийн эсрэг тавибал энэ бол таны хамгийн хямд асуудал.

Хэрхэн ажилладаг вэ

Дөрөвхөн алхам.

1. Давтагдах үнэ үүсгэнэ. Бүтээгдэхүүндээ сар эсвэл жилийн давтамжтай үнэ нэмнэ. Хэдэн ч багц, хэдэн ч үнэ байж болно.

2. Хэрэглэгч багц авна. Давтагдах үнэтэй checkout төлөгдмөгц subscription өөрөө үүсч, харилцагчид холбогдоно. subscription.created webhook танд ирнэ. Хэрэглэгч рүү portal линктэй, таны брэндтэй и-мэйл очно.

3. Byl сануулна. Мөчлөг дуусахаас өмнө хэрэглэгч рүү и-мэйл, танд subscription.renewal_due webhook явна.

4. Та зөвхөн эрхээ удирдана. Үүсэх, сунгах, солих, цуцлагдах бүрд webhook ирнэ. Танай систем зөвхөн эрх нээх, хаахаа шийднэ.

Багцын мөчлөгийн бүтэн зураг

  1. trialingтуршилт
  2. activeидэвхтэй
  3. past_dueхожимдсон
  4. canceledэрхийг ЭНД хаана
trialing → active туршилт дуусахад төлсөн · active → active сунгалт (subscription.renewed) · active → past_due зөвхөн grace period тохируулсан бол · past_due → active хожимдож төлсөн · → canceled хугацаа дуусахад төлөөгүй

Статус дөрөв. Гэхдээ таны кодод хэрэгтэй дүрэм ганцхан:

Статус Эрхтэй эсэх Тайлбар
trialing ✅ Тийм Туршилтын хугацаа
active ✅ Тийм Идэвхтэй, мөчлөг дуустал
past_due ✅ Тийм Хожимдсон, гэхдээ хүлээлтийн хугацаанд
canceled ❌ Үгүй Зөвхөн энд эрхийг хаа

subscription.canceled ирэх хүртэл эрхийг нээлттэй байлга. Ингэснээр «төлчихсөн хүний эрх хаагдчихлаа» гэсэн чат таньд хэзээ ч ирэхгүй.

Сануулга хэзээ явдаг вэ

Мөчлөг Сануулга явах өдрүүд
Сарын багц Дуусахаас 7 хоног, 1 хоногийн өмнө
Жилийн багц 30, 7, 1 хоногийн өмнө

Эдгээр нь зөвхөн стандарт хуваарь — бүтээгдэхүүн тус бүрдээ өөрөө тохируулж болно. Цуцлалт хүссэн хэрэглэгч рүү сануулга явахгүй (хэн ч цуцалсныхаа дараа «сунга» гэсэн и-мэйл авах дургүй).

Billing Portal — хамгийн дуу чимээгүй, гэхдээ хамгийн үнэтэй хэсэг

Хэрэв энэ нийтлэлээс нэг л зүйл сонгож авах бол — энэ хэсгийг ав.

Billing Portal нь таны хэрэглэгч багцаа өөрөө удирддаг хуудас. Byl данс шаардлагагүй, нууц үг шаардлагагүй. Хандалт нь түр хугацааны session линкээр хийгддэг тул алдагдсан линк ч аюул биш.

  1. Хэрэглэгч таны апп дээр «Миний багц» дарна
  2. Таны сервер POST /billing-portal/sessions дуудна
  3. Byl url + expires_at буцаана (30 минут хүчинтэй)
  4. Таны апп хэрэглэгчийг тэр URL руу чиглүүлнэ
  5. Хэрэглэгч portal дээр сунгана / багцаа солино / цуцална
  6. Byl танд subscription.* webhook илгээнэ

Portal-ийн линк хэрэглэгчид гурван замаар хүрнэ:

Зам Хэзээ
Byl автоматаар Багц үүсэх, сунгалт дөхөх, цуцлагдах бүрд и-мэйлээр өөрөө явна
Таны аппликэйшнээс «Миний багц» товч — session үүсгээд чиглүүлнэ
Удирдлагын буланд Support-ийн үед харилцагчийн хуудаснаас 24 цагийн линк үүсгээд гардуулна

Дээр нь: хугацаа дууссан линкээр орсон хэрэглэгчид шинэ линкийг өөрийн и-мэйл рүү нь илгээх боломж portal дээр өөрөө санал болгогдоно. Линк хэзээ ч бүрэн «үхдэггүй» — тэгэхээр support-ийн чат таньд орж ирэхгүй.

Portal дээр хэрэглэгч юу хийж чадах вэ:

Үйлдэл Дэлгэрэнгүй
Төлөв харах Багц, үнэ, статус, дуусах хугацаа, үлдсэн хоног
Сунгах Хэдэн мөчлөгөөр сунгахаа сонгоод төлнө (сарын багц 1–12 сар, жилийн 1–3 жил)
Багц солих Төслийн бусад багцууд жагсаалтад өөрөө гарна; үлдсэн хоног кредит болно
Цуцлах / буцаах Цуцлах хүсэлт өгөх, мөчлөг дуусахаас өмнө буцаах
Дахин авах Цуцлагдсан багцаа шинээр эхлүүлэх
Төлбөрийн түүх Өмнөх мөчлөгүүдийн төлбөрүүд

Portal болон түүнээс явах бүх и-мэйл таны брэндээр (нэр, лого, өнгө) харагдана. Хэрэглэгч тань Byl-ийг хардаггүй — таныг хардаг.

Stripe-ийн Customer Portal яг ижил зарчмаар ажилладаг: «сунгах, солих, цуцлах»-ыг мерчант биш, хэрэглэгч өөрөө хийдэг байх. Ялгаа нь тэдэнд хэрэглэгч картаа солидог, манайд хэрэглэгч төлбөрөө батладаг. Монголын нөхцөлд зөв хувилбар нь энэ.

Тоогоор яривал: 300 харилцагчтай үйлчилгээ сард дунджаар хэдэн сунгалт, багц солилт, цуцлалтын хүсэлт авдаг вэ? Тэр бүхэн одоо танай Messenger-т биш, portal дээр болно.

Бусад шийдлээс ялгаатай 8 зүйл

1. Үлдсэн хоног хэзээ ч алдагдахгүй. Сунгалт нь одоогийн дуусах хугацаан дээр нэмэгддэг. Хэрэглэгч дуусахаас 10 хоногийн өмнө төлсөн бол тэр 10 хоног ханддаггүй. Энэ нь эрт төлөхийг шийтгэхгүй байх гэсэн үг.

2. Багц солиход кредитийг Byl тооцно. Starter-аас Growth рүү дундуур шилжихэд одоогийн мөчлөгийн үлдсэн хоногийн үнэ шинэ дүнгээс автоматаар хасагдана. Та зөрүүг нь өөрөө тооцоолж, буцаан олгож суух шаардлагагүй. (Кредит нь checkout үүсэх мөчид тооцогддог тул тэр checkout 24 цагийн дотор төлөгдөх ёстой.)

3. Хүлээлтийн хугацаа (grace period) таны шийдэх зүйл. Бүтээгдэхүүн бүрдээ тохируулбал төлбөр хожимдсон хэрэглэгчийн эрх шууд таслагдахгүй, эхлээд past_due төлөвт шилжинэ. Цалин 10-нд гардаг улс орондоо энэ жижиг тохиргоо churn-д бодитой хэмжээгээр нөлөөлнө.

4. Буцаан татах (win-back) и-мэйл. Эрх дууссанаас хойш (стандартаар 7 хоногийн дараа) хэрэглэгч рүү нэг л удаа «эргэж ирээрэй» и-мэйл явна. Дахин дахин явахгүй, spam болохгүй. Хүсэхгүй бол бүтээгдэхүүн дээрээ унтраа.

5. Туршилтын хугацаа. 1–365 хоногийн үнэгүй trial. Нэг харилцагч нэг бүтээгдэхүүн дээр нэг л удаа авна — өөр и-мэйлээр дахин дахин trial цуглуулах цоорхой байхгүй.

6. Цуцлалт мөчлөгийн төгсгөлд хэрэгжинэ. Цуцалсан хэрэглэгчийн эрх төлсөн хугацаа дуустал нээлттэй. Санаагаа өөрчилвөл дуусахаас өмнө буцааж болно. Энэ нь «цуцалчихсан ч эргэж ирдэг» хүмүүсийг таньд эргүүлж авчирдаг зам.

7. Орлого тань манай данснаас дамждаггүй. Byl гүйлгээний шимтгэл 0% авдаг — төлбөр тань шууд танай банкны данс руу орно. Сувгуудын өөрсдийн ~1% шимтгэл нь аль ч системд адилхан үйлчилдэг, тэр нь Byl-д биш, сувагт очдог. Тэгэхээр давтагдах орлого хэдэн дахин өссөн ч Byl-д төлөх дүн тань өөрчлөгдөхгүй.

8. Test горимд бүгд үнэгүй. Холболтоо бүрэн туршиж, урсгалаа харж, багцын хязгаар ч шалгагдахгүйгээр өнөөдөр тестээ дуусгаад болно.

Холбоход хэр хугацаа зарцуулах вэ

Хэрэв та Byl-ийн checkout-ыг аль хэдийн холбочихсон бол — бараг ажил байхгүй. Ердийн checkout руу давтагдах үнэ өгөхөд л subscription болно.

curl -X POST https://byl.mn/api/v1/projects/$BYL_PROJECT_ID/checkouts \
    -H "Authorization: Bearer $BYL_TOKEN" \
    -H 'Content-Type: application/json' \
    -d '{
          "customer_id": 12,
          "success_url": "https://example.mn/subscribe/success",
          "items": [
              { "price": "starter_monthly", "quantity": 1 }
          ]
      }'

Ердийн checkout-оос хоёрхон ялгаа: customer_id заавал, item нэг байна. Тэгээд болоо — төлөгдмөгц багц үүснэ.

Laravel бол бүр хялбар

Манай Laravel SDK нь Cashier-ийн Billable trait-тэй бараг ижил интерфэйс өгдөг:

// Багц эхлүүлэх — recurring checkout буцаана
return $user->newSubscription('starter_monthly')->checkout();

// Үнэгүй туршилт
$user->newSubscription('starter_monthly')->startTrial(14);

// Эрхийн шалгалт — сүлжээнд гардаггүй
if ($user->subscribed()) {
    // ...
}

// Багц удирдах
$subscription = $user->bylSubscription();
return $subscription->renewCheckout(3);                // 3 мөчлөгөөр сунгах
return $subscription->swapCheckout('growth_monthly');  // багц солих (кредиттэй)
$subscription->cancel();
$subscription->resume();

$user->subscribed() шалгалт сүлжээнд гардаггүй — багцууд локал byl_subscriptions хүснэгтэд хадгалагдаж, webhook ирэх бүрд автоматаар шинэчлэгддэг. Тэгэхээр middleware дотор ч, blade дотор ч чөлөөтэй дуудаж болно.

Cashier-ээс шилжиж байгаа бол:

Cashier Byl SDK
$user->subscribed() $user->subscribed()
$user->subscription() $user->bylSubscription()
->trialDays(14)->create() $user->newSubscription('...')->startTrial(14)
$subscription->swap($price) $subscription->swapCheckout($price)
$subscription->renewCheckout($cycles)

Laravel биш бол ч зүгээр — REST API, webhook хоёр л хэрэгтэй. PHP, Node, Python, Go, Kotlin, Dart — аль ч хэлнээс ердийн HTTP хүсэлт.

Багцын хувьд юу мэдэх хэрэгтэй вэ

Subscription боломж Starter багцаас ажиллана:

Starter — 19,000₮/сар Growth — 39,000₮/сар
Идэвхтэй subscription 30 Хязгааргүй
Гүйлгээ / сар 1,500 15,000
Зэрэг ажиллах төсөл 1 3

Жилээр төлбөл 10 сарын үнээр авна — 2 сар үнэгүй.

Шударгаар: 30 хүртэл тогтмол харилцагчтай бол Starter хангалттай. Гэхдээ бодит тоог нэг харцгаая — сард 5,000₮-ийн гишүүнчлэл зарж байгаа 30 харилцагчтай хуудас сард 150,000₮ давтагдах орлоготой. Тэр үед Growth-ийн 39,000₮ нь сануулга бичиж өнгөрүүлсэн цаг, мартагдсан хэрэглэгчдийн алдагдал, орсон-гарсныг тоолж байсан шөнөнөөс хамаагүй хямд.

Хамгийн гол нь: давтагдах орлого нь өсөх тусам таамаглах боломжтой болдог. Ирэх сард хэдэн төгрөг орохыг та эхний өдрөөс мэдэж байх нь бизнесийг бүхэлдээ өөр байдлаар барих боломж юм.

Test горим үнэгүй тул холболтоо өнөөдөр эхлүүлээд, live руу гарахдаа шийдвэрээ гаргаж болно.

Дараагийн алхам

  1. Одоо туршаад үзээрэй — тест горимдоо бүтээгдэхүүн үүсгээд, сарын давтамжтай үнэ нэмээд, checkout үүсгэ. 15 минут.
  2. Portal-ийг өөрөө нэг үзээрэй — багц үүсэхэд ирэх и-мэйл дээрх линкээр орж, хэрэглэгчийнхээ хардаг зүйлийг хар.
  3. Webhook-оо холбоsubscription.canceled дээр эрх хаадаг кодоо бич. Энэ бол таны бичих ёстой цорын ганц хатуу логик.

Дэлгэрэнгүй баримт: Subscription API · Billing Portal · Laravel SDK

Асуулт байвал шууд бичээрэй. Энэ модулийг бид өөр дээрээ хэрэглэдэг тул ямар ч асуултад дүр эсгэлгүй, бодит туршлагаас хариулж чадна.


Хамгийн сайн давтагдах орлого бол таны мартсан ч ажилладаг орлого юм.

Тест горимд үнэгүй туршина Бүртгүүлээд бодит сувгаар гүйлгээ хийж үзээрэй.
Үнэгүй эхлэх