সাবস্ক্রিপশন সম্পর্কে

সাবস্ক্রিপশন লাইফসাইকেল ইভেন্ট, যেমন রিনিউয়াল ও মেয়াদ শেষ হওয়া কীভাবে ম্যানেজ করতে হয়, তা এই ডকুমেন্টে বর্ণনা করা হয়েছে। এছাড়াও, এটি অতিরিক্ত সাবস্ক্রিপশন ফিচার যেমন, প্রোমোশন অফার করা এবং আপনার ব্যবহারকারীদের নিজেদের সাবস্ক্রিপশন ম্যানেজ করার অনুমতি দেওয়া সম্পর্কে বর্ণনা করে।

আপনার অ্যাপের জন্য সাবস্ক্রিপশন প্রোডাক্ট কনফিগার না করে থাকলে, আপনার প্রোডাক্ট তৈরি ও কনফিগার করুন দেখুন।

সাবস্ক্রিপশন ওভারভিউ

সাবস্ক্রিপশন হল একটি রেকারিং ট্রানজ্যাকশন যা ব্যবহারকারীদের নির্দিষ্ট এনটাইটেলমেন্ট প্রদান করে। এনটাইটেলমেন্ট হল কিছু সুবিধা যা ব্যবহারকারীরা একটি নির্দিষ্ট সময়সীমার মধ্যে অ্যাক্সেস করতে পারেন। যেমন, সাবস্ক্রিপশন নিলে ব্যবহারকারী প্রিমিয়াম অ্যাক্সেস পেতে পারেন।

বেস প্ল্যান ও অফারের মাধ্যমে, আপনি একই সাবস্ক্রিপশন প্রোডাক্টের জন্য একাধিক কনফিগারেশন তৈরি করতে পারবেন। যেমন, আপনার অ্যাপে কখনও সাবস্ক্রাইব করেননি এমন ব্যবহারকারীদের জন্য আপনি একটি প্রাথমিক অফার তৈরি করতে পারেন। একইভাবে, আগে থেকেই সাবস্ক্রাইব করেছেন এমন ব্যবহারকারীদের জন্য আপনি একটি আপগ্রেড অফার তৈরি করতে পারেন।

সাবস্ক্রিপশন প্রোডাক্ট, বেস প্ল্যান ও অফারের বিস্তারিত ওভারভিউ পেতে, Play Console সহায়তা কেন্দ্রে ডকুমেন্টেশন দেখুন।

Play Billing Library-তে নিম্নলিখিত সাবস্ক্রিপশনের ধরন কাজ করে:

  • সাবস্ক্রিপশন - এই ধরনের ক্ষেত্রে, একটি এনটাইটেলমেন্টের সাথে সম্পর্কিত একটি আইটেম। যেমন, মিউজিক স্ট্রিমিং পরিষেবার সাবস্ক্রিপশন।

  • অ্যাড-অন সহ সাবস্ক্রিপশন - এই ধরনের সাবস্ক্রিপশনে, একটি কেনাকাটায় একাধিক আলাদা আলাদা এনটাইটেলমেন্ট বান্ডেল করা থাকতে পারে। যেমন, মিউজিক স্ট্রিমিং পরিষেবা ও ভিডিও সাবস্ক্রিপশন, দু'টিরই সাবস্ক্রিপশন। অ্যাড-অন সহ সাবস্ক্রিপশন সম্পর্কিত তথ্যের জন্য, অ্যাড-অন সহ সাবস্ক্রিপশন দেখুন।

প্রিপেড প্ল্যান ইন্টিগ্রেশন

মেয়াদ শেষ হয়ে গেলে প্রিপেড প্ল্যান অটোমেটিক রিনিউ হয় না। সাবস্ক্রিপশন এনটাইটেলমেন্টের মেয়াদ নির্বিঘ্নে বাড়াতে, ব্যবহারকারীকে একই সাবস্ক্রিপশনের জন্য প্রিপেড প্ল্যান টপ-আপ করতে হবে।

টপ-আপের জন্য, আসল কেনাকাটার মতো বিলিং ফ্লো চালু করুন। কেনাকাটা যে টপ-আপ, তা আপনাকে উল্লেখ করতে হবে না।

প্রিপেড প্ল্যান টপ-আপে সবসময় CHARGE_FULL_PRICE রিপ্লেসমেন্ট মোড ব্যবহার করা হয় এবং আপনাকে এই মোড আলাদা করে সেট করতে হয় না। ব্যবহারকারীকে অবিলম্বে সম্পূর্ণ বিলিং মেয়াদের জন্য চার্জ করা হয় এবং টপ-আপে উল্লেখ করা মেয়াদ অনুযায়ী তার এনটাইটেলমেন্টের মেয়াদ বাড়ানো হয়।

টপ-আপ করার পরে, Purchase result object-এর নিম্নলিখিত ফিল্ডগুলি সবচেয়ে সাম্প্রতিক টপ-আপ কেনাকাটা দেখাতে আপডেট করা হয়:

  • অর্ডার আইডি
  • কেনাকাটার সময়
  • স্বাক্ষর
  • পার্চেজ টোকেন
  • স্বীকৃত

নিম্নলিখিত Purchase ফিল্ডে সবসময় মূল কেনাকাটা সংক্রান্ত একই ডেটা থাকে:

  • প্যাকেজের নাম
  • কেনাকাটার স্ট্যাটাস
  • প্রোডাক্ট
  • অটোমেটিক রিনিউ করা

প্রিপেড কেনাকাটা সংক্রান্ত স্বীকৃতি

অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশনের মতো, আপনাকে কেনার পরে প্রিপেড প্ল্যান কনফার্ম করতে হবে। প্রাথমিক কেনাকাটা ও টপ-আপ, দু'টিই স্বীকার করতে হবে। আরও তথ্যের জন্য, কেনাকাটা প্রসেস করা দেখুন।

প্রিপেড প্ল্যানের মেয়াদ কম হওয়ার সম্ভাবনা থাকার কারণে, যত শীঘ্র সম্ভব কেনাকাটা স্বীকার করা গুরুত্বপূর্ণ।

এক সপ্তাহ বা তার বেশি মেয়াদের প্রিপেড প্ল্যান তিন দিনের মধ্যে অনুমোদন করতে হবে।

এক সপ্তাহের কম মেয়াদের প্রিপেড প্ল্যান, প্ল্যানের মেয়াদের অর্ধেক সময়ের মধ্যে কনফার্ম করতে হবে। যেমন, তিন দিনের প্রিপেড প্ল্যান সম্পর্কে ডেভেলপারদের কাছে উত্তর দেওয়ার জন্য ১.৫ দিন সময় থাকে।

ইনস্টলমেন্ট সাবস্ক্রিপশন ইন্টিগ্রেশন

ইনস্টলমেন্ট সাবস্ক্রিপশন হল এক ধরনের সাবস্ক্রিপশন যেখানে ব্যবহারকারীরা সাবস্ক্রিপশনের জন্য এককালীন সম্পূর্ণ ফি না দিয়ে, একটি নির্দিষ্ট সময়সীমা ধরে একাধিক ইনস্টলমেন্টে পেমেন্ট করেন।

ইনস্টলমেন্ট সাবস্ক্রিপশনের ক্ষেত্রে অতিরিক্ত বিবেচ্য বিষয়:

  • কোন কোন দেশে উপলভ্য: কিস্তিতে সাবস্ক্রিপশন ফিচারটি শুধুমাত্র ব্রাজিল, ফ্রান্স, ইতালি ও স্পেনে উপলভ্য (লেটেস্ট উপলভ্যতা জানতে Console চেক করুন)।
  • দাম সেট করা: কনসোলে কিস্তিতে সাবস্ক্রিপশনের দাম সেট করার সময়, দামটি মাসিক পেমেন্টের পরিমাণকে বোঝায়। এটি, সেট করা কমিটমেন্ট পিরিয়ডের সাথে মিলিত হয়ে, কেনাকাটা স্ক্রিনে সাবস্ক্রিপশনের মোট পরিমাণ তৈরি করে।
  • কমিটমেন্টের মেয়াদ: প্রাথমিক সাবস্ক্রিপশনের মোট মেয়াদ কমিটমেন্ট, যার মধ্যে মাসিক পেমেন্ট করতে হয়। যেমন, কোনও বেস প্ল্যানের ১৫ মাসের কমিটমেন্ট পিরিয়ড থাকলে, ব্যবহারকারী এই সময়সীমার মধ্যে ১৫টি মাসিক পেমেন্ট করবেন।
  • রিনিউয়াল: কিস্তিতে সাবস্ক্রিপশনের ক্ষেত্রে, "রিনিউয়াল" শব্দটি প্রাথমিক প্রতিশ্রুতি সময়সীমা বা পরবর্তী প্রতিশ্রুতি সময়সীমা শেষ হয়ে যাওয়াকে বোঝায়। প্রাথমিক সাইন-আপের পরে, প্রাথমিক কমিটমেন্টের সম্পূর্ণ মেয়াদ শেষ হলে প্রথমবার রিনিউ করা হয়। পরবর্তী প্রতিটি কমিটমেন্টের মেয়াদ শেষ হওয়ার পরে পরবর্তী রিনিউয়াল হয়। ইনস্টলমেন্ট সাবস্ক্রিপশনের রিনিউয়াল ধরন হতে পারে "প্রতি মাসে অটোমেটিক রিনিউ হয়" অথবা "একই মেয়াদের জন্য অটোমেটিক রিনিউ হয়"। "প্রতি মাসে অটোমেটিক রিনিউ হয়" বিকল্পের ক্ষেত্রে, কোনও পরবর্তী কমিটমেন্ট থাকে না এবং প্ল্যানটি মাসিক সাবস্ক্রিপশনের মতো আচরণ করে যেখানে প্রতিটি মাসিক সাবস্ক্রিপশন চার্জ রিনিউয়াল হিসেবে বিবেচিত হয়।
  • বিলিং পিরিয়ড: কিস্তিতে সাবস্ক্রিপশনের ক্ষেত্রে, এটি হল সেই রেকারিং ইন্টারভ্যাল যেখানে স্বতন্ত্র পেমেন্ট করা হয়, যেমন বেস প্ল্যানে উল্লেখ করা আছে।
  • প্ল্যান পরিবর্তন বনাম দাম পরিবর্তনের আচরণ: দাম পরিবর্তন ও বাতিলের ক্ষেত্রে, প্রতিশ্রুতি দৃঢ়। এর অর্থ হল, কোনও ব্যবহারকারী যদি বাতিল করতে চান বা কোনও ডেভেলপার যদি দাম পরিবর্তন করতে চান, তাহলে কমিটমেন্টের মেয়াদ শেষ হলে পরিবর্তনটি কার্যকর হবে। প্ল্যান পরিবর্তনের ক্ষেত্রে, প্রতিশ্রুতি নিশ্চিত নয়। এর অর্থ হল, প্ল্যান পরিবর্তনের জন্য কমিটমেন্টের মেয়াদ শেষ হওয়া পর্যন্ত অপেক্ষা করতে হয় না, সেট করা রিপ্লেসমেন্ট মোডের উপর ভিত্তি করে এটি অবিলম্বে বা পরবর্তী পেমেন্ট তারিখে কার্যকর হয়।
  • একই সাবস্ক্রিপশন প্ল্যানে পরিবর্তন: একই সাবস্ক্রিপশন প্রোডাক্টের ইনস্টলমেন্ট বেস প্ল্যান থেকে নন-ইনস্টলমেন্ট বেস প্ল্যানে পরিবর্তন করার অনুমতি নেই।
  • রিয়েল-টাইম ডেভেলপার বিজ্ঞপ্তি (RTDN): A SUBSCRIPTION_CANCELLATION_SCHEDULED কমিটমেন্টের মেয়াদ বাকি থাকাকালীন ব্যবহারকারী বাতিল করার অনুরোধ করলে সঙ্গে সঙ্গে RTDN পাঠানো হয়। বাতিল করার অনুরোধটি এখনও প্রসেস করা হয়নি এবং কমিটমেন্টের মেয়াদ শেষ হলেই এটি কার্যকর হবে। তারপরে, ব্যবহারকারী রিস্টোর না করলে, SUBSCRIPTION_CANCELED এবং SUBSCRIPTION_EXPIRED RTDN গুলি কমিটমেন্ট পিরিয়ডের শেষে পাঠানো হয়।

  • পেমেন্ট / উপার্জন প্রাপ্তি: ব্যবহারকারীরা মাসিক পেমেন্ট করলে, অন্যান্য সব সাবস্ক্রিপশনের মতো একই শর্তাবলী মেনে ডেভেলপারদের পেমেন্ট করা হবে। ব্যবহারকারী কিস্তিতে সাবস্ক্রিপশন নিলে, ডেভেলপারকে আগাম পেমেন্ট করা হয় না।

  • পেমেন্ট সংগ্রহ করতে না পারা: কোনও ব্যবহারকারী কিস্তি সাবস্ক্রিপশনের পেমেন্ট করতে না পারলে, Google বা ডেভেলপার কেউই ব্যবহারকারীর থেকে এই ধরনের কোনও পেমেন্ট সংগ্রহ করার চেষ্টা করবে না। তবে, Google তার সাধারণ পেমেন্ট আবার চেষ্টা করার প্র্যাক্টিস অনুযায়ী, প্রযোজ্য গ্রেস পিরিয়ড বা অ্যাকাউন্ট হোল্ড পিরিয়ড চলাকালীন পেমেন্ট আবার চেষ্টা করে দেখতে পারে। বাকি থাকা পেমেন্ট পেমেন্টের জন্য Google ডেভেলপারদের কাছে দায়বদ্ধ থাকবে না।

  • Play Billing Library-এর উপলভ্যতা: installmentDetails ফিল্ডটি শুধুমাত্র PBL 7 বা তার পরবর্তী যেকোনও ভার্সনের জন্য উপলভ্য। PBL 5 ও তার পরের ভার্সনের জন্য, queryProductDetails() ব্যবহার করে কিস্তির সাবস্ক্রিপশন ফেরত দেওয়া হয়, কিন্তু সাবস্ক্রিপশনে প্ল্যানের জন্য পেমেন্টের মোট সংখ্যার মতো বিস্তারিত কিস্তির তথ্য অন্তর্ভুক্ত থাকে না।

