এই ডকুমেন্টে সাবস্ক্রিপশন লাইফসাইকেল ইভেন্টগুলি, যেমন নবায়ন এবং মেয়াদোত্তীর্ণ, কীভাবে পরিচালনা করতে হয় তা বর্ণনা করা হয়েছে। এটি অতিরিক্ত সাবস্ক্রিপশন বৈশিষ্ট্যগুলিও বর্ণনা করে যেমন প্রচার অফার করা এবং আপনার ব্যবহারকারীদের তাদের নিজস্ব সাবস্ক্রিপশন পরিচালনা করার অনুমতি দেওয়া।
আপনি যদি আপনার অ্যাপের জন্য সাবস্ক্রিপশন পণ্য কনফিগার না করে থাকেন, তাহলে আপনার পণ্য তৈরি এবং কনফিগার করুন দেখুন।
সাবস্ক্রিপশনের ওভারভিউ
সাবস্ক্রিপশন হল একটি পুনরাবৃত্ত লেনদেন যা ব্যবহারকারীদের নির্দিষ্ট এনটাইটেলমেন্ট প্রদান করে। এনটাইটেলমেন্টগুলি এমন কিছু সুবিধার প্রতিনিধিত্ব করে যা ব্যবহারকারীরা একটি নির্দিষ্ট সময়কালে অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ, একটি সাবস্ক্রিপশন একজন ব্যবহারকারীকে প্রিমিয়াম অ্যাক্সেসের জন্য এনটাইটেল করতে পারে।
বেস প্ল্যান এবং অফারের মাধ্যমে, আপনি একই সাবস্ক্রিপশন পণ্যের জন্য একাধিক কনফিগারেশন তৈরি করতে পারেন। উদাহরণস্বরূপ, আপনি এমন ব্যবহারকারীদের জন্য একটি পরিচিতিমূলক অফার তৈরি করতে পারেন যারা কখনও আপনার অ্যাপে সাবস্ক্রাইব করেননি। একইভাবে, আপনি ইতিমধ্যেই সাবস্ক্রাইব করা ব্যবহারকারীদের জন্য একটি আপগ্রেড অফার তৈরি করতে পারেন।
সাবস্ক্রিপশন পণ্য, বেস প্ল্যান এবং অফারগুলির বিস্তারিত সারসংক্ষেপের জন্য, Play Console সহায়তা কেন্দ্রে ডকুমেন্টেশন দেখুন।
প্লে বিলিং লাইব্রেরি নিম্নলিখিত সাবস্ক্রিপশন প্রকারগুলিকে সমর্থন করে:
একক-আইটেম সাবস্ক্রিপশন - এই ধরণের ক্ষেত্রে, একটি এনটাইটেলমেন্টের সাথে সম্পর্কিত একটি আইটেম। উদাহরণস্বরূপ, একটি সঙ্গীত স্ট্রিমিং পরিষেবার সাবস্ক্রিপশন।
অ্যাড-অন সহ সাবস্ক্রিপশন - এই ধরণের ক্ষেত্রে, একটি ক্রয়ে একাধিক স্বতন্ত্র এনটাইটেলমেন্ট থাকতে পারে যা একটি একক ক্রয়ে একত্রিত হয়। উদাহরণস্বরূপ, সঙ্গীত স্ট্রিমিং পরিষেবা এবং একটি ভিডিও সাবস্ক্রিপশন উভয়ের সাবস্ক্রিপশন। অ্যাড-অন সহ সাবস্ক্রিপশন সম্পর্কিত নির্দিষ্ট তথ্যের জন্য, অ্যাড-অন সহ সাবস্ক্রিপশন দেখুন।
প্রিপেইড প্ল্যান ইন্টিগ্রেশন
প্রিপেইড প্ল্যানগুলি মেয়াদ শেষ হওয়ার পরে স্বয়ংক্রিয়ভাবে নবায়ন হয় না । কোনও বাধা ছাড়াই তাদের সাবস্ক্রিপশন এনটাইটেলমেন্ট বাড়ানোর জন্য, ব্যবহারকারীকে একই সাবস্ক্রিপশনের জন্য একটি প্রিপেইড প্ল্যান টপ-আপ করতে হবে।
টপ-আপের জন্য, মূল ক্রয়ের মতোই বিলিং ফ্লো চালু করুন। আপনাকে কোনও ক্রয়কে টপ-আপ হিসেবে উল্লেখ করার প্রয়োজন নেই।
প্রিপেইড প্ল্যান টপ-আপগুলি সর্বদা CHARGE_FULL_PRICE প্রতিস্থাপন মোড ব্যবহার করে এবং আপনাকে এই মোডটি স্পষ্টভাবে সেট করার প্রয়োজন নেই। ব্যবহারকারীকে তাৎক্ষণিকভাবে সম্পূর্ণ বিলিং সময়ের জন্য চার্জ করা হয় এবং টপ-আপে উল্লেখিত সময়কাল অনুসারে তাদের এনটাইটেলমেন্ট বাড়ানো হয়।
টপ-আপের পরে, Purchase ফলাফল অবজেক্টের নিম্নলিখিত ক্ষেত্রগুলি সাম্প্রতিক টপ-আপ ক্রয় প্রতিফলিত করার জন্য আপডেট করা হয়:
- অর্ডার আইডি
- ক্রয়ের সময়
- স্বাক্ষর
- টোকেন কিনুন
- স্বীকৃত
নিম্নলিখিত Purchase ক্ষেত্রগুলিতে সর্বদা মূল ক্রয়ে পাওয়া একই ডেটা থাকে:
- প্যাকেজের নাম
- ক্রয়ের অবস্থা
- পণ্য
- স্বয়ংক্রিয় পুনর্নবীকরণ
প্রিপেইড ক্রয়ের স্বীকৃতি
স্বয়ংক্রিয়ভাবে পুনর্নবীকরণযোগ্য সাবস্ক্রিপশনের মতো, কেনার পরে আপনাকে প্রিপেইড প্ল্যানগুলি স্বীকার করতে হবে। প্রাথমিক ক্রয় এবং যেকোনো টপ-আপ উভয়ই স্বীকার করতে হবে। আরও তথ্যের জন্য, ক্রয় প্রক্রিয়াকরণ দেখুন।
প্রিপেইড প্ল্যানের সময়কাল কম থাকার সম্ভাবনার কারণে, যত তাড়াতাড়ি সম্ভব ক্রয়টি স্বীকার করা গুরুত্বপূর্ণ।
এক সপ্তাহ বা তার বেশি সময়কালের প্রিপেইড প্ল্যানগুলি তিন দিনের মধ্যে স্বীকার করতে হবে।
এক সপ্তাহের কম সময়কালের প্রিপেইড প্ল্যানগুলি প্ল্যানের অর্ধেক সময়ের মধ্যে স্বীকৃতি দিতে হবে। উদাহরণস্বরূপ, ডেভেলপারদের তিন দিনের প্রিপেইড প্ল্যান গ্রহণের জন্য 1.5 দিন সময় থাকে।
কিস্তি সাবস্ক্রিপশন ইন্টিগ্রেশন
কিস্তি সাবস্ক্রিপশন হল এক ধরণের সাবস্ক্রিপশন যেখানে ব্যবহারকারীরা পুরো সাবস্ক্রিপশন ফি আগে থেকে পরিশোধ না করে নির্দিষ্ট সময়ের মধ্যে একাধিক কিস্তিতে সাবস্ক্রিপশনের জন্য অর্থ প্রদান করেন।
কিস্তি সাবস্ক্রিপশনের জন্য অতিরিক্ত বিবেচ্য বিষয়:
- দেশের উপলভ্যতা : কিস্তি সাবস্ক্রিপশন বৈশিষ্ট্যটি কেবল ব্রাজিল, ফ্রান্স, ইতালি এবং স্পেনে উপলব্ধ (সর্বশেষ উপলভ্যতার জন্য কনসোল দেখুন)।
- মূল্য নির্ধারণ : কনসোলে কিস্তি সাবস্ক্রিপশনের মূল্য নির্ধারণ করার সময়, মূল্য মাসিক অর্থপ্রদানের পরিমাণকে প্রতিনিধিত্ব করে। এটি, নির্ধারিত প্রতিশ্রুতি সময়ের সাথে মিলিত হয়ে, ক্রয় স্ক্রিনে সাবস্ক্রিপশনের মোট পরিমাণ তৈরি করে।
- প্রতিশ্রুতির সময়কাল : প্রাথমিক সাবস্ক্রিপশন প্রতিশ্রুতির মোট সময়কাল, যার মধ্যে মাসিক অর্থপ্রদান প্রয়োজন। উদাহরণস্বরূপ, যদি একটি বেস প্ল্যানের 15 মাসের প্রতিশ্রুতির সময়কাল থাকে, তাহলে ব্যবহারকারী এই সময়ের মধ্যে 15 মাসিক অর্থপ্রদান করবেন।
- নবায়ন : কিস্তিতে সাবস্ক্রিপশনের প্রসঙ্গে, "নবায়ন" বলতে একটি প্রতিশ্রুতির সময়কালের সমাপ্তি বোঝায়, হয় প্রাথমিক প্রতিশ্রুতির সময়কাল অথবা পরবর্তী প্রতিশ্রুতির সময়কাল। প্রাথমিক সাইন আপের পরে, সম্পূর্ণ প্রাথমিক প্রতিশ্রুতির সময়কাল সম্পন্ন হওয়ার পরে প্রথম পুনর্নবীকরণ ঘটে। পরবর্তী পুনর্নবীকরণগুলি প্রতিটি পরবর্তী প্রতিশ্রুতির সময়কাল পূরণ হওয়ার পরে ঘটে। কিস্তিতে সাবস্ক্রিপশনের জন্য নবায়নের ধরণগুলি "মাসিক স্বয়ংক্রিয়ভাবে পুনর্নবীকরণ" বা "একই সময়ের জন্য স্বয়ংক্রিয়ভাবে পুনর্নবীকরণ" হতে পারে। "মাসিক স্বয়ংক্রিয়ভাবে পুনর্নবীকরণ" এর জন্য, পরবর্তী কোনও প্রতিশ্রুতি নেই এবং পরিকল্পনাটি একটি মাসিক সাবস্ক্রিপশনের মতো আচরণ করে যেখানে প্রতিটি মাসিক সাবস্ক্রিপশন চার্জ একটি পুনর্নবীকরণ গঠন করে।
- বিলিং পিরিয়ড : কিস্তি সাবস্ক্রিপশনের প্রসঙ্গে, এটি সেই পুনরাবৃত্ত ব্যবধানকে বোঝায় যেখানে বেস প্ল্যানে উল্লেখিত ব্যক্তিগত অর্থপ্রদান করা হয়।
- পরিকল্পনা পরিবর্তন বনাম মূল্য পরিবর্তন আচরণ : মূল্য পরিবর্তন এবং বাতিলকরণের ক্ষেত্রে, প্রতিশ্রুতি দৃঢ়। এর অর্থ হল যদি কোনও ব্যবহারকারী বাতিল করতে চান বা কোনও বিকাশকারী মূল্য পরিবর্তন করতে চান, তবে পরিবর্তনটি প্রতিশ্রুতির সময়কালের শেষে কার্যকর হয়। পরিকল্পনা পরিবর্তনের ক্ষেত্রে, প্রতিশ্রুতি দৃঢ় নয়। এর অর্থ হল পরিকল্পনা পরিবর্তনের জন্য প্রতিশ্রুতির সময়কাল শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে না, এটি তাৎক্ষণিকভাবে বা সেট প্রতিস্থাপন মোডের উপর ভিত্তি করে পরবর্তী অর্থপ্রদানের তারিখে কার্যকর হয়।
- একই সাবস্ক্রিপশন প্ল্যানের পরিবর্তন : একই সাবস্ক্রিপশন পণ্যের কিস্তি-ভিত্তিক প্ল্যানের পরিবর্তে কিস্তি-বহির্ভূত বেস প্ল্যানে প্ল্যান পরিবর্তন অনুমোদিত নয়।
রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDNs) : প্রতিশ্রুতির সময়কালের জন্য পেমেন্ট বাকি থাকলে ব্যবহারকারীর দ্বারা প্রেরিত বাতিলকরণের সাথে সাথেই একটি
SUBSCRIPTION_CANCELLATION_SCHEDULEDRTDN পাঠানো হয়। বাতিলকরণটি মুলতুবি রয়েছে এবং শুধুমাত্র প্রতিশ্রুতির সময়কালের শেষে কার্যকর হবে। তারপর, যদি ব্যবহারকারী দ্বারা পুনরুদ্ধার না করা হয়, তাহলে প্রতিশ্রুতির সময়কালের শেষেSUBSCRIPTION_CANCELEDএবংSUBSCRIPTION_EXPIREDRTDN পাঠানো হয়।পেমেন্ট / রাজস্ব আদায় : ব্যবহারকারীরা তাদের মাসিক পেমেন্ট করার সাথে সাথে ডেভেলপারদের পেমেন্ট করা হবে, অন্যান্য সমস্ত সাবস্ক্রিপশনের মতো একই শর্ত সাপেক্ষে। ব্যবহারকারী যখন কিস্তি সাবস্ক্রিপশনের জন্য সাইন আপ করেন তখন ডেভেলপারদের অগ্রিম অর্থ প্রদান করা হয় না।
মিসড পেমেন্ট কালেকশন : যদি কোনও ব্যবহারকারী কোনও কিস্তি সাবস্ক্রিপশন পেমেন্ট করতে ব্যর্থ হন, তাহলে গুগল বা ডেভেলপার কেউই ব্যবহারকারীর কাছ থেকে এই ধরনের কোনও মিসড বা বকেয়া পেমেন্ট সংগ্রহ করার চেষ্টা করবে না, তবে গুগল তার স্বাভাবিক পেমেন্ট পুনঃচেষ্টা পদ্ধতি অনুসারে প্রযোজ্য গ্রেস পিরিয়ড বা অ্যাকাউন্ট হোল্ড পিরিয়ডের সময় পর্যায়ক্রমে পুনরায় পেমেন্ট করার চেষ্টা করতে পারে। অবশিষ্ট কোনও অপ্রদত্ত কিস্তি পেমেন্টের জন্য গুগল ডেভেলপারের কাছে দায়ী থাকবে না।
Play Billing Library-এর প্রাপ্যতা :
installmentDetailsফিল্ডটি শুধুমাত্র PBL 7 বা তার পরবর্তী সংস্করণের জন্য উপলব্ধ। PBL 5 এবং তার পরবর্তী সংস্করণের জন্য,queryProductDetails()ব্যবহার করে কিস্তির সাবস্ক্রিপশন ফেরত দেওয়া হয়, তবে সাবস্ক্রিপশনে প্ল্যানের প্রতিশ্রুতিবদ্ধ অর্থপ্রদানের সংখ্যার মতো বিস্তারিত কিস্তির তথ্য অন্তর্ভুক্ত থাকবে না।
ব্যবহারকারীদের সাবস্ক্রিপশন পরিচালনা করার অনুমতি দিতে ডিপ লিঙ্ক ব্যবহার করুন
আপনার অ্যাপের সেটিংস বা পছন্দের স্ক্রিনে একটি লিঙ্ক থাকা উচিত যা ব্যবহারকারীদের তাদের সাবস্ক্রিপশন পরিচালনা করতে দেয়, যা আপনি আপনার অ্যাপের স্বাভাবিক চেহারা এবং অনুভূতিতে অন্তর্ভুক্ত করতে পারেন।
আপনি আপনার অ্যাপ থেকে Google Play সাবস্ক্রিপশন সেন্টারে একটি ডিপ লিঙ্ক অন্তর্ভুক্ত করতে পারেন, যেখানে মেয়াদোত্তীর্ণ সাবস্ক্রিপশন নেই, যা আপনি সাবস্ক্রিপশন রিসোর্সের subscriptionState ফিল্ড ব্যবহার করে নির্ধারণ করতে পারেন। এর উপর ভিত্তি করে, Play Store সাবস্ক্রিপশন সেন্টারে ডিপ লিঙ্ক করার বিভিন্ন উপায় রয়েছে।
সাবস্ক্রিপশন সেন্টারের লিঙ্ক
চিত্র ১ এবং ২-এ দেখানো হয়েছে, ব্যবহারকারীদের তাদের সমস্ত সাবস্ক্রিপশন দেখানো পৃষ্ঠায় নিয়ে যেতে নিম্নলিখিত URL ব্যবহার করুন:
https://play.google.com/store/account/subscriptions


