Stripe দিয়ে সাবস্ক্রিপশন কীভাবে যোগ করবেন: প্ল্যান, ট্রায়াল, ওয়েবহুক ও ব্যর্থ পেমেন্ট
Stripe দিয়ে সাবস্ক্রিপশন যোগ করতে Stripe Dashboard-এ একটি পুনরাবৃত্ত দামসহ প্রোডাক্ট তৈরি করুন, আপনার সার্ভার থেকে গ্রাহকদের Stripe Checkout-এর subscription mode-এ পাঠান, আর একটি ওয়েবহুক আপনার অ্যাপকে জানাক প্রতিটি পেমেন্ট কখন সফল, ব্যর্থ, পরিবর্তিত বা শেষ হয়। সাবস্ক্রিপশনের অবস্থা ব্যবহারকারীর সঙ্গে সংরক্ষণ করুন এবং সেখান থেকে অ্যাক্সেস দিন, সফলতার পেজ থেকে নয়। একটি Manage billing বাটন যোগ করুন যা Stripe-এর হোস্টেড কাস্টমার পোর্টাল খোলে, যাতে মানুষ কার্ড বদলাতে, প্ল্যান পরিবর্তন করতে ও বাতিল করতে পারে — এসব পর্দা আপনাকে বানাতে হয় না।
এই গাইড কীভাবে আপনার অ্যাপে পেমেন্ট যোগ করবেন-এর ওপর দাঁড়িয়ে, যেখানে একবারের Checkout, টেস্ট মোড ও লাইভ যাওয়া আলোচিত হয়েছে। এখানে আমরা পুনরাবৃত্ত বিলিংয়ের আলাদা দিকগুলোতে মনোযোগ দিচ্ছি। Stripe-এর বিবরণ ২০২৬ সালের সেপ্টেম্বর পর্যন্ত Stripe-এর ডকুমেন্টেশন অনুযায়ী।
সাবস্ক্রিপশন কেন একবারের পেমেন্টের চেয়ে কঠিন
একবারের পেমেন্ট ঘটে যখন গ্রাহক আপনার অ্যাপে থাকেন। সাবস্ক্রিপশন গ্রাহক চলে যাওয়ার পরেও চলতে থাকে: প্রতি মাসে রিনিউয়াল, মেয়াদ-উত্তীর্ণ হওয়া কার্ড, চক্রের মাঝখানে আপগ্রেড, এবং বাতিল যা সময়সীমার শেষে কার্যকর হয়। আপনার অ্যাপ এগুলো শুধু ওয়েবহুকের মাধ্যমে জানে। বেশিরভাগ সাবস্ক্রিপশনের বাগ আসে প্রথম পেমেন্টকে পুরো গল্প ধরে নেওয়া থেকে।
আপনার বিকল্পগুলো
| পদ্ধতি | আপনি কী বানান | কীসের জন্য ভালো |
|---|---|---|
| Payment Link পুনরাবৃত্ত দামসহ | শুধু একটি লিংক | চাহিদা যাচাই; অ্যাক্সেস হাতে সামলানো |
| Checkout (subscription mode) + কাস্টমার পোর্টাল | একটি সার্ভার রুট, একটি ওয়েবহুক, একটি বিলিং বাটন | বেশিরভাগ SaaS অ্যাপ ও সদস্যপদ |
| সাবস্ক্রিপশন API নিজের পেমেন্ট ফর্মসহ | অনেক বেশি: পেমেন্ট UI, প্রমাণীকরণ, পুনঃচেষ্টা | অস্বাভাবিক বিলিং প্রবাহের অ্যাপ |
| Merchant-of-record প্রোভাইডার | Checkout-এর মতোই | বিক্রয় কর সামলাতে চান এমন বিক্রেতারা |
বেশিরভাগ অ্যাপের জন্য Checkout ও পোর্টালই সঠিক সমঝোতা। কর সামলানো নিয়ে চিন্তা থাকলে প্রোভাইডার তুলনা দেখুন Stripe বনাম Paddle বনাম Lemon Squeezy।
আগে Stripe-এ আপনার দাম ঠিক করুন
Stripe-এ একটি প্রোডাক্ট হলো আপনি যা বিক্রি করেন ("Pro plan") এবং একটি দাম হলো কীভাবে চার্জ করেন ("মাসে $20", "বছরে $200")। একটি প্রোডাক্টের একাধিক দাম থাকতে পারে। ঠিক করুন:
- কোন স্তরগুলো অফার করবেন এবং প্রতিটি আপনার অ্যাপে কী আনলক করে
- মাসিক, বার্ষিক, না দুটোই
- ট্রায়াল দেবেন কি না, এবং তার জন্য আগে থেকে কার্ড লাগবে কি না
টেস্ট মোডে প্রোডাক্ট ও দাম তৈরি করুন, এবং তাদের price ID রাখুন; আপনার অ্যাপ সেগুলো উল্লেখ করে। দাম এখনো ঠিক না হয়ে থাকলে কীভাবে একটি SaaS পণ্যের দাম ঠিক করবেন ও ফ্রিমিয়াম বনাম ফ্রি ট্রায়াল পড়ুন।
সাবস্ক্রিপশনের যে জীবনচক্র আপনাকে হ্যান্ডল করতে হবে
Stripe-এর সাবস্ক্রিপশন ওভারভিউ একটি সাবস্ক্রিপশনের সম্ভাব্য অবস্থাগুলোর তালিকা দেয়। অ্যাক্সেসের জন্য সবচেয়ে গুরুত্বপূর্ণগুলো:
| অবস্থা | এর মানে | অ্যাক্সেস দেবেন? |
|---|---|---|
trialing | ট্রায়াল সময়কালে আছে | হ্যাঁ |
active | ভালো অবস্থায় আছে | হ্যাঁ |
incomplete | প্রথম পেমেন্ট এখনো সম্পন্ন হয়নি; Stripe গ্রাহককে ২৩ ঘণ্টা সময় দেয় | না |
incomplete_expired | প্রথম পেমেন্ট কখনো সফল হয়নি | না |
past_due | সর্বশেষ পেমেন্ট ব্যর্থ হয়েছে বা চেষ্টাই হয়নি; পুনঃচেষ্টা হতে পারে | আপনার সিদ্ধান্ত; অনেক অ্যাপ অল্প সময়ের সুবিধা দেয় |
unpaid | পুনঃচেষ্টা শেষ, ইনভয়েস খোলা থাকে, আর কোনো চেষ্টা হয় না | না, Stripe-এর ডকুমেন্টেশন অ্যাক্সেস প্রত্যাহার করতে বলে |
canceled | শেষ হয়েছে; পুনরায় শুরু করা যায় না | না |
paused | একটি ট্রায়াল পেমেন্ট পদ্ধতি ছাড়া শেষ হয়েছে এবং pause করার জন্য সেট ছিল | না |
অবস্থাটি আপনার ব্যবহারকারী বা অ্যাকাউন্ট রেকর্ডে সংরক্ষণ করুন এবং অ্যাক্সেস তার ওপর ভিত্তি করে দিন। প্রাসঙ্গিক ওয়েবহুক আসার প্রতিবার এটি হালনাগাদ করুন।
যে ওয়েবহুক ইভেন্টগুলো হ্যান্ডল করতে হবে
| ইভেন্ট | আপনার অ্যাপ কী করে |
|---|---|
checkout.session.completed | নতুন Stripe customer ও subscription ID আপনার ব্যবহারকারীর সঙ্গে যুক্ত করুন |
invoice.paid | সাবস্ক্রিপশনকে active চিহ্নিত করুন এবং নতুন period end রেকর্ড করুন |
invoice.payment_failed | ব্যবহারকারীকে জানান কার্ড ব্যর্থ হয়েছে এবং পোর্টালের লিংক দিন |
invoice.payment_action_required | ব্যবহারকারীকে কার্ড প্রমাণীকরণ সম্পন্ন করতে বলুন |
customer.subscription.updated | প্ল্যান, অবস্থা এবং কোনো নির্ধারিত বাতিল হালনাগাদ করুন |
customer.subscription.deleted | পেইড অ্যাক্সেস সরান |
customer.subscription.trial_will_end | ট্রায়াল শেষ হওয়ার আগে রিমাইন্ডার দিন; Stripe এটি তিন দিন আগে পাঠায় |
Stripe-এর ওয়েবহুক ডকুমেন্টেশনের হ্যান্ডলার নিয়ম এখনো প্রযোজ্য: কাঁচা বডি ব্যবহার করে স্বাক্ষর যাচাই করুন, দ্রুত 2xx দিন, ডুপ্লিকেট ও ক্রমের বাইরের ইভেন্ট সামলান, এবং পুনঃচেষ্টার জন্য প্রস্তুত থাকুন। ধারণাটি বুঝতে ওয়েবহুক কী গাইড দেখুন, আর নিয়মগুলো বিস্তারিত আছে পেমেন্ট গাইডে।
ধাপে ধাপে
- Stripe টেস্ট মোডে প্রোডাক্ট ও দাম তৈরি করুন।
- সিক্রেট যোগ করুন: সিক্রেট কী, price ID, এবং পরে ওয়েবহুক সাইনিং সিক্রেট। সেগুলো কখনো ফ্রন্টএন্ড কোডে রাখবেন না।
- প্রাইসিং পেজ: প্রতিটি প্ল্যানের বাটন আপনার সার্ভার কল করে, যা লগইন করা ব্যবহারকারীর জন্য subscription mode-এ একটি Checkout Session তৈরি করে। আপনার ব্যবহারকারী ID পাঠান, যাতে ওয়েবহুক পেমেন্টটিকে সঠিক অ্যাকাউন্টের সঙ্গে মেলাতে পারে।
- ওয়েবহুক এন্ডপয়েন্ট: স্বাক্ষর যাচাই করুন এবং ওপরের ইভেন্টগুলো হ্যান্ডল করুন, প্রতি ব্যবহারকারীর জন্য একটিমাত্র সাবস্ক্রিপশন রেকর্ড হালনাগাদ করে।
- সংরক্ষিত অবস্থা ও প্ল্যানের ওপর ভিত্তি করে ফিচার গেট করুন, প্রতিটি সুরক্ষিত কাজে সার্ভারে যাচাই করে, শুধু লুকানো বাটনে নয়।
- কাস্টমার পোর্টাল: Stripe Dashboard-এ এটি কনফিগার করুন (কোন প্ল্যানে বদলানো যাবে, বাতিল করা যাবে কি না), তারপর একটি Manage billing বাটন যোগ করুন, যা সার্ভারে একটি পোর্টাল সেশন তৈরি করে সেখানে রিডাইরেক্ট করে।
- ব্যর্থ পেমেন্ট: Stripe-এর বিলিং সেটিংসে পুনঃচেষ্টার আচরণ ও শেষ পুনঃচেষ্টার পর কী হবে তা বেছে নিন।
past_dueথাকা অবস্থায় অ্যাপে একটি ব্যানার দেখান। - পুরো জীবনচক্র পরীক্ষা করুন, তারপর পাবলিশ করুন এবং লাইভ ওয়েবহুক রেজিস্টার করুন।
আপনার AI বিল্ডারকে দেওয়ার প্রম্পট
Stripe দিয়ে সাবস্ক্রিপশন বিলিং যোগ করো। প্ল্যান: Starter (price ID STRIPE_PRICE_STARTER-এ) ও Pro (STRIPE_PRICE_PRO-তে)। প্রাইসিং পেজ সার্ভারে STRIPE_SECRET_KEY ব্যবহার করে subscription mode-এ একটি Checkout Session তৈরি করে, সঙ্গে লগইন করা ব্যবহারকারীর ID যুক্ত করে। ব্যবহারকারীর ওপর Stripe customer ID, subscription ID, প্ল্যান ও অবস্থা সংরক্ষণ করো। সিক্রেট কী কখনো ব্রাউজারে দেখাবে না।
POST /api/stripe/webhook যোগ করো। STRIPE_WEBHOOK_SECRET দিয়ে কাঁচা রিকোয়েস্ট বডি ব্যবহার করে স্বাক্ষর যাচাই করো। checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.updated, customer.subscription.deleted ও customer.subscription.trial_will_end হ্যান্ডল করো। প্রক্রিয়াকৃত ইভেন্ট ID রেকর্ড করো যাতে ডুপ্লিকেট উপেক্ষা হয়। ইভেন্ট যে ক্রমে আসে তা থেকে নয়, subscription অবজেক্ট থেকে ব্যবহারকারীর অবস্থা হালনাগাদ করো।
সার্ভারে Pro ফিচারগুলো গেট করো: অবস্থা active বা trialing এবং প্ল্যান Pro হলেই অনুমতি দাও। অবস্থা past_due হলে "পেমেন্ট ব্যর্থ, আপনার কার্ড আপডেট করুন" ব্যানার দেখাও। এই ব্যবহারকারীর জন্য Stripe customer portal খোলে এমন একটি Manage billing বাটন যোগ করো।
আপগ্রেড, ডাউনগ্রেড ও প্রোরেশন
গ্রাহক প্ল্যান বদলালে Stripe-এর ডকুমেন্টেশন বলে, পরিবর্তনটি প্রায়ই একটি প্রোরেশন তৈরি করে: বর্তমান বিলিং সময়কালের বাকি অংশে নতুন দাম প্রয়োগ হয়। আপনি প্রোরেশনের পূর্বরূপ দেখতে পারেন বা বন্ধ করতে পারেন। একই ইন্টারভ্যালের প্ল্যান হলে বিলিংয়ের তারিখ একই থাকে; মাসিক থেকে বার্ষিকে গেলে বিলিংয়ের তারিখ বদলের দিনে সরে যায়। গ্রাহকদের পোর্টালে প্ল্যান বদলাতে দিলে এই লজিক লেখার কাজ বাঁচে, তবে পোর্টাল সেটিংসে ঠিক করুন কোন বদল অনুমোদিত।
পরীক্ষার চেকলিস্ট
Stripe টেস্ট মোড ও টেস্ট কার্ড ব্যবহার করুন, এবং প্রতিটি অবস্থা ঘুরে দেখুন:
- নতুন সাবস্ক্রিপশন সঠিক ব্যবহারকারীকে সঠিক প্ল্যান দেয়
- পেমেন্ট করার সাথে সাথেই ব্রাউজার ট্যাব বন্ধ করলেও অ্যাক্সেস থাকে (এটি প্রমাণ করে ওয়েবহুক কাজ করে)
- সাইন-আপে প্রত্যাখ্যাত কার্ড কিছু দেয় না
- ব্যর্থ রিনিউয়াল অ্যাকাউন্টকে
past_due-এ নেয় এবং ব্যানার দেখায় - পোর্টালে কার্ড আপডেট করলে
activeঅবস্থা ফিরে আসে - আপগ্রেড ও ডাউনগ্রেড সঠিকভাবে ফিচার বদলায়
- সময়সীমার শেষে বাতিল করলে শেষ তারিখ পর্যন্ত অ্যাক্সেস থাকে, তারপর সরে যায়
- ট্রায়াল ব্যবহারকারীরা অ্যাক্সেস পায়, রিমাইন্ডার পায়, এবং সঠিকভাবে পেইড হয় বা অ্যাক্সেস হারায়
- একই ওয়েবহুক ইভেন্ট দুইবার পাঠালে কিছু বদলায় না
Stripe-এর টেস্ট ক্লক আপনাকে সময় এগিয়ে যাওয়ার অনুকরণ করতে দেয়, তাই এক মাস অপেক্ষা না করেই রিনিউয়াল পরীক্ষা করা যায়। ক্লক কীভাবে ব্যবহার করবেন তা Stripe-এর বর্তমান টেস্টিং ডকুমেন্টেশনে দেখুন।
সাধারণ ভুল
- সফলতার পেজে অ্যাক্সেস দেওয়া। গ্রাহক পেমেন্ট করতে পারেন কিন্তু সেই পেজে পৌঁছাতে নাও পারেন। ওয়েবহুক ব্যবহার করুন।
- শুধু প্রথম পেমেন্ট হ্যান্ডল করা। রিনিউয়াল, ব্যর্থতা ও বাতিল পরে ইভেন্ট হিসেবে আসে।
- শুধু ফ্রন্টএন্ডে প্ল্যানের অবস্থা যাচাই। যে কেউ সরাসরি আপনার API কল করতে পারে।
- দুর্ঘটনাক্রমে একজন ব্যবহারকারীর অনেক সাবস্ক্রিপশন। নতুন Checkout Session তৈরির আগে বিদ্যমান সাবস্ক্রিপশন আছে কি না দেখুন, বা বিদ্যমান গ্রাহকদের পোর্টালে পাঠান।
- প্রথম ব্যর্থ রিনিউয়ালেই অ্যাক্সেস প্রত্যাহার। কার্ড সাধারণ কারণে ব্যর্থ হয়। একটি সংক্ষিপ্ত গ্রেস পিরিয়ড ও একটি স্পষ্ট ব্যানার গ্রাহক ধরে রাখে।
- লাইভ ওয়েবহুক ভুলে যাওয়া। টেস্ট ও লাইভ এন্ডপয়েন্টের সাইনিং সিক্রেট আলাদা।
- কর ও রিফান্ড উপেক্ষা করা। আপনার রিফান্ড নীতি ঠিক করুন এবং লঞ্চের আগে একজন হিসাবরক্ষকের সঙ্গে আপনার করের দায়বদ্ধতা যাচাই করুন।
Mythex-এ সাবস্ক্রিপশন
Mythex-এ তৈরি অ্যাপ আপনার নিজস্ব Stripe অ্যাকাউন্ট ও কী ব্যবহার করে; আপনার অ্যাপের জন্য একক-ক্লিকে Stripe সংযোগ নেই। আপনার টেস্ট কী ও price ID প্রজেক্ট সিক্রেট হিসেবে যোগ করুন, ওপরের মতো প্রম্পট ব্যবহার করুন, এবং Preview-তে Stripe-এর টেস্ট কার্ড দিয়ে পরীক্ষা করুন। ওয়েবহুকের জন্য আপনার অ্যাপের পাবলিক URL লাগে, তাই Stripe-এ এন্ডপয়েন্ট রেজিস্টার করার আগে পাবলিশ করুন, এবং লাইভ কীতে বদলানোর পর আবার পাবলিশ করুন যাতে লাইভ অ্যাপ সেগুলো গ্রহণ করে। ডক্সে দেখুন Stripe দিয়ে পেমেন্ট গ্রহণ ও আপনার ব্যাকএন্ডে ওয়েবহুক হ্যান্ডল। বৃহত্তর প্রোডাক্টের জন্য, বিলিংয়ের চারপাশে কী বানাতে হবে তা জানতে কীভাবে একটি SaaS MVP বানাবেন দেখুন।
প্রশ্নোত্তর
Stripe দিয়ে সাবস্ক্রিপশন যোগ করার সবচেয়ে সহজ উপায় কী?
Stripe Dashboard-এ একটি পুনরাবৃত্ত দামসহ প্রোডাক্ট তৈরি করুন, গ্রাহকদের subscription mode-এ Stripe Checkout-এ পাঠান, সাবস্ক্রিপশন ইভেন্ট একটি ওয়েবহুক দিয়ে হ্যান্ডল করুন, এবং একটি Manage billing বাটনকে Stripe-এর হোস্টেড কাস্টমার পোর্টালের সঙ্গে যুক্ত করুন। এতে কার্ড ফর্ম ও প্ল্যান বদলানোর পর্দা নিজে বানাতে হয় না।
সাবস্ক্রিপশনের জন্য কোন Stripe ওয়েবহুক ইভেন্টগুলো লাগে?
ন্যূনতম: checkout.session.completed, যাতে নতুন সাবস্ক্রিপশনকে আপনার ব্যবহারকারীর সঙ্গে যুক্ত করা যায়; invoice.paid, যাতে প্রতিটি সফল পেমেন্ট নিশ্চিত হয়; invoice.payment_failed, যাতে ব্যর্থ রিনিউয়ালের সতর্কতা দেওয়া যায়; এবং customer.subscription.updated ও customer.subscription.deleted, যাতে প্ল্যান বদল ও বাতিল ট্র্যাক করা যায়।
সাবস্ক্রিপশনের পেমেন্ট ব্যর্থ হলে কী হয়?
Stripe-এর ডকুমেন্টেশন অনুযায়ী ২০২৬ সালের সেপ্টেম্বর পর্যন্ত, সাবস্ক্রিপশন সাধারণত past_due হয় এবং আপনার সেটিং অনুযায়ী Stripe পেমেন্ট আবার চেষ্টা করতে পারে। শেষ পুনঃচেষ্টার পরে Dashboard সেটিং ঠিক করে দেয় সেটি বাতিল হবে, unpaid চিহ্নিত হবে, নাকি past_due-ই থাকবে।
কার্ড না নিয়েই কি বিনামূল্যের ট্রায়াল দেওয়া যায়?
হ্যাঁ। Stripe ফ্রি ট্রায়াল সমর্থন করে, এবং তার ডকুমেন্টেশন বলে, কার্ড ছাড়া শেষ হওয়া ট্রায়ালের জন্য একটি paused অবস্থার কথা, যদি সেভাবে কনফিগার করা থাকে। আগে থেকে কার্ড নিলে সাধারণত সাইন-আপ কম হয় কিন্তু পেইড গ্রাহক বেশি; আপনার প্রোডাক্টের জন্য কোনটি ভালো তা পরীক্ষা করে দেখুন।