ব্যবহারকারীদের সাবস্ক্রিপশন ম্যানেজ করার অনুমতি দিতে ডিপ লিঙ্ক ব্যবহার করা

আপনার অ্যাপে সেটিংস বা পছন্দ সংক্রান্ত স্ক্রিনে একটি লিঙ্ক থাকতে হবে যা ব্যবহারকারীদের তাদের সাবস্ক্রিপশন ম্যানেজ করতে দেয়, এটি আপনার অ্যাপের স্বাভাবিক লুক ও ফিলে অন্তর্ভুক্ত করতে পারেন।

যেসব সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে যায়নি সেগুলির জন্য আপনার অ্যাপ থেকে Google Play সাবস্ক্রিপশন সেন্টারে একটি ডিপ লিঙ্ক যোগ করতে পারেন, যা আপনি সাবস্ক্রিপশন রিসোর্সের subscriptionState ফিল্ড ব্যবহার করে নির্ধারণ করতে পারবেন। এর উপর ভিত্তি করে, Play Store সাবস্ক্রিপশন সেন্টারে ডিপ লিঙ্ক করার বিভিন্ন উপায় আছে।

ব্যবহারকারীদের সেই পৃষ্ঠায় ডাইরেক্ট করতে নিম্নলিখিত URL ব্যবহার করুন যেখানে তাদের সব সাবস্ক্রিপশন দেখানো হয়, যেমন ১ ও ২ নম্বর ছবিতে দেখানো হয়েছে:

https://play.google.com/store/account/subscriptions
Play Store সাবস্ক্রিপশন স্ক্রিনে ব্যবহারকারীর Google Play-বিল করা সব সাবস্ক্রিপশনের স্ট্যাটাস দেখানো হয়।
ছবি ১. Play Store সাবস্ক্রিপশন স্ক্রিনে ব্যবহারকারীর Google Play-বিল করা সব সাবস্ক্রিপশনের স্ট্যাটাস দেখানো হয়।


অতিরিক্ত বিবরণ দেখতে সাবস্ক্রিপশনে ট্যাপ করুন।
ছবি ২. অতিরিক্ত বিবরণ দেখতে কোনও সাবস্ক্রিপশনে ট্যাপ করুন।

Play Store সাবস্ক্রিপশন সেন্টার থেকে কোনও বাতিল করা সাবস্ক্রিপশন রিস্টোর করতে এই ডিপ লিঙ্ক ব্যবহারকারীকে সাহায্য করতে পারে।

মেয়াদ শেষ হয়ে যায়নি এমন সাবস্ক্রিপশনের ম্যানেজমেন্ট পৃষ্ঠায় সরাসরি লিঙ্ক করতে, প্যাকেজের নাম এবং কেনা সাবস্ক্রিপশনের সাথে productId যুক্ত থাকা উল্লেখ করুন। আগে থেকে থাকা সাবস্ক্রিপশনের productId প্রোগ্রাম্যাটিক পদ্ধতিতে নির্ধারণ করতে, আপনার অ্যাপের ব্যাকএন্ডে কোয়েরি করুন অথবা কোনও নির্দিষ্ট ব্যবহারকারীর সাথে যুক্ত সাবস্ক্রিপশনের তালিকা পেতে BillingClient.queryPurchasesAsync() কল করুন। প্রতিটি সাবস্ক্রিপশনে সাবস্ক্রিপশন স্ট্যাটাস সংক্রান্ত তথ্যের অংশ হিসেবে সংশ্লিষ্ট productId থাকে। সাবস্ক্রিপশন কেনার সাথে যুক্ত প্রতিটি SubscriptionPurchaseLineItem অবজেক্টে সাবস্ক্রিপশনের সাথে যুক্ত productId ভ্যালু থাকে যা ব্যবহারকারী সেই লাইন আইটেমে কিনেছেন।

ব্যবহারকারীদের নির্দিষ্ট সাবস্ক্রিপশন ম্যানেজমেন্ট স্ক্রিনে ডাইরেক্ট করতে, নিম্নলিখিত URL ব্যবহার করুন, "your-sub-product-id" এবং "your-app-package" যথাক্রমে productId এবং অ্যাপ প্যাকেজের নাম দিয়ে পরিবর্তন করুন:

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

ব্যবহারকারী তারপর পেমেন্ট পদ্ধতি ম্যানেজ করতে এবং বাতিল করা, আবার সাবস্ক্রাইব করা ও পজ করা সহ ফিচার অ্যাক্সেস করতে পারবেন।

ব্যবহারকারীদের সাবস্ক্রিপশন আপগ্রেড, ডাউনগ্রেড বা পরিবর্তন করার অনুমতি দিন

বর্তমান সাবস্ক্রাইবারদের প্রয়োজন আরও ভালোভাবে মেটানোর জন্য তাদের সাবস্ক্রিপশন প্ল্যান পরিবর্তন করার বিভিন্ন বিকল্প আপনি দিতে পারেন:

  • আপনি যদি "বেসিক" ও "প্রিমিয়াম" সাবস্ক্রিপশনের মতো একাধিক সাবস্ক্রিপশন টিয়ার বিক্রি করেন, তাহলে আপনি ব্যবহারকারীদের অন্য সাবস্ক্রিপশনের বেস প্ল্যান বা অফার কিনে টিয়ার পরিবর্তন করার অনুমতি দিতে পারেন।
  • আপনি ব্যবহারকারীদের বর্তমান বিলিংয়ের মেয়াদ পরিবর্তন করার অনুমতি দিতে পারেন, যেমন মাসিক থেকে বার্ষিক প্ল্যানে পরিবর্তন করা।
  • এছাড়াও, আপনি ব্যবহারকারীদের অটোমেটিক রিনিউয়াল ও প্রিপেড প্ল্যানের মধ্যে পরিবর্তন করার অনুমতি দিতে পারেন।

উপযুক্ত ব্যবহারকারীদের ডিসকাউন্ট দিয়ে আপনি এইসব পরিবর্তন করতে উৎসাহিত করতে পারেন। যেমন, আপনি মাসিক থেকে বার্ষিক প্ল্যানে সুইচ করলে প্রথম বছরে ৫০% ছাড় দেওয়ার অফার তৈরি করতে পারেন এবং এই অফারটি মাসিক প্ল্যানের সাবস্ক্রাইবারদের মধ্যে সীমাবদ্ধ রাখতে পারেন যারা এই অফারটি কিনেননি। অফার সংক্রান্ত যোগ্যতার মাপকাঠি সম্পর্কে আরও তথ্য সহায়তা কেন্দ্রে উপলভ্য

ছবি ৩-এ তিনটি আলাদা আলাদা প্ল্যান সহ একটি অ্যাপের উদাহরণ দেখানো হয়েছে:

এই অ্যাপে তিনটি সাবস্ক্রিপশন লেভেল আছে..
ছবি ৩. এই অ্যাপে তিনটি সাবস্ক্রিপশন লেভেল আছে।

আপনার অ্যাপে ৩ নম্বর ছবির মতো স্ক্রিন দেখানো হতে পারে, যেখানে ব্যবহারকারীদের সাবস্ক্রিপশন পরিবর্তন করার বিকল্প দেওয়া হবে। সব ক্ষেত্রেই, ব্যবহারকারীর বর্তমান সাবস্ক্রিপশন প্ল্যান কী এবং সেটি পরিবর্তন করার জন্য কী কী বিকল্প আছে তা ব্যবহারকারীর কাছে স্পষ্ট হতে হবে।

ব্যবহারকারী সাবস্ক্রিপশন আপগ্রেড, ডাউনগ্রেড বা পরিবর্তন করার সিদ্ধান্ত নিলে, আপনি পরিবর্তন মোড নির্দিষ্ট করেন যা নির্ধারণ করে যে কীভাবে বর্তমান পেমেন্ট করা বিলিং পিরিয়ডের প্রোরেটেড ভ্যালু প্রয়োগ করা হয় এবং কখন কোনও এনটাইটেলমেন্ট পরিবর্তন ঘটে।

রিপ্লেসমেন্ট মোড

নিচে দেওয়া সারণীতে উপলভ্য রিপ্লেসমেন্ট মোড ও তার ব্যবহারের উদাহরণ এবং কতগুলি পেমেন্টকে 'পেমেন্ট করা হয়েছে' হিসেবে বিবেচনা করা হয় তা উল্লেখ করা হয়েছে।

পরিবর্তন করার মোড