এই ডিপ লিঙ্কটি ব্যবহারকারীকে প্লে স্টোর সাবস্ক্রিপশন সেন্টার থেকে বাতিল করা সাবস্ক্রিপশন পুনরুদ্ধার করতে সাহায্য করতে কার্যকর হতে পারে।
একটি নির্দিষ্ট সাবস্ক্রিপশন ম্যানেজমেন্ট পৃষ্ঠার লিঙ্ক (প্রস্তাবিত)
মেয়াদোত্তীর্ণ না হওয়া সাবস্ক্রিপশনের জন্য ব্যবস্থাপনা পৃষ্ঠায় সরাসরি লিঙ্ক করতে, ক্রয়কৃত সাবস্ক্রিপশনের সাথে সম্পর্কিত প্যাকেজের নাম এবং productId নির্দেশ করুন। বিদ্যমান সাবস্ক্রিপশনের জন্য productId প্রোগ্রাম্যাটিকভাবে নির্ধারণ করতে, আপনার অ্যাপের ব্যাকএন্ডে জিজ্ঞাসা করুন অথবা একটি নির্দিষ্ট ব্যবহারকারীর সাথে সম্পর্কিত সাবস্ক্রিপশনের তালিকার জন্য BillingClient.queryPurchasesAsync() কল করুন। প্রতিটি সাবস্ক্রিপশনে সাবস্ক্রিপশন স্ট্যাটাস তথ্যের অংশ হিসাবে সংশ্লিষ্ট productId থাকে। সাবস্ক্রিপশন ক্রয়ের সাথে সম্পর্কিত প্রতিটি SubscriptionPurchaseLineItem অবজেক্টে ব্যবহারকারীর সেই লাইন আইটেমে কেনা সাবস্ক্রিপশনের সাথে সম্পর্কিত productId মান থাকে।
ব্যবহারকারীদের একটি নির্দিষ্ট সাবস্ক্রিপশন ম্যানেজমেন্ট স্ক্রিনে নিয়ে যেতে নিম্নলিখিত URL ব্যবহার করুন, "your-sub-product-id" এবং "your-app-package" এর পরিবর্তে যথাক্রমে productId এবং app প্যাকেজের নাম দিন:
https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
এরপর ব্যবহারকারী তাদের পেমেন্ট পদ্ধতি পরিচালনা করতে পারবেন এবং বাতিলকরণ, পুনঃসাবস্ক্রিপশন এবং বিরতি সহ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারবেন।
ব্যবহারকারীদের তাদের সাবস্ক্রিপশন আপগ্রেড, ডাউনগ্রেড বা পরিবর্তন করার অনুমতি দিন
আপনি বিদ্যমান গ্রাহকদের তাদের চাহিদা আরও ভালভাবে পূরণ করার জন্য তাদের সাবস্ক্রিপশন প্ল্যান পরিবর্তন করার জন্য বিভিন্ন বিকল্প প্রদান করতে পারেন:
- যদি আপনি একাধিক সাবস্ক্রিপশন স্তর বিক্রি করেন, যেমন "বেসিক" এবং "প্রিমিয়াম" সাবস্ক্রিপশন, তাহলে আপনি ব্যবহারকারীদের একটি ভিন্ন সাবস্ক্রিপশনের বেস প্ল্যান বা অফার কিনে স্তর পরিবর্তন করার অনুমতি দিতে পারেন।
- আপনি ব্যবহারকারীদের তাদের বর্তমান বিলিং সময়কাল পরিবর্তন করার অনুমতি দিতে পারেন, যেমন মাসিক থেকে বার্ষিক প্ল্যানে স্যুইচ করা।
- আপনি ব্যবহারকারীদের স্বয়ংক্রিয় পুনর্নবীকরণ এবং প্রিপেইড পরিকল্পনার মধ্যে স্যুইচ করার অনুমতি দিতে পারেন।
যোগ্য ব্যবহারকারীদের জন্য সাবস্ক্রিপশন অফার প্রদান করে আপনি এই পরিবর্তনগুলির যেকোনো একটিকে উৎসাহিত করতে পারেন। উদাহরণস্বরূপ, আপনি একটি অফার তৈরি করতে পারেন যা মাসিক প্ল্যানের পরিবর্তে বার্ষিক প্ল্যানে স্যুইচ করার সময় প্রথম বছরে ৫০% ছাড় প্রদান করে এবং এই অফারটি কেবলমাত্র সেইসব মাসিক প্ল্যানের সদস্যদের জন্য সীমাবদ্ধ রাখতে পারেন যারা এই অফারটি কিনেননি। অফারের যোগ্যতার মানদণ্ড সম্পর্কে আরও তথ্য সহায়তা কেন্দ্রে পাওয়া যাবে।
চিত্র ৩ তিনটি ভিন্ন পরিকল্পনা সহ একটি উদাহরণ অ্যাপ দেখায়:

আপনার অ্যাপটি চিত্র ৩ এর মতো একটি স্ক্রিন দেখাতে পারে, যা ব্যবহারকারীদের তাদের সাবস্ক্রিপশন পরিবর্তন করার বিকল্প দেয়। সব ক্ষেত্রেই, ব্যবহারকারীদের কাছে তাদের বর্তমান সাবস্ক্রিপশন পরিকল্পনা কী এবং এটি পরিবর্তন করার জন্য তাদের কাছে কী বিকল্প রয়েছে তা স্পষ্ট হওয়া উচিত।
যখন ব্যবহারকারীরা তাদের সাবস্ক্রিপশন আপগ্রেড, ডাউনগ্রেড বা পরিবর্তন করার সিদ্ধান্ত নেন, তখন আপনি একটি প্রতিস্থাপন মোড নির্দিষ্ট করেন যা বর্তমান প্রদত্ত বিলিং সময়ের আনুপাতিক মান কীভাবে প্রয়োগ করা হবে এবং কখন কোনও এনটাইটেলমেন্ট পরিবর্তন ঘটে তা নির্ধারণ করে।
প্রতিস্থাপন মোড
নিম্নলিখিত সারণীতে উপলব্ধ প্রতিস্থাপন পদ্ধতি এবং ব্যবহারের উদাহরণ এবং প্রদত্ত হিসাবে বিবেচিত অর্থপ্রদানের সংখ্যা তালিকাভুক্ত করা হয়েছে।
প্রতিস্থাপন মোড | বিবরণ | ব্যবহারের উদাহরণ | প্রতিশ্রুতিবদ্ধ অর্থ প্রদান করা হয়েছে হিসাবে রেকর্ড করা হয়েছে (কিস্তিতে সাবস্ক্রিপশন প্রতিস্থাপনের জন্য) |
| সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয়। বাকি সময় মূল্যের পার্থক্যের উপর ভিত্তি করে সমন্বয় করা হয় এবং পরবর্তী বিলিংয়ের তারিখ এগিয়ে দিয়ে নতুন সাবস্ক্রিপশনে জমা করা হয়। এটি ডিফল্ট আচরণ। | তাৎক্ষণিকভাবে অতিরিক্ত কোনও অর্থ প্রদান ছাড়াই আরও ব্যয়বহুল স্তরে আপগ্রেড করুন। | 0 |
| সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড করা হয় এবং বিলিং চক্র একই থাকে। বাকি সময়ের জন্য মূল্যের পার্থক্য ব্যবহারকারীর কাছ থেকে চার্জ করা হয়। দ্রষ্টব্য: এই বিকল্পটি শুধুমাত্র একটি সাবস্ক্রিপশন আইটেম আপগ্রেডের জন্য উপলব্ধ, যেখানে প্রতি ইউনিট সময়ের দাম বৃদ্ধি পায়। | বিলিংয়ের তারিখ পরিবর্তন না করেই আরও ব্যয়বহুল স্তরে আপগ্রেড করুন। | ১ |
| সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং ব্যবহারকারীকে তাৎক্ষণিকভাবে নতুন এনটাইটেলমেন্টের জন্য সম্পূর্ণ মূল্য চার্জ করা হয়। পূর্ববর্তী সাবস্ক্রিপশন থেকে অবশিষ্ট মূল্য হয় একই এনটাইটেলমেন্টের জন্য বহন করা হয়, অথবা অন্য এনটাইটেলমেন্টে স্যুইচ করার সময় সময়ের জন্য আনুপাতিক হারে। দ্রষ্টব্য: যদি নতুন সাবস্ক্রিপশনে বিনামূল্যে ট্রায়াল বা প্রারম্ভিক অফার থাকে, তাহলে আপগ্রেড বা ডাউনগ্রেডের সময় ব্যবহারকারীকে $0 অথবা প্রারম্ভিক অফারের মূল্য, যেটি প্রযোজ্য হোক না কেন, চার্জ করা হবে। | ছোট বিলিং পিরিয়ড থেকে দীর্ঘ বিলিং পিরিয়ডে আপগ্রেড করুন। | ১ (বিঃদ্রঃ: নতুন সাবস্ক্রিপশনে যদি বিনামূল্যে ট্রায়াল থাকে তাহলে ০।) |
| সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং সাবস্ক্রিপশন পুনর্নবীকরণের সময় নতুন মূল্য নেওয়া হয়। বিলিং চক্র একই থাকে। | অবশিষ্ট ফ্রি পিরিয়ড ধরে রেখে উচ্চতর সাবস্ক্রিপশন স্তরে আপগ্রেড করুন। | 0 |
| সাবস্ক্রিপশন নবায়নের সময়ই সাবস্ক্রিপশন আইটেমটি আপগ্রেড বা ডাউনগ্রেড করা হয়, তবে নতুন ক্রয়টি নিম্নলিখিত দুটি আইটেম সহ অবিলম্বে জারি করা হয়:
দ্রষ্টব্য: কিস্তি সাবস্ক্রিপশনের জন্য, পরবর্তী পেমেন্ট তারিখের শুরুতে পরিকল্পনা পরিবর্তন করা হবে। | কম দামি স্তরে ডাউনগ্রেড করুন। | ১ |
| প্রতিস্থাপনের ক্ষেত্রে সাবস্ক্রিপশন আইটেমের জন্য অর্থপ্রদানের সময়সূচী অপরিবর্তিত রয়েছে। | যখন কোনও নির্দিষ্ট আইটেম অপরিবর্তিত রাখা উচিত তখন অ্যাড-অন সহ সাবস্ক্রিপশন থেকে সাবস্ক্রিপশন আইটেম যোগ করুন বা সরান। | নিষিদ্ধ |
আপগ্রেড বা ডাউনগ্রেড অফারের বিভিন্ন আপসেল এবং উইনব্যাক অ্যাপ্লিকেশন সম্পর্কে আরও জানতে, অফার এবং প্রচার নির্দেশিকাটি পড়ুন।
ক্রয়ের জন্য প্রতিস্থাপন মোড সেট করুন
আপনার পছন্দ এবং ব্যবসায়িক যুক্তির উপর ভিত্তি করে, আপনি বিভিন্ন ধরণের সাবস্ক্রিপশন ট্রানজিশনের জন্য বিভিন্ন প্রতিস্থাপন মোড ব্যবহার করতে পারেন। এই বিভাগে সাবস্ক্রিপশনে পরিবর্তনের জন্য প্রতিস্থাপন মোড কীভাবে সেট করবেন এবং প্রযোজ্য সীমাবদ্ধতাগুলি ব্যাখ্যা করা হয়েছে।
একই সাবস্ক্রিপশনের মধ্যে পুনরায় সাবস্ক্রাইব করুন বা প্ল্যান পরিবর্তন করুন
আপনি Google Play Console-এ একটি ডিফল্ট প্রতিস্থাপন মোড নির্দিষ্ট করতে পারেন। এই সেটিং আপনাকে বর্তমান গ্রাহকদের কাছ থেকে কখন চার্জ নিতে হবে তা বেছে নিতে দেয় যদি তারা একই সাবস্ক্রিপশনের জন্য একটি ভিন্ন বেস প্ল্যান বা অফার কিনে থাকেন অথবা বাতিল করার পরে পুনরায় সাবস্ক্রাইব করেন। উপলব্ধ বিকল্পগুলি হল Charge immediately , equivalent to CHARGE_FULL_PRICE , এবং Charge at the next billing date , equivalent to WITHOUT_PRORATION । একই সাবস্ক্রিপশনের মধ্যে বেস প্ল্যান পরিবর্তন করার সময় এগুলিই একমাত্র প্রাসঙ্গিক প্রতিস্থাপন মোড।
উদাহরণস্বরূপ, যদি ব্যবহারকারী সাবস্ক্রিপশন বাতিল করার পরে কিন্তু শেষ হওয়ার আগে একই প্ল্যানের জন্য আপনি একটি উইনব্যাক অফার বাস্তবায়ন করেন, তাহলে আপনি SubscriptionUpdateParams এ কোনও মান নির্দেশ না করেই নতুন ক্রয়টিকে নিয়মিত ক্রয় হিসাবে প্রক্রিয়া করতে পারেন। সিস্টেমটি সাবস্ক্রিপশনে আপনার কনফিগার করা ডিফল্ট প্রতিস্থাপন মোড ব্যবহার করে এবং স্বয়ংক্রিয়ভাবে পুরানো ক্রয় থেকে নতুন ক্রয়ে প্ল্যান রূপান্তর পরিচালনা করে।
সাবস্ক্রিপশন জুড়ে প্ল্যান পরিবর্তন করুন, অথবা ডিফল্ট প্রতিস্থাপন মোড ওভাররাইড করুন
যদি ব্যবহারকারী সাবস্ক্রিপশন পণ্য পরিবর্তন করেন—একটি ভিন্ন সাবস্ক্রিপশন কিনছেন —অথবা যদি আপনি কোনও কারণে ডিফল্ট প্রতিস্থাপন মোড ওভাররাইড করতে চান, তাহলে ক্রয় প্রবাহ প্যারামিটারের অংশ হিসেবে রানটাইমে প্রোরেশন রেট নির্দিষ্ট করুন।
আপনার রানটাইম ক্রয় প্রবাহ কনফিগারেশনের অংশ হিসেবে SubscriptionProductReplacementParams অথবা SubscriptionUpdateParams এ ReplacementMode সঠিকভাবে প্রদান করতে, নিম্নলিখিত বিধিনিষেধগুলি লক্ষ্য করুন:
- প্রিপেইড প্ল্যান, অটো-রিনিউয়িং প্ল্যান, অথবা কিস্তি প্ল্যান থেকে প্রিপেইড প্ল্যানে একই-সাবস্ক্রিপশন স্যুইচ আপগ্রেড, ডাউনগ্রেড বা শুরু করার সময়, একমাত্র অনুমোদিত প্রতিস্থাপন মোড হল
CHARGE_FULL_PRICE। যদি আপনি অন্য কোনও প্রতিস্থাপন মোড নির্দিষ্ট করেন, তাহলে ক্রয় ব্যর্থ হয় এবং ব্যবহারকারীকে একটি ত্রুটি দেখানো হয়। - একই সাবস্ক্রিপশনের মধ্যে থাকা প্ল্যানগুলিকে প্রিপেইড প্ল্যান অথবা অটো-রিনিউয়িং প্ল্যান থেকে অটো -রিনিউয়িং প্ল্যানে স্যুইচ করার সময়, বৈধ প্রোরেশন মোডগুলি হল
CHARGE_FULL_PRICEএবংWITHOUT_PRORATION। যদি আপনি অন্য কোনও প্রোরেশন মোড নির্দিষ্ট করেন, তাহলে ক্রয় ব্যর্থ হয় এবং ব্যবহারকারীকে একটি ত্রুটি দেখানো হয়। - একই সাবস্ক্রিপশন পণ্যের মধ্যে প্ল্যানগুলিকে কিস্তির বেস প্ল্যান থেকে নন-কিস্তির বেস প্ল্যানে স্যুইচ করার অনুমতি নেই।
- প্রতিস্থাপনের সময় কোনও আইটেমের পেমেন্ট অপরিবর্তিত রাখার জন্য
SubscriptionProductReplacementParamsএKEEP_EXISTINGপ্রতিস্থাপন মোড ব্যবহার করার সময়, পুরানো পণ্য আইডি নতুন পণ্যের পণ্য আইডির মতোই হওয়া উচিত।SubscriptionUpdateParamsএKEEP_EXISTINGমোড সমর্থিত নয়।
প্রতিস্থাপনের উদাহরণ এবং আচরণ
প্রতিটি প্রোরেশন মোড কীভাবে কাজ করে তা বোঝার জন্য, নিম্নলিখিত পরিস্থিতি বিবেচনা করুন:
স্যামওয়াইজের কান্ট্রি গার্ডেনার অ্যাপ থেকে অনলাইন কন্টেন্টের সাবস্ক্রিপশন রয়েছে। তার কন্টেন্টের টিয়ার ১ ভার্সনের মাসিক সাবস্ক্রিপশন রয়েছে, যা শুধুমাত্র টেক্সট-এর জন্য। এই সাবস্ক্রিপশনের জন্য তার প্রতি মাসে ২ ডলার খরচ হয় এবং এটি মাসের প্রথম তারিখে নবায়ন করা হয়।
১৫ এপ্রিল, স্যামওয়াইজ টিয়ার ২ সাবস্ক্রিপশনের বার্ষিক সংস্করণে আপগ্রেড করার সিদ্ধান্ত নিয়েছে, যার মধ্যে ভিডিও আপডেট অন্তর্ভুক্ত রয়েছে এবং প্রতি বছর $৩৬ খরচ হয়।
সাবস্ক্রিপশন আপগ্রেড করার সময়, ডেভেলপার একটি প্রোরেশন মোড নির্বাচন করে। নিম্নলিখিত তালিকাটি বর্ণনা করে যে প্রতিটি প্রোরেশন মোড কীভাবে স্যামওয়াইজের সাবস্ক্রিপশনকে প্রভাবিত করে:
WITH_TIME_PRORATION
স্যামওয়াইজের টিয়ার ১ সাবস্ক্রিপশন অবিলম্বে শেষ হয়ে যায়। যেহেতু তিনি পুরো এক মাসের জন্য (১-৩০ এপ্রিল) অর্থ প্রদান করেছিলেন কিন্তু সাবস্ক্রিপশনের সময়কালের মাঝামাঝি সময়ে আপগ্রেড করেছিলেন, তাই এক মাসের সাবস্ক্রিপশনের অর্ধেক ($১) তার নতুন সাবস্ক্রিপশনে প্রযোজ্য হবে। তবে, যেহেতু সেই নতুন সাবস্ক্রিপশনের খরচ প্রতি বছর $৩৬, তাই $১ ক্রেডিট ব্যালেন্স মাত্র ১০ দিনের জন্য (১৬-২৫ এপ্রিল) পরিশোধ করতে হবে; তাই ২৬ এপ্রিল, তাকে নতুন সাবস্ক্রিপশনের জন্য $৩৬ এবং পরবর্তী বছরের ২৬ এপ্রিল আরও $৩৬ চার্জ করা হবে।
ক্রয়টি সফল হওয়ার সাথে সাথে আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত, এবং আপনি queryPurchasesAsync() কলের অংশ হিসাবে নতুন ক্রয়টি পুনরুদ্ধার করতে সক্ষম হবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পাবে।
CHARGE_PRORATED_PRICE
এই মোডটি ব্যবহার করা যেতে পারে কারণ প্রতি টাইম ইউনিটের টিয়ার 2 সাবস্ক্রিপশন মূল্য ($36/বছর = $3/মাস) টিয়ার 1 সাবস্ক্রিপশন মূল্য প্রতি টাইম ইউনিটের ($2/মাস) চেয়ে বেশি। স্যামওয়াইজের টিয়ার 1 সাবস্ক্রিপশন অবিলম্বে শেষ হয়ে যায়। যেহেতু তিনি পুরো এক মাসের জন্য অর্থ প্রদান করেছিলেন কিন্তু এর মাত্র অর্ধেক ব্যবহার করেছিলেন, তাই এক মাসের সাবস্ক্রিপশনের অর্ধেক ($1) তার নতুন সাবস্ক্রিপশনে প্রযোজ্য হয়। তবে, যেহেতু সেই নতুন সাবস্ক্রিপশনের দাম $36/বছর, বাকি 15 দিনের দাম $1.50; তাই তার নতুন সাবস্ক্রিপশনের জন্য তাকে $0.50 এর পার্থক্য চার্জ করা হয়। 1লা মে তারিখে, স্যামওয়াইজকে তার নতুন সাবস্ক্রিপশন স্তরের জন্য $36 এবং পরবর্তী বছরের 1লা মে তারিখে আরও $36 চার্জ করা হয়।
ক্রয়টি সফল হওয়ার সাথে সাথে আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত, এবং আপনি queryPurchasesAsync() কলের অংশ হিসাবে নতুন ক্রয়টি পুনরুদ্ধার করতে সক্ষম হবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পাবে।
WITHOUT_PRORATION
স্যামওয়াইজের টিয়ার ১ সাবস্ক্রিপশন তাৎক্ষণিকভাবে টিয়ার ২ তে আপগ্রেড করা হয় কোন অতিরিক্ত চার্জ ছাড়াই, এবং ১লা মে তার নতুন সাবস্ক্রিপশন টিয়ারের জন্য $৩৬ এবং পরবর্তী বছরের ১লা মে আরও $৩৬ চার্জ করা হয়।
ক্রয়টি সফল হওয়ার সাথে সাথে আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত, এবং আপনি queryPurchasesAsync() কলের অংশ হিসাবে নতুন ক্রয়টি পুনরুদ্ধার করতে সক্ষম হবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পাবে।
DEFERRED
স্যামওয়াইজের টিয়ার ১ সাবস্ক্রিপশন ৩০ এপ্রিল পর্যন্ত মেয়াদ শেষ না হওয়া পর্যন্ত চলবে। ১ মে থেকে, টিয়ার ২ সাবস্ক্রিপশন কার্যকর হবে এবং স্যামওয়াইজকে তার নতুন সাবস্ক্রিপশন স্তরের জন্য $৩৬ চার্জ করা হবে।
ক্রয়টি সফল হওয়ার মুহূর্তে আপনার অ্যাপের PurchasesUpdatedListener এ কল করা উচিত এবং আপনি queryPurchasesAsync() কলের অংশ হিসেবে নতুন ক্রয়টি পুনরুদ্ধার করতে সক্ষম হবেন। আপনার ব্যাকএন্ডটি অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পাবে। সেই সময়ে আপনি যেভাবে অন্য কোনও নতুন ক্রয় প্রক্রিয়া করবেন সেভাবেই আপনার ক্রয়টি প্রক্রিয়া করা উচিত। বিশেষ করে, নিশ্চিত করুন যে আপনি নতুন ক্রয়টি স্বীকার করছেন। মনে রাখবেন যে প্রতিস্থাপন কার্যকর হওয়ার মুহূর্তে নতুন সাবস্ক্রিপশনের startTime পূরণ করা হয়, যা পুরানো সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেলে ঘটে। সেই সময়ে, আপনি নতুন সাবস্ক্রিপশন প্ল্যানের জন্য একটি SUBSCRIPTION_RENEWED RTDN পাবেন। Handle deferred replacement- এ ReplacementMode.DEFERRED আচরণ সম্পর্কে আরও পড়ুন।
CHARGE_FULL_PRICE
Samwise এর Tier 1 সাবস্ক্রিপশন অবিলম্বে শেষ হয়ে যায়। তার Tier 2 সাবস্ক্রিপশন আজ থেকে শুরু হয় এবং তার কাছ থেকে $36 চার্জ করা হয়। যেহেতু তিনি পুরো এক মাসের জন্য অর্থ প্রদান করেছিলেন কিন্তু এর মাত্র অর্ধেক ব্যবহার করেছিলেন, এক মাসের সাবস্ক্রিপশনের অর্ধেক ($1) তার নতুন সাবস্ক্রিপশনে প্রযোজ্য হয়। যেহেতু সেই নতুন সাবস্ক্রিপশনের দাম $36/বছর, তাই তিনি তার সাবস্ক্রিপশনের সময়কালের সাথে বছরের 1/36 ভাগ (~10 দিন) যোগ করবেন। অতএব, Samwise এর পরবর্তী চার্জ আজ থেকে 1 বছর 10 দিন পরে $36 হবে। এরপর, প্রতি বছর তার কাছ থেকে $36 চার্জ করা হবে।
প্রোরেশন মোড নির্বাচন করার সময়, আমাদের প্রতিস্থাপনের সুপারিশগুলি পর্যালোচনা করতে ভুলবেন না।
KEEP_EXISTING
স্যামওয়াইজের কান্ট্রি গার্ডেনার অ্যাপ থেকে অনলাইন কন্টেন্টের সাবস্ক্রিপশন আছে। বেসিক কন্টেন্টের জন্য তার প্ল্যান ১-এর মাসিক সাবস্ক্রিপশন আছে। এই সাবস্ক্রিপশনের জন্য ৩ মাসের জন্য প্রতি মাসে ২ ডলার এবং তারপর প্রতি মাসে ৪ ডলার খরচ হয়। স্যামওয়াইজ ১ এপ্রিল এটি কিনেছে। কান্ট্রি গার্ডেনার অ্যাপ প্রতি মাসে ৩ ডলারে অ্যাড-অন স্পেশালিটি কন্টেন্ট হিসেবে প্ল্যান ২ অফার করে। ১৫ এপ্রিল, স্যামওয়াইজ তার কান্ট্রি গার্ডেনার অ্যাপের সাবস্ক্রিপশনে প্ল্যান ২ যোগ করেছে, যেখানে বিদ্যমান প্ল্যান ১ বজায় রেখেছে। স্যামওয়াইজের পেমেন্টের সময়সূচী নিম্নরূপ:
- প্ল্যান ২-এর জন্য আনুপাতিক মূল্য $১.৫০, ১৫ এপ্রিল পর্যন্ত।
- পরবর্তী দুই মাসের জন্য প্রতি মাসে $৫.০০ মূল্য, যা প্ল্যান ১ এর প্রাথমিক মূল্য এবং প্ল্যান ২ এর নিয়মিত মূল্য উভয়কেই অন্তর্ভুক্ত করবে।
- এরপর, নিয়মিত মাসিক $৭.০০ পেমেন্ট।
অ্যাপের মধ্যে সাবস্ক্রিপশন পরিবর্তনগুলি ট্রিগার করুন
আপনার অ্যাপ ব্যবহারকারীদের ক্রয় প্রবাহ চালু করার মতো একই ধাপগুলি ব্যবহার করে আপগ্রেড বা ডাউনগ্রেড অফার করতে পারে। তবে, আপগ্রেড বা ডাউনগ্রেড করার সময়, আপনাকে বর্তমান সাবস্ক্রিপশন, ভবিষ্যতের (আপগ্রেড বা ডাউনগ্রেড) সাবস্ক্রিপশন এবং ব্যবহারের জন্য প্রতিস্থাপন মোডের বিশদ প্রদান করতে হবে।
প্রতিস্থাপনের জন্য SubscriptionProductReplacementParams ব্যবহার করুন (পছন্দসই)
নিম্নলিখিত উদাহরণে SubscriptionProductReplacementParams ব্যবহার করে কীভাবে সাবস্ক্রিপশন আপডেট করতে হয় তা দেখানো হয়েছে।
BillingFlowParams.ProductDetailsParamsঅবজেক্টে এখন একটিsetSubscriptionProductReplacementParams()পদ্ধতি রয়েছে যা পণ্য স্তর প্রতিস্থাপনের তথ্য নির্দিষ্ট করে।SubscriptionProductReplacementParamsদুটি সেটার পদ্ধতি রয়েছে:-
setOldProductId:এটি হল পুরাতন পণ্য যা বর্তমানProductDetails. -
setReplacementMode:এটি আইটেম লেভেল রিপ্লেসমেন্ট মোড। মোডগুলি মূলতSubscriptionUpdateParamsমতোই, তবে মান ম্যাপিং আপডেট করা হয়েছে।
-
বিদ্যমান ক্রয় স্তরের আপডেট প্যারামিটার
BillingFlowParams.setSubscriptionUpdateParams()setOldPurchaseToken()দিয়ে তৈরি করা উচিত।একবার
setSubscriptionProductReplacementParams()ProductDetailsParamsএর যেকোনো একটির জন্য ডাকা হলে,SubscriptionUpdateParams.setSubscriptionReplacementMode()কোন প্রভাব থাকবে না।
নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে একটি সাবস্ক্রিপশন প্ল্যান ( old_product_1 , old_product_2 ) থেকে ( product_1 , product_2 , product_3 ) এ পরিবর্তন করতে হয়। এই পরিস্থিতিতে, product_1 old_product_1 প্রতিস্থাপন করে, product_2 old_product_2 প্রতিস্থাপন করে, এবং product_3 তাৎক্ষণিকভাবে সাবস্ক্রিপশনে যোগ করা হয়।
কোটলিন
val billingClient: BillingClient = ... val replacementModeForBasePlan: Int = ... val replacementModeForAddon: Int = ... val purchaseTokenOfExistingSubscription: String = "your_old_purchase_token" // ProductDetails instances obtained from queryProductDetailsAsync(); val productDetailsParams1 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails1_obj) // Required: Set the ProductDetails object .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_1") .setReplacementMode(replacementModeForBasePlan) .build() ) .build() val productDetailsParams2 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails2_obj) // Required: Set the ProductDetails object .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_2") .setReplacementMode(replacementModeForAddon) .build() ) .build() // Example for a third item without replacement params val productDetailsParams3 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails3_obj) // Required: Set the ProductDetails object .build() val newProductDetailsList = listOf( productDetailsParams1, productDetailsParams2, productDetailsParams3 ) val billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseTokenOfExistingSubscription) .build() ) .setProductDetailsParamsList(newProductDetailsList) .build() // To launch the billing flow: // billingClient.launchBillingFlow(activity, billingFlowParams)
জাভা
BillingClient billingClient = …; int replacementModeForBasePlan =…; int replacementModeForAddon =…; // ProductDetails obtained from queryProductDetailsAsync(). ProductDetailsParams productDetails1 = ProductDetailsParams.newBuilder() .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_1") .setReplacementMode(replacementModeForBasePlan)) .build(); ProductDetailsParams productDetails2 = ProductDetailsParams.newBuilder() .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_2") .setReplacementMode(replacementModeForAddon)) .build(); ProductDetailsParams productDetails3 = ...; ArrayListnewProductDetailsList = new ArrayList<>(); newProductDetailsList.add(productDetails1); newProductDetailsList.add(productDetails2); newProductDetailsList.add(productDetails3); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseTokenOfExistingSubscription) .build()) .setProductDetailsParamsList(productDetailsList) .build(); billingClient.launchBillingFlow(billingFlowParams);
প্রতিস্থাপনের জন্য SubscriptionUpdateParams সেট করুন (অপ্রচলিত)
নিম্নলিখিত উদাহরণে SubscriptionUpdateParams ব্যবহার করে কীভাবে সাবস্ক্রিপশন আপডেট করতে হয় তা দেখানো হয়েছে।
কোটলিন
val offerToken = productDetails .getSubscriptionOfferDetails(selectedOfferIndex) .getOfferToken() val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList( listOf( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerToken) .build() ) ).setSubscriptionUpdateParams( BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken("old_purchase_token") .setSubscriptionReplacementMode( BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE ) .build() ).build() billingClient.launchBillingFlow( activity, billingParams ) // ...
জাভা
String offerToken = productDetails .getSubscriptionOfferDetails(selectedOfferIndex) .getOfferToken(); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList( ImmuableList.of( ProductDetailsParams.newBuilder() // fetched via queryProductDetailsAsync .setProductDetails(productDetails) // offerToken can be found in // ProductDetails=>SubscriptionOfferDetails .setOfferToken(offerToken) .build())) .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() // purchaseToken can be found in Purchase#getPurchaseToken .setOldPurchaseToken("old_purchase_token") .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE) .build()) .build(); BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams); // ...
প্রতিস্থাপনের সুপারিশ
নিম্নলিখিত সারণীতে প্রতিটি দৃশ্যকল্পের জন্য আমরা কী সুপারিশ করি তার সাথে বিভিন্ন প্রোরেশন দৃশ্যকল্প দেখানো হয়েছে:
| দৃশ্যকল্প | প্রস্তাবিত প্রতিস্থাপন মোড | ফলাফল |
|---|---|---|
| আরও ব্যয়বহুল স্তরে আপগ্রেড করা হচ্ছে | CHARGE_PRORATED_PRICE | ব্যবহারকারী একই বিলিং পিরিয়ড বজায় রেখে তাৎক্ষণিকভাবে অ্যাক্সেস পান। |
| কম ব্যয়বহুল স্তরে ডাউনগ্রেড করা হচ্ছে | DEFERRED | ব্যবহারকারী ইতিমধ্যেই আরও ব্যয়বহুল স্তরের জন্য অর্থ প্রদান করেছেন, তাই তারা পরবর্তী বিলিংয়ের তারিখ পর্যন্ত অ্যাক্সেস রাখতে পারবেন। |
| বিনামূল্যে ট্রায়াল চলাকালীন আপগ্রেড করা, ট্রায়াল ধরে রাখা | WITHOUT_PRORATION | ব্যবহারকারী অতিরিক্ত চার্জ ছাড়াই ট্রায়াল পিরিয়ডের বাকি সময়কালের জন্য উচ্চতর স্তরে আপগ্রেড করতে পারবেন। |
| বিনামূল্যে ট্রায়াল চলাকালীন আপগ্রেড করা - বিনামূল্যে ট্রায়ালের অ্যাক্সেস বন্ধ করা | CHARGE_PRORATED_PRICE | ব্যবহারকারী তাৎক্ষণিকভাবে নতুন স্তরে অ্যাক্সেস পাবেন, বিনামূল্যে ট্রায়ালের অবশিষ্ট মূল্য বহন করা হবে। বহন করা মূল্য বেস প্ল্যান মূল্যের উপর ভিত্তি করে গণনা করা হবে। |
| অ্যাড-অন সহ সাবস্ক্রিপশন থেকে অন্যান্য সাবস্ক্রিপশন আইটেম যোগ বা অপসারণ করার সময় কিছু সাবস্ক্রিপশন আইটেমের পেমেন্ট সময়সূচী অপরিবর্তিত রাখা। | KEEP_EXISTING | ব্যবহারকারী অপরিবর্তিত পণ্যের জন্য পুরনো মূল্য পরিশোধ করতে থাকেন। নতুন পণ্য তাৎক্ষণিকভাবে যোগ করা হয়। অন্যান্য পুরানো পণ্য প্রতিস্থাপন মোড নির্দিষ্ট করে প্রতিস্থাপন করা যেতে পারে অথবা অপসারণ করা যেতে পারে। |
সাবস্ক্রিপশন পরিবর্তনের কেনাকাটা পরিচালনা করুন
পরিকল্পনার পরিবর্তনগুলি সমস্ত শর্তাবলী এবং উদ্দেশ্যে নতুন ক্রয়, এবং বিলিং প্রবাহ সফলভাবে সম্পন্ন হওয়ার পরে সেগুলি প্রক্রিয়া করা উচিত এবং সেভাবেই স্বীকৃতি দেওয়া উচিত। নতুন ক্রয়টি যথাযথভাবে প্রক্রিয়া করার পাশাপাশি, আপনাকে প্রতিস্থাপন করা ক্রয়টি বাতিল করতে হবে।
অ্যাপ-মধ্যস্থ আচরণ যেকোনো নতুন ক্রয়ের মতোই। আপনার অ্যাপটি আপনার PurchasesUpdatedListener এ নতুন ক্রয়ের ফলাফল পায় এবং নতুন ক্রয়টি queryPurchasesAsync এ উপলব্ধ।
যখন কোনও ক্রয় বিদ্যমান একটির পরিবর্তে আসে, তখন Google Play ডেভেলপার API সাবস্ক্রিপশন রিসোর্সে একটি linkedPurchaseToken ফেরত পাঠায়। আপনার পরিষেবাগুলিতে অ্যাক্সেস পেতে পুরানো টোকেনটি ব্যবহার না করা নিশ্চিত করতে linkedPurchaseToken প্রদত্ত টোকেনটি বাতিল করতে ভুলবেন না। আপগ্রেড এবং ডাউনগ্রেড কেনাকাটা পরিচালনা করার তথ্যের জন্য আপগ্রেড, ডাউনগ্রেড এবং রিজাইনআপ দেখুন।
নতুন ক্রয় টোকেন পেলে, নতুন ক্রয় টোকেন যাচাই করার মতো একই যাচাইকরণ প্রক্রিয়া অনুসরণ করুন। Google Play Billing Library থেকে BillingClient.acknowledgePurchase() অথবা Google Play Developer API থেকে Purchases.subscriptions:acknowledge দিয়ে এই ক্রয়গুলি স্বীকার করতে ভুলবেন না।
বিলম্বিত প্রতিস্থাপন হ্যান্ডেল
ডিফার্ড রিপ্লেসমেন্ট মোড আপনাকে নতুন প্ল্যান শুরু করার আগে ব্যবহারকারীকে তাদের পুরানো প্ল্যানের অবশিষ্ট এনটাইটেলমেন্ট ব্যবহার করতে দেয়।
যখন আপনি নতুন ক্রয়ের জন্য ReplacementMode.DEFERRED ব্যবহার করেন, তখন queryPurchasesAsync() ক্রয় প্রবাহের পরে একটি নতুন ক্রয় টোকেন ফেরত দেয় যা পরবর্তী পুনর্নবীকরণ তারিখে বিলম্বিত প্রতিস্থাপন না হওয়া পর্যন্ত পুরানো পণ্যের সাথে যুক্ত থাকে, যার পরে নতুন পণ্যটি ফেরত দেওয়া হয়।
অতীতে আপনি অবচিত ProrationMode.DEFERRED দিয়ে এই ব্যবহারকারীর অভিজ্ঞতা অর্জন করতে পারতেন, কিন্তু Play Billing Library 6 দিয়ে ProrationMode.DEFERRED অবচিত হয়েছে। আচরণটি কোথায় ভিন্ন তা বুঝতে নিম্নলিখিত টেবিলটি দেখুন:
সময় | প্রোরেশনমোড.ডিফারেড (অবঞ্চিত) | প্রতিস্থাপন মোড। DEFERRED |
ক্রয় প্রবাহ সফল হওয়ার ঠিক পরে (অ্যাপ) | ক্রয়ের পর পুরাতন প্ল্যানের এনটাইটেলমেন্ট পরবর্তী পুনর্নবীকরণ তারিখ পর্যন্ত অব্যাহত থাকবে। অ্যাপটি সঠিক এনটাইটেলমেন্ট প্রদান করে তা নিশ্চিত করার জন্য, নতুন ক্রয় টোকেনটি প্রকাশিত হয়নি, তাই এই মুহূর্তে এটি প্রক্রিয়া করা যাচ্ছে না। | ক্রয়ের পর নতুন ক্রয় টোকেনটি প্রকাশিত হয়েছে, তাই প্রতিস্থাপনের সময় বিবেচনা করে এই মুহুর্তে এটি প্রক্রিয়া করা উচিত। |
ক্রয় প্রবাহ সফল হওয়ার ঠিক পরে (ব্যাকএন্ড) | ক্রয় প্রবাহের পরে SUBSCRIPTION_PURCHASED RTDN পাঠানো হয় না । নতুন ক্রয় সম্পর্কে ব্যাকএন্ডকে এখনও অবহিত করা হয়নি। | নতুন ক্রয় টোকেনের জন্য ক্রয় প্রবাহের পরপরই পুরানো product_id সহ SUBSCRIPTION_PURCHASED RTDN পাঠানো হয়। নতুন ক্রয় টোকেন দিয়ে purchases.subscriptionsv2.get পদ্ধতিতে কল করলে দুটি লাইন আইটেম সহ 'startTime' সহ ক্রয় সময় নির্দেশ করে এমন একটি ক্রয় ফেরত আসে:
SUBSCRIPTION_EXPIRED পুরাতন ক্রয় টোকেনের জন্য পাঠানো হয়েছে। পুরাতন ক্রয় টোকেন সহ purchases.subscriptionsv2.get পদ্ধতিতে কল করার সময়, এটি মেয়াদোত্তীর্ণ বলে মনে হয় (পুরাতন প্ল্যানের এনটাইটেলমেন্ট অবশিষ্ট সময়ের জন্য নতুন ক্রয়ে স্থানান্তরিত হয়)। |
প্রতিস্থাপনের সময় - ক্রয় প্রবাহের পরে প্রথম পুনর্নবীকরণ (অ্যাপ) | নতুন ক্রয় টোকেনটি এখন প্রকাশিত হয়েছে, তাই এটি প্রক্রিয়া করা উচিত। | ক্রয় প্রক্রিয়া সফল হওয়ার আগেই নতুন ক্রয় প্রক্রিয়া করা উচিত ছিল, তাই সঠিক এনটাইটেলমেন্ট নিশ্চিত করা ছাড়া অ্যাপটির কোনও বিশেষ পদক্ষেপ নেওয়া উচিত নয়। |
প্রতিস্থাপনের সময় - ক্রয় প্রবাহের পরে প্রথম পুনর্নবীকরণ (ব্যাকএন্ড) | প্রথম SUBSCRIPTION_RENEWED RTDN পাঠানো হলে নতুন ক্রয়টি এখন প্রক্রিয়া করা এবং স্বীকার করা যেতে পারে। সাবস্ক্রিপশন রিসোর্সে থাকা | নতুন ক্রয় টোকেনের জন্য SUBSCRIPTION_PURCHASED RTDN পাঠানো হলে এবং 'startTime' হিসেবে রেকর্ড করা হলে নতুন ক্রয় প্রক্রিয়াজাত করা হয়েছিল এবং স্বীকৃতি দেওয়া হয়েছিল। ReplacementMode.DEFERRED-এর মাধ্যমে, প্রথম পুনর্নবীকরণগুলি অন্য যেকোনো পুনর্নবীকরণের আদর্শ আচরণ অনুসরণ করে এবং এই ঘটনাটি ঘটলে প্রতিস্থাপনের জন্য আপনাকে বিশেষ যুক্তি পরিচালনা করতে হবে না। নতুন ক্রয় টোকেন সহ purchases.subscriptionsv2.get পদ্ধতিতে কল করার সময় দুটি লাইন আইটেম সহ একটি ক্রয় ফেরত দেয়:
|
ReplacementMode.DEFERRED should be used from now on instead of the deprecated ProrationMode.DEFERRED, as it presents the same behavior regarding entitlement changes, but offers a way to manage the purchase that is more consistent with behaviors for other new purchases.
Customer management
Using Real-time developer notifications, you can detect in real time when a user decides to cancel. When a user cancels, but before their subscription has expired, you can send them push notifications or in-app messages to ask them to resubscribe.
After a user has cancelled their subscription, you can try to win them back either in your app, or through the Play store. The following table describes various subscription scenarios along with associated winback actions and app requirements.
| Before subscription expiration | After subscription expiration | |||
| In-app | In Play Store | In-app | In Play Store | |
| Winback feature | In-app subscription | পুনরুদ্ধার করুন | In-app subscription | Resubscribe |
| User goes through checkout flow | হাঁ | No | হাঁ | হাঁ |
| User subscription remains associated with the same SKU | User can sign up for same or different SKU | হাঁ | User can sign up for same or different SKU | হাঁ |
| Creates new purchase token | হাঁ | No | হাঁ | হাঁ |
| Enabled by default | No | Yes, support required for all devs | No | Apps without Billing Library 2.0+: No Apps with Billing Library 2.0+: Yes. Devs can opt-out in Console. |
| When user is charged | If using same SKU: end of current billing period. If using different SKU: depends on proration mode. | End of current billing period | অবিলম্বে | অবিলম্বে |
| Implementation required | Provide a re-signup UI in your app | Detect change in subscription state Deep-link to Play Store | Provide a re-signup UI in your app | Handle out-of-app purchases |
Before subscription expiration - in-app
For subscriptions that have been canceled but have not yet expired, you can allow subscribers to restore their subscription within your app by applying the same in-app product purchase flow as for new subscribers. Ensure your UI reflects that the user has an existing subscription. For example, you might want to display the user's current expiration date and recurring price with a Reactivate button.
Most of the time, you will want to offer the user the same price and SKU they were already subscribed to, as follows:
- Initiate a new subscription purchase with the same SKU.
- The new subscription replaces the old one and renews on the same expiration date. The old subscription is immediately marked as expired.
- As an example, Achilles has a subscription to Example Music App, and the subscription is due to expire on August 1. On July 10, he resubscribes to the one-month subscription at the same price per month. The new subscription is prorated with the remaining credit, is immediately active, and still renews on August 1.
If you would like to offer a different price—for example a new free trial or a winback discount—you can instead offer a different SKU to the user:
- Initiate an upgrade or downgrade with the different SKU using the replacement mode
WITHOUT_PRORATION. - The new subscription replaces the old one and renews on the same expiration date. The user is charged the price of the new SKU, including any introductory prices, on the original expiration date. If the old subscription was created using an obfuscated account ID, that same ID should be passed to the
BillingFlowParamsfor upgrades and downgrades. - As an example, Achilles has a subscription to Example Music App, and the subscription is due to expire on August 1. On July 10, he resubscribes to an annual subscription with an introductory price. The new subscription is immediately active, and the user is charged the introductory price on August 1.
- If you decide to include a free trial or intro price in your winback SKU, ensure that the user is eligible by unchecking the Allow one free trial per app box in the Google Play Console, which restricts the user to getting one free trial per app.
When you receive the purchase token, process the purchase just as you would with a new subscription. Additionally, the Google Play Developer API returns a linkedPurchaseToken in the subscription resource. Be sure to invalidate the token provided in the linkedPurchaseToken to ensure that the old token is not used to gain access to your services.
Before subscription expiration - in Play Store
While the subscription is canceled but still active, users can restore the subscription in the Google Play subscriptions center by clicking Resubscribe (previously Restore ). This keeps the same subscription and purchase token.

For more information on restoring subscriptions, see Restorations .
After subscription expiration - in-app
You can allow expired subscribers to resubscribe within your app by applying the same in-app product purchase flow as for new subscribers. Note the following:
- To offer users a discount, you might want to offer a product ID with special pricing for your subscription, also called a winback SKU . You can provide the offer in your app, or you can notify the user of the offer outside of the app, such as in email.
- To start a winback subscription, launch the purchase flow in your Android app using the Google Play Billing Library. This is the same process as with a new subscription, but you can determine the SKU that is available to the user.
- If you decide to include a free trial or intro price in your winback SKU, ensure that the user is eligible by unchecking the Allow one free trial per app box in the Google Play Console, which restricts the user to getting one free trial per app.
- If the user resubscribes to the same SKU, they are no longer eligible for free trials or introductory price. Ensure that your UI reflects this.
When you receive the purchase token, process the purchase just as you would with a new subscription. You won't receive a linkedPurchaseToken in the subscription resource.
After subscription expiration - in Play Store
If enabled, users can resubscribe to the same SKU for up to one year after expiration by clicking Resubscribe in the Google Play subscriptions center. This generates a new subscription and purchase token.

Re-subscribing is considered an out-of-app purchase, so be sure to follow best practices for handling purchases made from outside your app .
Promote your subscription
You can create promotion codes to give selected users an extended free trial to an existing subscription. To learn more, see Promo codes .
For free trials, Google Play verifies that the user has a valid payment method before starting the free trial. Some users may see this verification as a hold or charge on their payment method. This hold or charge is temporary and is later reversed or refunded.
After the trial period ends, the user's payment method is charged for the full subscription amount.
If a user cancels a subscription at any time during the free trial, the subscription remains active until the end of the trial, and they aren't charged when the free trial period ends.
Cancel or revoke
You can use the Google Play Developer API to cancel or revoke a subscription. This functionality is also available in the Google Play Console .
Cancel : Users can cancel a subscription on Google Play. You can also provide an option for users to cancel in your app or on your website. Your app should handle these cancellations as described in Cancellations .
Revoke : When you revoke, the user immediately loses access to the subscription. This can be used if, for example, there was a technical error that prevented the user from accessing your product, and the user does not want to continue using the product. Your app should handle these cancellations as described in Revocations .
The following table illustrates the differences between cancel and revoke.
| Stops renewal | Revoke access | |
| বাতিল করুন | হাঁ | No |
| প্রত্যাহার করুন | হাঁ | হাঁ |
Defer billing for a subscriber
You can advance the next billing date for an auto-renewing subscriber by using Purchases.subscriptions:defer from the Google Play Developer API. During the deferral period, the user is subscribed to your content with full access but is not charged. The subscription renewal date is updated to reflect the new date.
For prepaid plans, you can use the defer billing API to defer the expiration time.
Deferred billing lets you do the following:
- Give users free access as a special offer, such as giving one week free for purchasing a movie.
- Give free access to customers as a gesture of goodwill.
Billing can be deferred by as little as one day and by as long as one year per API call. To defer the billing even further, you can call the API again before the new billing date arrives.
As an example, Darcy has a monthly subscription to online content for the Fishing Quarterly app. She is normally billed £1.25 on the first of each month. In March, she participated in an online survey for the app publisher. The publisher rewards her with six free weeks by deferring the next payment until May 15, which is six weeks after her previously scheduled billing date of April
- Darcy is not charged for April or the beginning of May and still has access to the content. On May 15, she is charged the normal £1.25 subscription fee for the month. Her next renewal date is now June 15.
When deferring, you might want to notify the user by email or within the app to notify them that their billing date has changed.
Handling payment declines
If there are payment issues with a subscription renewal, Google will periodically attempt to renew the subscription for some time before canceling. This recovery period can consists of a grace period, followed by an account hold period. During this time, Google sends the user emails and notifications prompting them to update their payment method.
Upon payment decline, the subscription enters a grace period if one is configured. During the grace period, you should ensure the user still has access to the subscription entitlements.
After any grace period has ended, the subscription enters an account hold period. During account hold, you should ensure the user does not have access to the subscription entitlements.
You can specify the length of each auto-renewing base plan's grace period and account hold in the Google Play Console. Specifying lengths less than the default values may reduce the number of subscriptions recovered from payment declines.
To maximize the likelihood of subscription recovery during a payment decline, you can inform your user of a payment issue and ask them to fix it.
You can either do this yourself, as described in the grace period and account hold sections, or you can implement the in-app messaging API, where Google shows a message to users in your app.
In-app messaging
If you've enabled in-app messaging with InAppMessageCategoryId.TRANSACTIONAL , Google Play will show users messaging during grace period and account hold once per day and provide them an opportunity to fix their payment without leaving the app.

We recommend that you call this API whenever the user opens the app to determine whether the message should be shown.
If the user successfully recovered their subscription, you will receive a response code of SUBSCRIPTION_STATUS_UPDATED along with a purchase token. You should then use this purchase token to call the Google Play Developer API and refresh the subscription status in your app.
Integrate in-app messaging
To show in-app messaging to user, use BillingClient.showInAppMessages() .
Here is an example of triggering the in-app messaging flow:
কোটলিন
val inAppMessageParams = InAppMessageParams.newBuilder() .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL) .build() billingClient.showInAppMessages(activity, inAppMessageParams, object : InAppMessageResponseListener() { override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) { if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) { // The flow has finished and there is no action needed from developers. } else if (inAppMessageResult.responseCode == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) { // The subscription status changed. For example, a subscription // has been recovered from a suspend state. Developers should // expect the purchase token to be returned with this response // code and use the purchase token with the Google Play // Developer API. } } })
জাভা
InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder() .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL) .build(); billingClient.showInAppMessages(activity, inAppMessageParams, new InAppMessageResponseListener() { @Override public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) { if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) { // The flow has finished and there is no action needed from developers. } else if (inAppMessageResult.responseCode == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) { // The subscription status changed. For example, a subscription // has been recovered from a suspend state. Developers should // expect the purchase token to be returned with this response // code and use the purchase token with the Google Play // Developer API. } } });
Handle subscription pending transactions
Pending transactions can happen in initial purchase, top-up, upgrade or downgrade. The subscription purchase starts with the SUBSCRIPTION_STATE_PENDING state before transitioning to SUBSCRIPTION_STATE_ACTIVE . If the transaction is expired or canceled by the user, it goes to SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED . You must and should only update the user's entitlement after the transaction is completed.
Subscription state change for initial purchase with pending transactions is straightforward. Your app receives a Purchase with PENDING state when the user initiates a pending transaction. When the transaction is completed, your app receives the Purchase again with state updated to PURCHASED . A SubscriptionNotification message with type SUBSCRIPTION_PURCHASED is sent to your RTDN client. Follow the normal process to verify the purchase, give the user access to the content and acknowledge the purchase. If the transaction expires or is canceled, a SubscriptionNotification message with type SUBSCRIPTION_PENDING_PURCHASE_CANCELED is sent to your RTDN client. In such cases, the user should never have gained access to the content.
Top-up, upgrade or downgrade with pending transactions involves state changes for both the old and new subscriptions. When the user initiates a pending top-up, upgrade or downgrade transaction, your app receives a Purchase for the old subscription with a PendingPurchaseUpdate object. At this time, the user is still owning the old subscription and has not gained the new subscription yet. Calling getProducts() and getPurchaseToken() on the PendingPurchaseUpdate object returns the product ids and purchase token of the new subscription. When the transaction is completed, your app receives a Purchase with the top-level purchase token set for the new subscription and the state set to PURCHASED . A SubscriptionNotification message with type SUBSCRIPTION_PURCHASED is sent to your RTDN client. Only at this time, you should replace the old purchase token with the new purchase token and update the user's access to the content. If the transaction expires or is canceled, a SubscriptionNotification message with type SUBSCRIPTION_PENDING_PURCHASE_CANCELED is sent to your RTDN client. In such cases, the user should still have access to the content of the old subscription.