বর্ণনা

ব্যবহারের উদাহরণ

কমিট করা পেমেন্ট 'পেমেন্ট করা হয়েছে' হিসেবে রেকর্ড করা হয়েছে (ইনস্টলমেন্ট সাবস্ক্রিপশন রিপ্লেসমেন্টের জন্য)

WITH_TIME_PRORATION

সাবস্ক্রিপশন আইটেম সঙ্গে সঙ্গে আপগ্রেড বা ডাউনগ্রেড করা হয়। দুটি সাবস্ক্রিপশনের দামের পার্থক্যের ভিত্তিতে বাকি থাকা সময় অ্যাডজাস্ট করা হয় এবং পরবর্তী বিলিং তারিখ এগিয়ে এনে নতুন সাবস্ক্রিপশনে ক্রেডিট করা হয়। এটি হল ডিফল্ট অ্যাকশন।

কোনও অতিরিক্ত পেমেন্ট না করেই আরও বেশি দামের টিয়ারে আপগ্রেড করুন।

0

CHARGE_PRORATED_PRICE

সাবস্ক্রিপশন আইটেমটি সঙ্গে সঙ্গে আপগ্রেড করা হয় এবং বিলিং চক্র একই থাকে। বাকি সময়ের জন্য দামের পার্থক্য ব্যবহারকারীর থেকে চার্জ করা হয়।

মনে রাখবেন: এই বিকল্পটি শুধুমাত্র সাবস্ক্রিপশন আইটেম আপগ্রেডের জন্য উপলভ্য, যেখানে প্রতি একক সময়ের দাম বেড়ে যায়।

বিলিং তারিখ পরিবর্তন না করেই আরও বেশি দামের টিয়ারে আপগ্রেড করুন।

1

CHARGE_FULL_PRICE

সাবস্ক্রিপশন আইটেমটি সঙ্গে সঙ্গে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং নতুন এনটাইটেলমেন্টের জন্য ব্যবহারকারীকে সঙ্গে সঙ্গে সম্পূর্ণ মূল্য চার্জ করা হয়। আগের সাবস্ক্রিপশনের বাকি থাকা ভ্যালু একই এনটাইটেলমেন্টের জন্য ক্যারি ওভার করা হয় অথবা অন্য এনটাইটেলমেন্টে পরিবর্তন করার সময় প্রো-রেট করা হয়।

মনে রাখবেন: নতুন সাবস্ক্রিপশনে ফ্রি ট্রায়াল বা প্রারম্ভিক অফার থাকলে, আপগ্রেড বা ডাউনগ্রেড করার সময় ব্যবহারকারীকে $০ বা প্রারম্ভিক অফারের দাম, যেটি প্রযোজ্য হবে, সেটি চার্জ করা হবে।

কম সময়ের বিলিং পিরিয়ড থেকে বেশি সময়ের বিলিং পিরিয়ডে আপগ্রেড করা।

১ (মনে রাখবেন: নতুন সাবস্ক্রিপশনে ফ্রি ট্রায়াল থাকলে ০)

WITHOUT_PRORATION

সাবস্ক্রিপশন আইটেমটি সঙ্গে সঙ্গে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং সাবস্ক্রিপশন রিনিউ করার সময় নতুন দাম চার্জ করা হয়। বিলিং চক্র একই থাকে।

বাকি থাকা ফ্রি পিরিয়ড বজায় রেখে উন্নত লেভেলের সাবস্ক্রিপশনে আপগ্রেড করুন।

0

DEFERRED

সাবস্ক্রিপশন রিনিউ হলেই সাবস্ক্রিপশন আইটেম আপগ্রেড বা ডাউনগ্রেড করা হয়, তবে নিম্নলিখিত দুটি আইটেম সহ নতুন কেনাকাটা সঙ্গে সঙ্গে ইস্যু করা হয়:

  • অটোমেটিক রিনিউ বন্ধ করা আছে এবং বর্তমান বিলিং চক্রের শেষে মেয়াদ শেষ হয়ে যাবে এমন আইটেম।
  • আগেকার আইটেমের মেয়াদ শেষ হওয়ার পরে নতুন এনটাইটেলমেন্ট শুরু হয়। ব্যবহারকারীরা চাইলে আপনি তাদের অতিরিক্ত পরিবর্তন করার অনুমতি দিতে পারেন। যেমন, ব্যবহারকারী আসল প্ল্যানে ফিরে যেতে পারেন অথবা নতুন ডেফার্ড প্ল্যান পরিবর্তন শুরু করতে পারেন।

মনে রাখবেন: কিস্তিতে সাবস্ক্রিপশনের ক্ষেত্রে, পরবর্তী পেমেন্ট তারিখের শুরুতে প্ল্যান পরিবর্তন করা হয়।

কম খরচের টিয়ারে ডাউনগ্রেড করুন।

1

KEEP_EXISTING

পরিবর্তিত আইটেমের ক্ষেত্রে সাবস্ক্রিপশন আইটেমের পেমেন্ট শিডিউল অপরিবর্তিত থাকে।

নির্দিষ্ট আইটেম অপরিবর্তিত রাখা উচিত হলে অ্যাড-অন সহ সাবস্ক্রিপশন থেকে সাবস্ক্রিপশন আইটেম যোগ করা বা সরানো।

N/A

আপগ্রেড বা ডাউনগ্রেড অফারের বিভিন্ন আপসেল ও উইনব্যাক অ্যাপ্লিকেশন সম্পর্কে আরও জানতে, অফার ও প্রোমোশন গাইড পড়ুন।

কেনাকাটার জন্য রিপ্লেসমেন্ট মোড সেট করা

আপনার পছন্দ ও ব্যবসায়িক যুক্তির উপর ভিত্তি করে, সাবস্ক্রিপশন ট্রানজিশনের বিভিন্ন ধরনের জন্য আপনি আলাদা আলাদা রিপ্লেসমেন্ট মোড ব্যবহার করতে পারবেন। এই বিভাগে সাবস্ক্রিপশনে পরিবর্তন করার জন্য কীভাবে একটি রিপ্লেসমেন্ট মোড সেট করতে হয় এবং প্রযোজ্য সীমাবদ্ধতা সম্পর্কে ব্যাখ্যা করা হয়েছে।

একই সাবস্ক্রিপশনের মধ্যে আবার সাবস্ক্রাইব করা বা প্ল্যান পরিবর্তন করা

আপনি Google Play Console-এ একটি ডিফল্ট রিপ্লেসমেন্ট মোড নির্দিষ্ট করতে পারবেন। এই সেটিং আপনাকে বেছে নিতে দেয় যে বর্তমান সাবস্ক্রাইবাররা একই সাবস্ক্রিপশনের জন্য আলাদা বেস প্ল্যান বা অফার কিনলে অথবা বাতিল করার পরে আবার সাবস্ক্রাইব করলে কখন চার্জ করা হবে। উপলভ্য বিকল্পগুলি হল অবিলম্বে চার্জ করুন, যা CHARGE_FULL_PRICE-এর সমতুল্য এবং পরবর্তী বিলিং তারিখে চার্জ করুন, যা WITHOUT_PRORATION-এর সমতুল্য। একই সাবস্ক্রিপশনের মধ্যে বেস প্ল্যান পরিবর্তন করার সময় এগুলিই হল একমাত্র প্রাসঙ্গিক রিপ্লেসমেন্ট মোড।

যেমন, কোনও ব্যবহারকারী বাতিল করার পরে কিন্তু সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে আপনি যদি একই প্ল্যানের জন্য উইনব্যাক অফার প্রয়োগ করেন, তাহলে আপনি নতুন কেনাকাটা SubscriptionUpdateParams-এ কোনও ভ্যালু না দেখিয়েই সাধারণ কেনাকাটা হিসেবে প্রসেস করতে পারবেন। সাবস্ক্রিপশনে আপনি যে ডিফল্ট রিপ্লেসমেন্ট মোড কনফিগার করেছেন, সিস্টেম সেটি ব্যবহার করে এবং পুরনো কেনাকাটা থেকে নতুন কেনাকাটায় প্ল্যান ট্রানজিশন অটোমেটিক ম্যানেজ করে।

সাবস্ক্রিপশন জুড়ে প্ল্যান পরিবর্তন করা বা ডিফল্ট রিপ্লেসমেন্ট মোড ওভাররাইড করা

ব্যবহারকারী যদি সাবস্ক্রিপশন প্রোডাক্ট পরিবর্তন করেন—অন্য সাবস্ক্রিপশন কেনেন—অথবা আপনি যদি কোনও কারণে ডিফল্ট রিপ্লেসমেন্ট মোড ওভাররাইড করতে চান, তাহলে আপনি পারচেজ ফ্লো প্যারামিটারের অংশ হিসেবে রানটাইমে প্রোরেশন রেট নির্দিষ্ট করেন।

আপনার রানটাইম কেনাকাটা ফ্লো কনফিগারেশনের অংশ হিসেবে SubscriptionProductReplacementParams বা SubscriptionUpdateParams-এ ReplacementMode সঠিকভাবে প্রদান করতে, নিম্নলিখিত বিধিনিষেধগুলি মনে রাখবেন:

  • আপগ্রেড, ডাউনগ্রেড বা একই সাবস্ক্রিপশন পাল্টানোর সময় প্রিপেড প্ল্যান থেকে প্রিপেড প্ল্যান, অটোমেটিক রিনিউ হওয়া প্ল্যান বা ইনস্টলমেন্ট প্ল্যানে পাল্টানোর সময়, একমাত্র অনুমোদিত রিপ্লেসমেন্ট মোড হল CHARGE_FULL_PRICE আপনি অন্য কোনও রিপ্লেসমেন্ট মোড নির্দিষ্ট করলে, কেনাকাটা সম্পূর্ণ হয় না এবং ব্যবহারকারীকে একটি error দেখানো হয়।
  • একই সাবস্ক্রিপশনের মধ্যে প্ল্যান পরিবর্তন করে কোনও প্রিপেড প্ল্যান বা অটোমেটিক রিনিউ হওয়া প্ল্যান থেকে অটোমেটিক রিনিউ হওয়া প্ল্যানে পরিবর্তন করলে, বৈধ প্রোরেশন মোড হল CHARGE_FULL_PRICE ও WITHOUT_PRORATION। আপনি অন্য কোনও প্রোরেশন মোড উল্লেখ করলে, কেনাকাটা সম্পূর্ণ হবে না এবং ব্যবহারকারীকে একটি সমস্যা দেখানো হবে।
  • একই সাবস্ক্রিপশন প্রোডাক্টের মধ্যে কিস্তির বেস প্ল্যান থেকে কিস্তি ছাড়া বেস প্ল্যানে পরিবর্তন করা যায় না।
  • রিপ্লেসমেন্টের সময় কোনও আইটেমের পেমেন্ট অপরিবর্তিত রাখতে SubscriptionProductReplacementParams-এ KEEP_EXISTINGরিপ্লেসমেন্ট মোড ব্যবহার করলে, পুরনো প্রোডাক্ট আইডি ও নতুন প্রোডাক্টের প্রোডাক্ট আইডি একই হতে হবে। SubscriptionUpdateParams-এ KEEP_EXISTING মোড কাজ করে না।

পরিবর্তনের উদাহরণ ও আচরণ

প্রতিটি প্রোরেশন মোড কীভাবে কাজ করে তা বুঝতে, নিম্নলিখিত পরিস্থিতি বিবেচনা করুন:

কান্ট্রি গার্ডেনার অ্যাপ থেকে স্যামওয়াইজের অনলাইন কন্টেন্টের সাবস্ক্রিপশন আছে। তিনি কন্টেন্টের লেভেল ১ ভার্সনের মাসিক সাবস্ক্রিপশন নিয়েছেন, যেটি শুধুমাত্র টেক্সট-ভিত্তিক। এই সাবস্ক্রিপশনের জন্য তাকে প্রতি মাসে$২ দিতে হয় এবং এটি মাসের প্রথম তারিখে রিনিউ হয়।

১৫ এপ্রিল, স্যামওয়াইজ Tier 2 সাবস্ক্রিপশনের বার্ষিক ভার্সনে আপগ্রেড করার বিকল্প বেছে নেন, এতে ভিডিও আপডেট অন্তর্ভুক্ত এবং এর খরচ প্রতি বছর$৩৬।

সাবস্ক্রিপশন আপগ্রেড করার সময়, ডেভেলপার একটি প্রোরেশন মোড বেছে নেন। নিচের তালিকা থেকে বোঝা যাবে যে প্রতিটি প্রোরেশন মোড কীভাবে Samwise-এর সাবস্ক্রিপশনকে প্রভাবিত করে:

WITH_TIME_PRORATION

Samwise-এর লেভেল ১ সাবস্ক্রিপশন সঙ্গে সঙ্গে শেষ হয়ে যায়। কারণ তিনি পুরো মাসের (১-৩০ এপ্রিল) জন্য পেমেন্ট করেছেন, কিন্তু সাবস্ক্রিপশন মেয়াদের মাঝামাঝি সময়ে আপগ্রেড করেছেন, তাই অর্ধেক মাসের সাবস্ক্রিপশন ফি ($১) তার নতুন সাবস্ক্রিপশনে প্রযোজ্য হবে। তবে, যেহেতু নতুন সাবস্ক্রিপশনের জন্য প্রতি বছর $৩৬ খরচ হয়, তাই $১ ক্রেডিট ব্যালেন্স দিয়ে শুধুমাত্র ১০ দিনের (১৬-২৫ এপ্রিল) পেমেন্ট করা যায়; তাই ২৬ এপ্রিল, নতুন সাবস্ক্রিপশনের জন্য তাকে $৩৬ চার্জ করা হয় এবং পরের বছরগুলিতেও ২৬ এপ্রিল $৩৬ চার্জ করা হয়।

কেনাকাটা সফল হওয়ার সাথে সাথেই আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত এবং আপনি queryPurchasesAsync() কলের অংশ হিসেবে নতুন কেনাকাটা রিকভার করতে পারবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পায়।

CHARGE_PRORATED_PRICE

এই মোড ব্যবহার করা যেতে পারে কারণ লেভেল ২ সাবস্ক্রিপশনের প্রতি টাইম ইউনিটের দাম ($৩৬/বছর = $৩/মাস) লেভেল ১ সাবস্ক্রিপশনের প্রতি টাইম ইউনিটের দামের ($২/মাস) থেকে বেশি। Samwise-এর লেভেল ১ সাবস্ক্রিপশন সঙ্গে সঙ্গে শেষ হয়ে যায়। কারণ তিনি পুরো মাসের জন্য পেমেন্ট করেছেন কিন্তু অর্ধেক মাস ব্যবহার করেছেন, তাই এক মাসের সাবস্ক্রিপশনের ($১) অর্ধেক তার নতুন সাবস্ক্রিপশনে প্রয়োগ করা হয়েছে। তবে, যেহেতু নতুন সাবস্ক্রিপশনের জন্য প্রতি বছর $৩৬ খরচ হয়, তাই বাকি ১৫ দিনের জন্য $১.৫০ খরচ হয়; তাই তার নতুন সাবস্ক্রিপশনের জন্য দাম $০.৫০ বেশি নেওয়া হয়। ১ মে তারিখে, স্যামওয়াইজকে তার নতুন সাবস্ক্রিপশন টিয়ারের জন্য $৩৬ চার্জ করা হয় এবং এর পরের বছরগুলিতেও ১ মে তারিখে $৩৬ চার্জ করা হয়।

কেনাকাটা সফল হওয়ার সাথে সাথেই আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত এবং আপনি queryPurchasesAsync() কলের অংশ হিসেবে নতুন কেনাকাটা রিকভার করতে পারবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পায়।

WITHOUT_PRORATION

Samwise-এর লেভেল ১ সাবস্ক্রিপশন কোনও অতিরিক্ত চার্জ ছাড়াই সঙ্গে সঙ্গে লেভেল ২-এ আপগ্রেড করা হয় এবং ১ মে তারিখে তার নতুন সাবস্ক্রিপশন লেভেলের জন্য $৩৬ চার্জ করা হয় এবং পরের বছর ১ মে তারিখে আরও $৩৬ চার্জ করা হয়।

কেনাকাটা সফল হওয়ার সাথে সাথেই আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত এবং আপনি queryPurchasesAsync() কলের অংশ হিসেবে নতুন কেনাকাটা রিকভার করতে পারবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পায়।

DEFERRED

Samwise-এর লেভেল ১ সাবস্ক্রিপশনের মেয়াদ ৩০ এপ্রিল শেষ না হওয়া পর্যন্ত সেটি চলবে। ১ মে থেকে লেভেল ২ সাবস্ক্রিপশন কার্যকর হয় এবং স্যামওয়াইজকে তার নতুন সাবস্ক্রিপশন টিয়ারের জন্য $৩৬ চার্জ করা হয়।

কেনাকাটা সফল হওয়ার সাথে সাথেই আপনার অ্যাপের PurchasesUpdatedListener কল করা উচিত এবং আপনি queryPurchasesAsync() কলের অংশ হিসেবে নতুন কেনাকাটা রিকভার করতে পারবেন। আপনার ব্যাকএন্ড অবিলম্বে একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পায়। আপনাকে সেই সময়ে অন্য কোনও নতুন কেনাকাটা যেভাবে প্রসেস করতেন, এই কেনাকাটাও সেইভাবেই প্রসেস করতে হবে। বিশেষ করে, নতুন কেনাকাটা সম্পর্কে সম্মতি জানিয়েছেন কিনা তা নিশ্চিত করুন। মনে রাখবেন যে, পুরনো সাবস্ক্রিপশনের মেয়াদ শেষ হলে নতুন সাবস্ক্রিপশনের startTime কার্যকর হয়। সেই সময়, আপনি নতুন সাবস্ক্রিপশন প্ল্যানের জন্য SUBSCRIPTION_RENEWED RTDN পাবেন। হ্যান্ডেল ডিফার্ড রিপ্লেসমেন্ট-এ ReplacementMode.DEFERRED আচরণ সম্পর্কে আরও জানুন।

CHARGE_FULL_PRICE

Samwise-এর লেভেল ১ সাবস্ক্রিপশন সঙ্গে সঙ্গে শেষ হয়ে যায়। তার লেভেল ২ সাবস্ক্রিপশন আজ থেকে শুরু হচ্ছে এবং তাকে $৩৬ চার্জ করা হয়েছে। কারণ তিনি পুরো মাসের জন্য পেমেন্ট করেছেন কিন্তু সেটির অর্ধেকই ব্যবহার করেছেন, তাই এক মাসের সাবস্ক্রিপশনের অর্ধেক ($১) তার নতুন সাবস্ক্রিপশনে প্রয়োগ করা হয়েছে। নতুন সাবস্ক্রিপশনের খরচ $৩৬/বছর হওয়ায়, তার সাবস্ক্রিপশন পিরিয়ডে ১/৩৬তম বছর যোগ করা হবে (~১০ দিন)। তাই, স্যামওয়াইজের পরবর্তী চার্জ আজ থেকে ১ বছর ১০ দিন পরে $৩৬ হবে। এর পরে, তাকে প্রতি বছর $৩৬ চার্জ করা হবে।

প্রোরেশন মোড বেছে নেওয়ার সময়, আমাদের রিপ্লেসমেন্ট সংক্রান্ত সাজেশন পর্যালোচনা করতে ভুলবেন না।

KEEP_EXISTING

স্যামওয়াইজের কাছে Country Gardener অ্যাপ থেকে অনলাইন কন্টেন্টের সাবস্ক্রিপশন আছে। তিনি সাধারণ কন্টেন্টের জন্য প্ল্যান ১-এর মাসিক সাবস্ক্রিপশন নিয়েছেন। এই সাবস্ক্রিপশনের শুরুর দিকের দাম ৩ মাসের জন্য প্রতি মাসে $২ এবং তারপর প্রতি মাসে $৪। স্যামওয়াইজ এটি ১ এপ্রিল কিনেছেন। Country Gardener অ্যাপে প্ল্যান ২-এর সাথে অ্যাড-অন হিসেবে বিশেষ কন্টেন্ট প্রতি মাসে $৩-এ পাওয়া যায়। ১৫ এপ্রিল, স্যামওয়াইজ আগে থেকে থাকা প্ল্যান ১ রেখে Country Gardener অ্যাপের সাবস্ক্রিপশনে প্ল্যান ২ যোগ করেছেন। Samwise-এর পেমেন্ট শিডিউল নিচে দেওয়া হল:

  • প্ল্যান ২-এর জন্য প্রোরেট করা দাম $১.৫০, যা ১৫ এপ্রিল দিতে হবে।
  • পরবর্তী ২ মাসের জন্য $৫.০০/মাস, যার মধ্যে প্ল্যান ১-এর প্রাথমিক মূল্য এবং প্ল্যান ২-এর নিয়মিত মূল্য অন্তর্ভুক্ত।
  • এর পরে, প্রতি মাসে $৭.০০ করে পেমেন্ট করতে হবে।

অ্যাপ-মধ্যস্থ সাবস্ক্রিপশনে পরিবর্তন ট্রিগার করা

আপনার অ্যাপ, ব্যবহারকারীদের কেনাকাটার প্রসেস লঞ্চ করার মতো একই ধাপ ব্যবহার করে আপগ্রেড বা ডাউনগ্রেড অফার করতে পারে। তবে, আপগ্রেড বা ডাউনগ্রেড করার সময়, আপনাকে বর্তমান সাবস্ক্রিপশন, ভবিষ্যতের (আপগ্রেড বা ডাউনগ্রেড করা) সাবস্ক্রিপশন এবং ব্যবহার করার জন্য রিপ্লেসমেন্ট মোডের বিবরণ দিতে হবে।

বদলানোর জন্য 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 সাবস্ক্রিপশনে অবিলম্বে যোগ করা হয়।

Kotlin

val billingClient: BillingClient = this.billingClient
val replacementModeForBasePlan: Int = SubscriptionProductReplacementParams.ReplacementMode.KEEP_EXISTING
val replacementModeForAddon: Int = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE

val purchaseTokenOfExistingSubscription: String = "your_old_purchase_token"

// ProductDetails instances obtained from queryProductDetailsAsync();

val productDetailsParams1 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails1) // Required: Set the ProductDetails object
        .setSubscriptionProductReplacementParams(
            SubscriptionProductReplacementParams.newBuilder()
                .setOldProductId("old_product_id_1")
                .setReplacementMode(replacementModeForBasePlan)
                .build()
        )
        .build()

val productDetailsParams2 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails2) // 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) // 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 = ...;

ArrayList newProductDetailsList = 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 ব্যবহার করে সাবস্ক্রিপশন আপডেট করতে হয়।

Kotlin

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 Developer API, কোনও কেনাকাটা আগে থেকে থাকা সাবস্ক্রিপশনকে পরিবর্তন করলে, linkedPurchaseToken রিটার্ন করে। সাবস্ক্রিপশন রিসোর্স আইটেম লেভেল রিপ্লেসমেন্টের বিবরণ বুঝতে, আপনি নতুন কেনাকাটায় SubscriptionPurchaseLineItem-এর মধ্যে itemReplacement চেক করতে পারেন। এছাড়াও, কাস্টমাইজ করা ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে, নতুন সাবস্ক্রিপশনের জন্য offerPhase ফিল্ড ব্যবহার করে বর্তমান অফারের ফেজ (যেমন, প্রোরেশন পিরিয়ড বা ফ্রি ট্রায়াল) শনাক্ত করতে পারবেন। আপনার পরিষেবায় অ্যাক্সেস পাওয়ার জন্য পুরনো টোকেন ব্যবহার করা হচ্ছে না তা নিশ্চিত করতে, linkedPurchaseToken-এ প্রদান করা টোকেনটি বাতিল করতে ভুলবেন না। আপগ্রেড ও ডাউনগ্রেড সংক্রান্ত কেনাকাটা ম্যানেজ করা সম্পর্কে তথ্য পেতে আপগ্রেড, ডাউনগ্রেড ও আবার সাইন-আপ করা দেখুন।

আপনি নতুন কেনাকাটা টোকেন পেলে, নতুন কেনাকাটা টোকেন যাচাই করার মতো একই যাচাইকরণ প্রসেস অনুসরণ করুন। Google Play Billing Library থেকে BillingClient.acknowledgePurchase() অথবা Google Play Developer API থেকে Purchases.subscriptions:acknowledge ব্যবহার করে এইসব কেনাকাটা কনফার্ম করতে ভুলবেন না।

হ্যান্ডেল পরিবর্তন করার কাজ পিছিয়ে দেওয়া হয়েছে

ডেফার্ড রিপ্লেসমেন্ট মোড আপনাকে নতুন প্ল্যান শুরু করার আগে পুরনো প্ল্যানের বাকি এনটাইটেলমেন্ট ব্যবহার করতে দেয়।

নতুন কেনাকাটার জন্য আপনি ReplacementMode.DEFERRED ব্যবহার করলে, queryPurchasesAsync() কেনাকাটা ফ্লোয়ের পরে একটি নতুন কেনাকাটা টোকেন রিটার্ন করে যা ডিফার করা রিপ্লেসমেন্ট পরবর্তী রিনিউয়াল তারিখে না হওয়া পর্যন্ত পুরনো প্রোডাক্টের সাথে যুক্ত থাকে, তারপরে নতুন প্রোডাক্ট রিটার্ন করা হয়।

অতীতে আপনি এই ব্যবহারকারীর অভিজ্ঞতাটি বাতিল করা ProrationMode.DEFERRED-এর মাধ্যমে অর্জন করতে পারতেন, কিন্তু ProrationMode.DEFERRED-কে Play Billing Library 6-এর সাথে বাতিল করা হয়েছে। কোথায় কোথায় আচরণ আলাদা হয় তা বুঝতে নিম্নলিখিত সারণী দেখুন:

সময়

ProrationMode.DEFERRED (বন্ধ করা হয়েছে)

ReplacementMode.DEFERRED

কেনাকাটা সফলভাবে সম্পূর্ণ হওয়ার ঠিক পরে (অ্যাপ)

আপগ্রেড বা ডাউনগ্রেড সফল হয়েছে কিনা তা স্ট্যাটাসের মাধ্যমে কেনাকাটার পরে PurchasesUpdatedListener ইনভোক করা হয়।

পরবর্তী রিনিউ করার তারিখ পর্যন্ত পুরনো প্ল্যানের সুবিধা পাওয়া যাবে। অ্যাপ যাতে সঠিক এনটাইটেলমেন্ট দেয় তা নিশ্চিত করতে, রিপ্লেসমেন্ট না হওয়া পর্যন্ত queryPurchasesAsync() আসল কেনাকাটার টোকেন ও আসল এনটাইটেলমেন্ট সহ একটি কেনাকাটা অবজেক্ট রিটার্ন করে।

নতুন কেনাকাটার টোকেন দেখা যাচ্ছে না, তাই এই মুহূর্তে এটি প্রসেস করা যাবে না।

আপগ্রেড বা ডাউনগ্রেড সফল হয়েছে কিনা তা স্ট্যাটাসের মাধ্যমে কেনাকাটার পরে PurchasesUpdatedListener ইনভোক করা হয়।

queryPurchasesAsync() নতুন পার্চেজ টোকেন সহ কেনাকাটা এবং এর সাথে যুক্ত আসল এনটাইটেলমেন্ট সাথে সাথেই রিটার্ন করে।

নতুন পার্চেজ টোকেন দেখা যাচ্ছে, তাই রিপ্লেসমেন্ট কখন করতে হবে তা বিবেচনা করে এই পর্যায়ে এটি প্রসেস করা উচিত।

কেনাকাটার প্রসেস সম্পূর্ণ হওয়ার সাথে সাথেই (ব্যাকএন্ড)

কেনাকাটার ফ্লো সম্পূর্ণ হওয়ার পরে SUBSCRIPTION_PURCHASED RTDN পাঠানো হয় না। নতুন কেনাকাটার ব্যাপারে ব্যাকএন্ড এখনও অবগত নয়।

নতুন পারচেজ টোকেনের জন্য কেনাকাটার ফ্লো সম্পূর্ণ হওয়ার সাথে সাথেই পুরনো product_id সহ SUBSCRIPTION_PURCHASED RTDN পাঠানো হয়।

নতুন পার্চেজ টোকেন সহ purchases.subscriptionsv2.get মেথড কল করলে, দুটি লাইন আইটেম সহ 'startTime' সহ একটি পার্চেজ রিটার্ন করে যা পার্চেজ টাইম নির্দেশ করে:

  • একটি পুরনো এনটাইটেলমেন্টের প্রতিনিধিত্ব করে এবং ভবিষ্যতে 'expiryTime' আছে। পুরনো এনটাইটেলমেন্ট রিনিউ করা হবে না এবং এতে নতুন এনটাইটেলমেন্টের প্রোডাক্ট সহ DeferredItemReplacement থাকবে। এর অর্থ হল, পুরনো এনটাইটেলমেন্টের মেয়াদ শেষ হয়ে গেলে সেটি পরিবর্তন করা হবে।
  • নতুন কেনা এনটাইটেলমেন্টের জন্য একটি। এটির 'expiryTime' সেট করা নেই।

পুরনো পার্চেজ টোকেনের জন্য SUBSCRIPTION_EXPIRED পাঠানো হয়েছে। পুরনো কেনাকাটার টোকেন সহ purchases.subscriptionsv2.get মেথড কল করলে, এটি মেয়াদ শেষ হয়ে গেছে হিসেবে দেখানো হয় (পুরনো প্ল্যানের এনটাইটেলমেন্ট বাকি সময়ের জন্য নতুন কেনাকাটায় ট্রান্সফার করা হয়)।

পরিবর্তনের পরে - কেনাকাটার ফ্লো (অ্যাপ) অনুসরণ করে প্রথমবার রিনিউ করা

queryPurchasesAsync() নতুন কেনাকাটার টোকেন ও এনটাইটেলমেন্ট সহ একটি নতুন Purchase অবজেক্ট রিটার্ন করে।

নতুন পার্চেজ টোকেন এখন দেখা যাচ্ছে, তাই এটি প্রসেস করা উচিত।

queryPurchasesAsync() নতুন পার্চেজ টোকেন সহ কেনাকাটা অবিলম্বে ফিরিয়ে দেয় এবং এর সাথে যুক্ত নতুন এনটাইটেলমেন্ট দেয়।

কেনাকাটার প্রসেস সম্পূর্ণ হলে, নতুন কেনাকাটা আগেই প্রসেস হয়ে যাওয়া উচিত, তাই সঠিক এনটাইটেলমেন্ট মঞ্জুর করা হয়েছে কিনা তা নিশ্চিত করা ছাড়া অ্যাপের কোনও বিশেষ অ্যাকশন নেওয়ার প্রয়োজন নেই।

পরিবর্তনের পরে - কেনাকাটার ফ্লো (ব্যাকএন্ড) অনুসরণ করে প্রথম রিনিউয়াল

প্রথম SUBSCRIPTION_RENEWED RTDN পাঠানোর পরে নতুন কেনাকাটা প্রসেস করা ও তার ব্যাপারে জানানো যাবে।

সাবস্ক্রিপশন রিসোর্সে থাকা linkedPurchaseToken ব্যবহার করে নির্ধারণ করা যেতে পারে যে আপনার সাবস্ক্রিপশন ব্যাকএন্ডে কোন ব্যবহারকারীকে, প্রযোজ্য হলে, নতুন এনটাইটেলমেন্টের সাথে আপডেট করা উচিত।

নতুন কেনাকাটার জন্য SUBSCRIPTION_PURCHASED RTDN পাঠানো হলে এবং 'startTime' হিসেবে রেকর্ড করা হলে, নতুন কেনাকাটা প্রসেস করা হয় এবং তা স্বীকার করা হয়।

ReplacementMode.DEFERRED-এর ক্ষেত্রে, প্রথম রিনিউয়াল অন্য যেকোনও রিনিউয়ালের স্ট্যান্ডার্ড আচরণ অনুসরণ করে এবং এই ইভেন্ট ঘটলে আপনাকে রিপ্লেসমেন্টের জন্য বিশেষ লজিক হ্যান্ডেল করতে হবে না।

নতুন পার্চেজ টোকেন সহ purchases.subscriptionsv2.get মেথড কল করলে, দুটি লাইন আইটেম সহ একটি পার্চেজ রিটার্ন করে:

  • একটি পুরনো এনটাইটেলমেন্টের প্রতিনিধিত্ব করে, যার `expiryTime` অতীতে সেট করা আছে এবং DeferredItemReplacement-এর জন্য কোনও ভ্যালু সেট করা নেই।
  • একটি নতুন এনটাইটেলমেন্টের প্রতিনিধিত্ব করে, যেখানে ভবিষ্যতে `expiryTime` এবং auto_renewing_enabled ফ্ল্যাগ চালু করা আছে।

এখন থেকে, বাতিল করা ProrationMode.DEFERRED-এর পরিবর্তে ReplacementMode.DEFERRED ব্যবহার করা উচিত, কারণ এটি এনটাইটেলমেন্ট পরিবর্তন সংক্রান্ত একই আচরণ দেখায়, তবে এটি এমনভাবে কেনাকাটা ম্যানেজ করার একটি উপায় অফার করে যা অন্যান্য নতুন কেনাকাটার আচরণের সাথে আরও সামঞ্জস্যপূর্ণ।

গ্রাহক ম্যানেজমেন্ট

রিয়েল-টাইম ডেভেলপার বিজ্ঞপ্তি ব্যবহার করে, কোনও ব্যবহারকারী কখন বাতিল করার সিদ্ধান্ত নেন তা আপনি রিয়েল টাইমে শনাক্ত করতে পারবেন। কোনও ব্যবহারকারী বাতিল করলে, কিন্তু তার সাবস্ক্রিপশন শেষ হওয়ার আগে, আপনি তাকে আবার সাবস্ক্রাইব করার জন্য পুশ বিজ্ঞপ্তি বা ইন-অ্যাপ মেসেজ পাঠাতে পারেন।

কোনও ব্যবহারকারী তার সাবস্ক্রিপশন বাতিল করার পরে, আপনি তাকে আবার ফিরিয়ে আনার চেষ্টা করতে পারেন আপনার অ্যাপে বা Play Store-এর মাধ্যমে। নিচের সারণীতে বিভিন্ন সাবস্ক্রিপশন পরিস্থিতি, সংশ্লিষ্ট উইনব্যাক অ্যাকশন ও অ্যাপ সম্পর্কিত প্রয়োজনীয় বিষয়গুলি বর্ণনা করা হয়েছে।

সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার পরে
অ্যাপ-মধ্যস্থ Play Store-এ অ্যাপ-মধ্যস্থ Play Store-এ
Winback ফিচার অ্যাপ-মধ্যস্থ সাবস্ক্রিপশন ফিরিয়ে আনুন অ্যাপ-মধ্যস্থ সাবস্ক্রিপশন আবার সাবস্ক্রাইব করুন
ব্যবহারকারী চেক-আউট ফ্লো সম্পূর্ণ করেন হ্যাঁ না হ্যাঁ হ্যাঁ
ব্যবহারকারীর সাবস্ক্রিপশন একই SKU-এর সাথে যুক্ত থাকে ব্যবহারকারী একই বা আলাদা SKU-তে সাইন-আপ করতে পারেন হ্যাঁ ব্যবহারকারী একই বা আলাদা SKU-তে সাইন-আপ করতে পারেন হ্যাঁ
নতুন পার্চেজ টোকেন তৈরি করে হ্যাঁ না হ্যাঁ হ্যাঁ
ডিফল্ট হিসেবে চালু করা আছে না হ্যাঁ, সব ডেভেলপারদের জন্য সহায়তা প্রয়োজন না

Billing Library 2.0+ ভার্সন নেই এমন অ্যাপ: না

Billing Library 2.0+ সহ অ্যাপ: হ্যাঁ। ডেভেলপাররা Console থেকে অপ্ট-আউট করতে পারবেন।

ব্যবহারকারীকে চার্জ করা হলে

একই SKU ব্যবহার করলে: বর্তমান বিলিং চক্রের শেষে।

আলাদা SKU ব্যবহার করলে: প্রোরেশন মোডের উপর নির্ভর করে।

বর্তমান বিলিংয়ের মেয়াদ শেষ হওয়ার পরে অবিলম্বে অবিলম্বে
প্রয়োগ করতে হবে আপনার অ্যাপে আবার সাইন-আপ করার UI প্রদান করুন

সাবস্ক্রিপশনের স্ট্যাটাসে পরিবর্তন শনাক্ত করা

Play Store-এ ডিপ লিঙ্ক করা

আপনার অ্যাপে আবার সাইন-আপ করার UI প্রদান করুন অ্যাপের বাইরে করা কেনাকাটা ম্যানেজ করা

সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে - অ্যাপ-মধ্যস্থ

যেসব সাবস্ক্রিপশন বাতিল করা হয়েছে কিন্তু এখনও মেয়াদ শেষ হয়নি, সেগুলির ক্ষেত্রে আপনি নতুন সাবস্ক্রাইবারদের জন্য যেভাবে ইন-অ্যাপ প্রোডাক্ট কেনার প্রসেস প্রয়োগ করেন, ঠিক সেইভাবে আপনার অ্যাপের মধ্যে সাবস্ক্রাইবারদের তাদের সাবস্ক্রিপশন রিস্টোর করার অনুমতি দিতে পারেন। ব্যবহারকারীর আগে থেকেই সাবস্ক্রিপশন আছে কিনা তা আপনার UI-তে দেখানো হচ্ছে কিনা তা নিশ্চিত করুন। যেমন, আপনি হয়ত ব্যবহারকারীর বর্তমান মেয়াদ শেষ হওয়ার তারিখ ও রেকারিং দামের সাথে আবার চালু করুন বোতাম দেখাতে চান।

বেশিরভাগ ক্ষেত্রে, আপনি ব্যবহারকারীকে সেই একই দাম ও SKU অফার করতে চাইবেন যেটিতে তিনি আগে থেকেই সাবস্ক্রাইব করেছেন, যেমন:

  • একই SKU ব্যবহার করে নতুন সাবস্ক্রিপশন কেনার প্রসেস শুরু করুন।
  • নতুন সাবস্ক্রিপশনটি পুরনো সাবস্ক্রিপশনের পরিবর্তে চালু হয় এবং একই মেয়াদ শেষ হওয়ার তারিখে রিনিউ হয়। পুরনো সাবস্ক্রিপশনটি সঙ্গে সঙ্গে মেয়াদ শেষ হয়ে গেছে হিসেবে চিহ্নিত করা হয়।
  • যেমন, অ্যাকিলিসের Example Music App-এর সাবস্ক্রিপশন আছে এবং ১ আগস্ট সেই সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে যাবে। ১০ জুলাই, তিনি এক মাসের সাবস্ক্রিপশনে আবার সাবস্ক্রাইব করেন এবং প্রতি মাসে একই দাম দিতে থাকেন। নতুন সাবস্ক্রিপশন বাকি ক্রেডিট সহ প্রোরেট করা হয়, সাথে সাথেই অ্যাক্টিভ হয়ে যায় এবং এখনও ১ আগস্ট রিনিউ হয়।

আপনি যদি অন্য কোনও দাম অফার করতে চান—যেমন, নতুন ফ্রি ট্রায়াল বা উইনব্যাক ডিসকাউন্ট—তাহলে আপনি ব্যবহারকারীকে অন্য SKU অফার করতে পারেন:

  • রিপ্লেসমেন্ট মোড WITHOUT_PRORATION ব্যবহার করে আলাদা SKU-এর মাধ্যমে আপগ্রেড বা ডাউনগ্রেড শুরু করুন।
  • নতুন সাবস্ক্রিপশনটি পুরনো সাবস্ক্রিপশনের পরিবর্তে চালু হয় এবং একই মেয়াদ শেষ হওয়ার তারিখে রিনিউ হয়। ব্যবহারকারীকে নতুন SKU-এর দাম চার্জ করা হয়, যার মধ্যে কোনও প্রাথমিক অফারও থাকতে পারে। এটি মূল মেয়াদ শেষ হওয়ার তারিখে করা হয়। পুরনো সাবস্ক্রিপশন যদি কোনও গোপন অ্যাকাউন্ট আইডি ব্যবহার করে তৈরি করা হয়ে থাকে, তাহলে আপগ্রেড ও ডাউনগ্রেডের জন্য সেই একই আইডি BillingFlowParams-এ পাস করতে হবে।
  • যেমন, অ্যাকিলিসের Example Music App-এর সাবস্ক্রিপশন আছে এবং ১ আগস্ট সেই সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে যাবে। ১০ জুলাই, তিনি ইন্ট্রোডাক্টরি মূল্যে বার্ষিক সাবস্ক্রিপশনে আবার সাবস্ক্রাইব করেন। নতুন সাবস্ক্রিপশন সঙ্গে সঙ্গে চালু হয়ে যায় এবং ব্যবহারকারীকে ১ আগস্ট পরিচয়মূলক মূল্য চার্জ করা হয়।
  • আপনি যদি নিজের উইনব্যাক SKU-তে ফ্রি ট্রায়াল বা ইন্ট্রোডাক্টরি মূল্য অন্তর্ভুক্ত করার সিদ্ধান্ত নেন, তাহলে Google Play Console-এ প্রতি অ্যাপে একটি ফ্রি ট্রায়ালের অনুমতি দিন বক্সে টিকচিহ্ন সরিয়ে দিয়ে নিশ্চিত করুন যে ব্যবহারকারী উপযুক্ত কিনা, এটি ব্যবহারকারীকে প্রতি অ্যাপে একটি ফ্রি ট্রায়াল পাওয়ার ক্ষেত্রে সীমাবদ্ধ করে।

আপনি কেনাকাটার টোকেন পেলে, নতুন সাবস্ক্রিপশনের ক্ষেত্রে যেভাবে কেনাকাটা প্রসেস করেন, ঠিক সেইভাবে করুন। এছাড়াও, Google Play Developer API সাবস্ক্রিপশন রিসোর্সে linkedPurchaseToken রিটার্ন করে। আপনার পরিষেবা অ্যাক্সেস করার জন্য পুরনো টোকেন ব্যবহার করা হচ্ছে না তা নিশ্চিত করতে, linkedPurchaseToken-এ দেওয়া টোকেনটি বাতিল করতে ভুলবেন না।

সাবস্ক্রিপশন মেয়াদ শেষ হওয়ার আগে - Play Store-এ

সাবস্ক্রিপশন বাতিল করা হলেও সেটি অ্যাক্টিভ থাকলে, ব্যবহারকারীরা Google Play সাবস্ক্রিপশন সেন্টারে গিয়ে আবার সাবস্ক্রাইব করুন (আগে রিস্টোর করুন) বিকল্পে ক্লিক করে সাবস্ক্রিপশন রিস্টোর করতে পারবেন। এর ফলে একই সাবস্ক্রিপশন ও পার্চেজ টোকেন থাকে।

google play store অ্যাপের সাবস্ক্রিপশন বিভাগে
            বাতিল করা সাবস্ক্রিপশন সহ আবার সাবস্ক্রাইব করার বোতাম দেখানো হচ্ছে
ছবি ৮. Google Play Store অ্যাপের মধ্যে থাকা অ্যাকাউন্ট > সাবস্ক্রিপশন বিভাগে বাতিল করা সাবস্ক্রিপশন সহ আবার সাবস্ক্রাইব করুন বোতাম দেখানো হয়।

সাবস্ক্রিপশন ফিরিয়ে আনা সম্পর্কে আরও তথ্যের জন্য, ফিরিয়ে আনা দেখুন।

সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার পরে - অ্যাপ-মধ্যস্থ

নতুন সাবস্ক্রাইবারদের জন্য অ্যাপ-মধ্যস্থ প্রোডাক্ট কেনার যে ফ্লো ব্যবহার করা হয়, সেটিই প্রয়োগ করে আপনি মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রাইবারদের আপনার অ্যাপের মধ্যে আবার সাবস্ক্রাইব করার অনুমতি দিতে পারেন। এগুলি মনে রাখবেন:

  • ব্যবহারকারীদের ছাড় দিতে, আপনি সাবস্ক্রিপশনের জন্য বিশেষ মূল্যের প্রোডাক্ট আইডি অফার করতে পারেন, এটি উইনব্যাক SKU নামেও পরিচিত। আপনি অ্যাপে অফারটি দেখাতে পারেন অথবা অ্যাপের বাইরে ইমেলের মাধ্যমে ব্যবহারকারীকে অফারটি সম্পর্কে জানাতে পারেন।
  • আবার সাবস্ক্রিপশন শুরু করার জন্য, Google Play Billing লাইব্রেরি ব্যবহার করে আপনার Android অ্যাপে কেনাকাটার ফ্লো চালু করুন। নতুন সাবস্ক্রিপশনের ক্ষেত্রে এই একই প্রসেস অনুসরণ করা হয়, তবে আপনি ব্যবহারকারীর জন্য উপলভ্য SKU নির্ধারণ করতে পারবেন।
  • আপনি যদি নিজের উইনব্যাক SKU-তে ফ্রি ট্রায়াল বা ইন্ট্রোডাক্টরি মূল্য অন্তর্ভুক্ত করার সিদ্ধান্ত নেন, তাহলে Google Play Console-এ প্রতি অ্যাপে একটি ফ্রি ট্রায়ালের অনুমতি দিন বক্সে টিকচিহ্ন সরিয়ে দিয়ে নিশ্চিত করুন যে ব্যবহারকারী উপযুক্ত কিনা, এটি ব্যবহারকারীকে প্রতি অ্যাপে একটি ফ্রি ট্রায়াল পাওয়ার ক্ষেত্রে সীমাবদ্ধ করে।
  • ব্যবহারকারী একই SKU-তে আবার সাবস্ক্রাইব করলে, তিনি আর ফ্রি ট্রায়াল বা নতুন অফারের মূল্যের জন্য উপযুক্ত থাকবেন না। আপনার UI-তে এটি দেখানো হচ্ছে কিনা তা নিশ্চিত করুন।

আপনি কেনাকাটার টোকেন পেলে, নতুন সাবস্ক্রিপশনের ক্ষেত্রে যেভাবে কেনাকাটা প্রসেস করেন, ঠিক সেইভাবে করুন। সাবস্ক্রিপশন রিসোর্সে আপনি linkedPurchaseToken পাবেন না।

সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার পরে - Play Store-এ

চালু করা থাকলে, ব্যবহারকারীরা Google Play সাবস্ক্রিপশন সেন্টারে আবার সাবস্ক্রাইব করুন বিকল্পে ক্লিক করে মেয়াদ শেষ হওয়ার এক বছর পর্যন্ত একই SKU-তে আবার সাবস্ক্রাইব করতে পারবেন। এর ফলে নতুন সাবস্ক্রিপশন ও কেনাকাটা টোকেন তৈরি হয়।

Google Play Store অ্যাপের সাবস্ক্রিপশন বিভাগে গিয়ে
            বাতিল করা ও মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রিপশন দেখতে পাবেন, সাথে আবার সাবস্ক্রাইব করুন ও সরিয়ে দিন
            বোতামও দেখতে পাবেন
ছবি ৯. অ্যাকাউন্ট > সাবস্ক্রিপশন বিভাগে Google Play Store অ্যাপে বাতিল করা ও মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রিপশন আবার সাবস্ক্রাইব করুন ও সরিয়ে দিন বোতাম সহ দেখানো হয়।

আবার সাবস্ক্রাইব করাকে অ্যাপ-মধ্যস্থ কেনাকাটা হিসেবে বিবেচনা করা হয় না, তাই আপনার ব্যাকএন্ড থেকে সেগুলি সঠিকভাবে কনফার্ম করার জন্য সেরা পদ্ধতি অনুসরণ করতে ভুলবেন না।

আপনার সাবস্ক্রিপশনের প্রচার করা

আগে থেকে থাকা সাবস্ক্রিপশনের জন্য আপনি বেছে নেওয়া ব্যবহারকারীদের বর্ধিত ফ্রি ট্রায়াল দিতে প্রোমোশন কোড তৈরি করতে পারেন। আরও জানতে, প্রোমো কোড দেখুন।

ফ্রি ট্রায়ালের ক্ষেত্রে, Google Play যাচাই করে দেখে যে ফ্রি ট্রায়াল শুরু করার আগে ব্যবহারকারীর কাছে সঠিক পেমেন্ট পদ্ধতি আছে কিনা। কিছু ব্যবহারকারী তাদের পেমেন্ট পদ্ধতিতে এই যাচাইকরণকে হোল্ড বা চার্জ হিসেবে দেখতে পেতে পারেন। এই হোল্ড বা চার্জ অস্থায়ী এবং পরে এটি ফেরত দেওয়া বা রিফান্ড করা হয়।

ট্রায়ালের মেয়াদ শেষ হওয়ার পরে, ব্যবহারকারীর পেমেন্ট পদ্ধতিতে সম্পূর্ণ সাবস্ক্রিপশনের জন্য চার্জ করা হয়।

ফ্রি ট্রায়াল চলাকালীন কোনও ব্যবহারকারী যেকোনও সময় সাবস্ক্রিপশন বাতিল করলে, ট্রায়াল শেষ না হওয়া পর্যন্ত সাবস্ক্রিপশন অ্যাক্টিভ থাকে এবং ফ্রি ট্রায়ালের মেয়াদ শেষ হলে তাকে চার্জ করা হয় না।

সাবস্ক্রাইবারের জন্য বিলিং পিছিয়ে দেওয়া

আপনি subscriptionsv2.defer পদ্ধতি ব্যবহার করে সাবস্ক্রিপশনের এনটাইটেলমেন্টের মেয়াদ বাড়াতে পারবেন। অ্যাড-অন সহ সাবস্ক্রিপশন পোস্টপোন করলে, সাবস্ক্রিপশনের সব আইটেম একই সময়সীমার জন্য পোস্টপোন করা হয়। ডেফার করার সময়সীমা চলাকালীন, ব্যবহারকারী আপনার কন্টেন্ট সাবস্ক্রাইব করে সম্পূর্ণ অ্যাক্সেস পান, কিন্তু তাকে চার্জ করা হয় না। নতুন তারিখটি দেখানোর জন্য সাবস্ক্রিপশন রিনিউ করার তারিখ আপডেট করা হয়।

প্রিপেড প্ল্যানের ক্ষেত্রে, মেয়াদ শেষ হওয়ার সময় পিছিয়ে দেওয়ার জন্য আপনি ডিফার বিলিং API ব্যবহার করতে পারবেন।

বিলিং ডেফার করার সুবিধা আপনাকে এগুলি করতে দেয়:

  • বিশেষ অফার হিসেবে ব্যবহারকারীদের ফ্রি অ্যাক্সেস দিন, যেমন, সিনেমা কেনার জন্য এক সপ্তাহ ফ্রি অ্যাক্সেস দেওয়া।
  • সদিচ্ছা হিসেবে গ্রাহকদের বিনামূল্যে অ্যাক্সেস দিন।

প্রতিটি API কলের জন্য বিলিং কমপক্ষে একদিন এবং সর্বাধিক এক বছর পর্যন্ত পিছিয়ে দেওয়া যেতে পারে। বিলিং আরও পিছিয়ে দিতে, নতুন বিলিং তারিখ আসার আগে আপনি আবার API-তে কল করতে পারেন।

যেমন, ডার্সি Fishing Quarterly অ্যাপের অনলাইন কন্টেন্টের জন্য মাসিক সাবস্ক্রিপশন নিয়েছেন। প্রতি মাসের ১ তারিখে তাকে সাধারণত £১.২৫ বিল করা হয়। মার্চ মাসে, তিনি অ্যাপ প্রকাশকের জন্য একটি অনলাইন সমীক্ষায় অংশগ্রহণ করেছিলেন। প্রকাশক তার পরবর্তী পেমেন্ট ১৫ মে পর্যন্ত পিছিয়ে দিয়ে তাকে ছয় সপ্তাহ ফ্রি অ্যাক্সেস দিয়ে পুরস্কৃত করেন। ১৫ মে হল তার আগে শিডিউল করা বিলিং তারিখ, অর্থাৎ ৩০ এপ্রিলের ছয় সপ্তাহ পরে

  1. ডিসিকে এপ্রিল বা মে মাসের শুরুতে চার্জ করা হয়নি এবং এখনও তার কাছে কন্টেন্টের অ্যাক্সেস আছে। ১৫ মে, তাকে সেই মাসের জন্য সাধারণ £১.২৫ সাবস্ক্রিপশন ফি চার্জ করা হয় । তার পরবর্তী রিনিউয়ালের তারিখ এখন ১৫ জুন।

বিলিং ডেট পিছিয়ে দিলে, আপনি ব্যবহারকারীকে ইমেল বা অ্যাপ-মধ্যস্থ বিজ্ঞপ্তির মাধ্যমে জানাতে পারেন যে তার বিলিং তারিখ পরিবর্তন করা হয়েছে।

পেমেন্ট প্রত্যাখ্যান করা সংক্রান্ত সমস্যার সমাধান করা

সাবস্ক্রিপশন রিনিউ করার সময় পেমেন্ট সংক্রান্ত সমস্যা হলে, বাতিল করার আগে Google কিছু সময় ধরে মাঝে মাঝে সাবস্ক্রিপশন রিনিউ করার চেষ্টা করবে। অ্যাকাউন্ট ফিরিয়ে আনার এই সময়সীমার মধ্যে অতিরিক্ত সময়সীমা এবং তারপরে অ্যাকাউন্ট হোল্ডে রাখার সময়সীমা থাকতে পারে। এই সময় Google ব্যবহারকারীকে ইমেল ও বিজ্ঞপ্তি পাঠিয়ে পেমেন্ট পদ্ধতি আপডেট করার জন্য প্রম্পট করে।

পেমেন্ট বাতিল হয়ে গেলে, সাবস্ক্রিপশন গ্রেস পিরিয়ডে চলে যায়, যদি কোনও একটি কনফিগার করা থাকে। অতিরিক্ত সময়সীমা চলাকালীন, ব্যবহারকারীর কাছে এখনও সাবস্ক্রিপশন এনটাইটেলমেন্টের অ্যাক্সেস আছে কিনা তা আপনাকে নিশ্চিত করতে হবে।

অতিরিক্ত সময়সীমা শেষ হয়ে গেলে, সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে চলে যায়। অ্যাকাউন্ট হোল্ডে থাকাকালীন, ব্যবহারকারীর যাতে সাবস্ক্রিপশন এনটাইটেলমেন্টে অ্যাক্সেস না থাকে তা আপনাকে নিশ্চিত করতে হবে।

আপনি Google Play Console-এ প্রতিটি অটোমেটিক-রিনিউ হওয়া বেস প্ল্যানের গ্রেস পিরিয়ড ও অ্যাকাউন্ট হোল্ডের সময়সীমা নির্দিষ্ট করতে পারবেন। ডিফল্ট ভ্যালুর চেয়ে কম দৈর্ঘ্য নির্দিষ্ট করলে, পেমেন্ট প্রত্যাখ্যানের কারণে রিকভার করা সাবস্ক্রিপশনের সংখ্যা কমে যেতে পারে।

পেমেন্ট প্রত্যাখ্যান করার সময় সাবস্ক্রিপশন রিকভার করার সম্ভাবনা সর্বাধিক করতে, আপনি ব্যবহারকারীকে পেমেন্ট সংক্রান্ত সমস্যার ব্যাপারে জানাতে এবং সেটি সমাধান করতে বলতে পারেন।

আপনি গ্রেস পিরিয়ড ও অ্যাকাউন্ট হোল্ড বিভাগে বর্ণিত পদ্ধতি অনুসরণ করে এটি নিজে করতে পারেন অথবা আপনি ইন-অ্যাপ মেসেজিং API প্রয়োগ করতে পারেন, যেখানে Google আপনার অ্যাপের ব্যবহারকারীদের একটি মেসেজ দেখায়।

পেমেন্ট সংক্রান্ত সমস্যা হলে, Google Play আপনার ব্যবহারকারীদের বিজ্ঞপ্তি দেখাতে পারে। এটি সহজ করতে, আপনি অ্যাপ-মধ্যস্থ মেসেজিং ফিচার ব্যবহার করে বাকি থাকা পেমেন্ট সম্পর্কে তাদের জানাতে পারেন। আপনি অ্যাপ-মধ্যস্থ মেসেজিং চালু করে থাকলে, গ্রেস পিরিয়ড ও অ্যাকাউন্ট হোল্ড চলাকালীন পেমেন্ট সংক্রান্ত সমস্যার মেসেজ দিনে একবার দেখানো হয়। এর ফলে ব্যবহারকারীরা অ্যাপ থেকে বেরিয়ে না গিয়েই পেমেন্ট সংক্রান্ত সমস্যা সমাধান করতে পারেন। আরও তথ্যের জন্য, অ্যাপ-মধ্যস্থ মেসেজিং দেখুন।

ইন-অ্যাপ মেসেজিং

আপনি যদি InAppMessageCategoryId.TRANSACTIONAL-এর সাথে ইন-অ্যাপ মেসেজিং চালু করে থাকেন, পেমেন্ট সংক্রান্ত সমস্যা বা বাকি থাকা অপ্ট-ইন প্রাইস ইনক্রিজ থাকলে, Google Play ব্যবহারকারীদের একটি মেসেজ দেখাবে।

ব্যবহারকারীকে পেমেন্ট সংক্রান্ত সমস্যা সমাধান করতে বলার জন্য স্ন্যাকবার
ছবি ২০. ব্যবহারকারীকে পেমেন্ট সংক্রান্ত সমস্যা সমাধানের জন্য স্ন্যাকবার বিজ্ঞপ্তি দেখানো হচ্ছে।

আমরা সাজেস্ট করি যে ব্যবহারকারী যখনই অ্যাপ খুলবেন, তখনই এই API কল করুন যাতে মেসেজটি দেখানো উচিত কিনা তা নির্ধারণ করা যায়।

ব্যবহারকারী যদি সাবস্ক্রিপশন ফিরিয়ে আনতে পারেন বা দাম বৃদ্ধি কনফার্ম করেন, তাহলে আপনি একটি পার্চেজ টোকেনের সাথে SUBSCRIPTION_STATUS_UPDATED রেসপন্স কোড পাবেন। তারপরে আপনাকে এই পারচেজ টোকেন ব্যবহার করে Google Play Developer API কল করতে হবে এবং আপনার অ্যাপে সাবস্ক্রিপশনের স্ট্যাটাস রিফ্রেশ করতে হবে।

ইন-অ্যাপ মেসেজিং ইন্টিগ্রেট করা

ব্যবহারকারীকে ইন-অ্যাপ মেসেজিং দেখাতে, BillingClient.showInAppMessages() ব্যবহার করুন।

ইন-অ্যাপ মেসেজিং ফ্লো ট্রিগার করার একটি উদাহরণ এখানে দেওয়া হল:

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
    .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
    .build()

// Note: To display the in-app message, PBL requires an activity instance that
// can provide a valid window token. This token is necessary for the Play Store
// to display the message overlay correctly on top of the application's window.
// The passed Activity must be in a state where its window is created and
// attached to the WindowManager.
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
                // is recovered from a suspended state, or a user confirms a
                // price increase. 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();

// Note: To display the in-app message, PBL requires an activity instance that
// can provide a valid window token. This token is necessary for the Play Store
// to display the message overlay correctly on top of the application's window.
// The passed Activity must be in a state where its window is created and
// attached to the WindowManager.
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
                    // is recovered from a suspended state, or a user confirms a
                    // price increase. Developers should expect the purchase
                    // token to be returned with this response code and use
                    // the purchase token with the Google Play Developer API.
                }
            }
        });

বাতিলকরণ ও পেন্ডিং অবস্থা ম্যানেজ করা

এই বিভাগে বাতিল করা বা প্রত্যাহার করা সাবস্ক্রিপশন কীভাবে ম্যানেজ করতে হয় তা ব্যাখ্যা করা হয়েছে, পাশাপাশি কেনাকাটা করার সময় সাবস্ক্রিপশন পেন্ডিং অবস্থায় থাকলে কীভাবে তা ম্যানেজ করতে হয় তাও ব্যাখ্যা করা হয়েছে।

বাতিল বা প্রত্যাহার করা

আপনি Google Play Developer API ব্যবহার করে সাবস্ক্রিপশন বাতিল বা প্রত্যাহার করতে পারবেন। এই কার্যকারিতা Google Play Console-এও উপলভ্য।

  • বাতিল করা: ব্যবহারকারী Google Play-তে সাবস্ক্রিপশন বাতিল করতে পারবেন। এছাড়াও, আপনি ব্যবহারকারীদের আপনার অ্যাপ বা ওয়েবসাইটে বাতিল করার বিকল্প দিতে পারেন। আপনার অ্যাপকে এইসব বাতিলকরণ বাতিলকরণ বিভাগে বর্ণিত পদ্ধতি অনুযায়ী ম্যানেজ করতে হবে।

  • প্রত্যাহার করা: আপনি প্রত্যাহার করলে, ব্যবহারকারী সঙ্গে সঙ্গে সাবস্ক্রিপশনের অ্যাক্সেস হারান। এটি ব্যবহার করা যেতে পারে যদি, উদাহরণস্বরূপ, কোনও টেকনিক্যাল সমস্যার কারণে ব্যবহারকারী আপনার প্রোডাক্ট অ্যাক্সেস করতে না পারেন এবং ব্যবহারকারী প্রোডাক্টটি ব্যবহার করা চালিয়ে যেতে না চান। আপনার অ্যাপকে এইসব বাতিলকরণ প্রত্যাহার বিভাগে বর্ণিত পদ্ধতি অনুযায়ী হ্যান্ডেল করতে হবে।

নিচের সারণীতে বাতিল করা ও প্রত্যাহার করার মধ্যে পার্থক্য দেখানো হয়েছে।

রিনিউয়াল বন্ধ করে দেয় অ্যাক্সেস তুলে নেওয়া
বাতিল করুন হ্যাঁ না
প্রত্যাহার করুন হ্যাঁ হ্যাঁ

সাবস্ক্রিপশন সংক্রান্ত পেন্ডিং ট্রানজ্যাকশন ম্যানেজ করা

পেমেন্ট প্রসেস করা হচ্ছে অবস্থাটি প্রাথমিক কেনাকাটা, টপ-আপ, আপগ্রেড বা ডাউনগ্রেডের ক্ষেত্রে হতে পারে। সাবস্ক্রিপশন কেনার প্রসেস SUBSCRIPTION_STATE_PENDING স্ট্যাটাস দিয়ে শুরু হয় এবং তারপর SUBSCRIPTION_STATE_ACTIVE স্ট্যাটাসে পরিবর্তিত হয়। ট্রানজ্যাকশনের মেয়াদ শেষ হয়ে গেলে বা ব্যবহারকারী সেটি বাতিল করে দিলে, সেটি SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED-এ চলে যায়। ট্রানজ্যাকশন সম্পূর্ণ হওয়ার পরেই আপনাকে অবশ্যই এবং শুধুমাত্র ব্যবহারকারীর এনটাইটেলমেন্ট আপডেট করতে হবে।

বাকি থাকা ট্রানজ্যাকশন সহ প্রাথমিক কেনাকাটার জন্য সাবস্ক্রিপশন স্ট্যাটাস পরিবর্তন করা সহজ। ব্যবহারকারী কোনও পেমেন্ট সম্পূর্ণ না করে থাকলে, আপনার অ্যাপ PENDING স্ট্যাটাস সহ Purchase পায়। ট্রানজ্যাকশন সম্পূর্ণ হলে, আপনার অ্যাপ আবার Purchase পায় এবং স্ট্যাটাস PURCHASED হিসেবে আপডেট করা হয়। SUBSCRIPTION_PURCHASED ধরনের একটি SubscriptionNotification মেসেজ আপনার RTDN ক্লায়েন্টে পাঠানো হয়। কেনাকাটা যাচাই করার জন্য সাধারণ প্রসেস অনুসরণ করুন, কন্টেন্টে ব্যবহারকারীকে অ্যাক্সেস দিন এবং কেনাকাটা সম্পূর্ণ হয়েছে বলে স্বীকার করুন। ট্রানজ্যাকশনের সময়সীমা পেরিয়ে গেলে বা সেটি বাতিল করা হলে, আপনার RTDN ক্লায়েন্টকে SubscriptionNotification মেসেজ পাঠানো হয়, যার ধরন SUBSCRIPTION_PENDING_PURCHASE_CANCELED হয়। এই ধরনের ক্ষেত্রে, ব্যবহারকারীর কখনই কন্টেন্ট অ্যাক্সেস করা উচিত নয়।

পেন্ডিং ট্রানজ্যাকশন সহ টপ-আপ, আপগ্রেড বা ডাউনগ্রেড করার ক্ষেত্রে পুরনো ও নতুন, দুটি সাবস্ক্রিপশনের জন্যই স্ট্যাটাস পরিবর্তন হয়। ব্যবহারকারী কোনও পেমেন্ট বাকি থাকা টপ-আপ, আপগ্রেড বা ডাউনগ্রেড ট্রানজ্যাকশন শুরু করলে, আপনার অ্যাপ PendingPurchaseUpdate অবজেক্ট সহ পুরনো সাবস্ক্রিপশনের জন্য Purchase পায়। এই মুহূর্তে, ব্যবহারকারী এখনও পুরনো সাবস্ক্রিপশনের মালিক এবং এখনও নতুন সাবস্ক্রিপশন পায়নি। getProducts() ও getPurchaseToken()-এ কল করলে PendingPurchaseUpdate অবজেক্ট থেকে নতুন সাবস্ক্রিপশনের প্রোডাক্ট আইডি ও পার্চেজ টোকেন পাওয়া যায়। ট্রানজ্যাকশন সম্পূর্ণ হলে, আপনার অ্যাপ একটি Purchase পায়, যেখানে নতুন সাবস্ক্রিপশনের জন্য টপ-লেভেল পার্চেজ টোকেন সেট করা থাকে এবং PURCHASED হিসেবে স্টেট সেট করা থাকে। আপনার RTDN ক্লায়েন্টে type SUBSCRIPTION_PURCHASED সহ SubscriptionNotification মেসেজ পাঠানো হয়। শুধুমাত্র এই সময়েই, আপনাকে পুরনো কেনাকাটা টোকেনের পরিবর্তে নতুন কেনাকাটা টোকেন ব্যবহার করতে হবে এবং কন্টেন্টে ব্যবহারকারীর অ্যাক্সেস আপডেট করতে হবে। ট্রানজ্যাকশনের মেয়াদ শেষ হয়ে গেলে বা সেটি বাতিল করা হলে, আপনার RTDN ক্লায়েন্টকে SubscriptionNotification টাইপ সহ SUBSCRIPTION_PENDING_PURCHASE_CANCELED মেসেজ পাঠানো হয়। এইসব ক্ষেত্রে, ব্যবহারকারীর কাছে পুরনো সাবস্ক্রিপশনের কন্টেন্টের অ্যাক্সেস থাকা উচিত।