■はじめに
私はコンテンツ系アプリのプロダクトマネージャーとして、消費型コインやアイテムを基にしたサブスクリプション機能の実装に取り組んできました。この記事は同様の機能を実装しようと考えているPMやエンジニア向けに、Q&A形式で記載します。なお、各所情報は私の2023年9月時、iOS向けの実装経験を元にしています。Apple社による仕様変更で詳細が変わる可能性がありますのでご了承ください。
※この記事でサブスクと呼ぶものはiOSの「自動更新サブスクリプション」機能を指します。
■消費型のサブスク vs 無制限アクセスのサブスク
NetflixやHuluのような月額固定で無制限アクセスを提供するサブスクと異なり、ここで述べるサブスクは都度支払いを行い、アプリ内通貨をコンテンツ消費に使用する形式を指します。このモデルは、ゲーム、マンガ、ライブ配信などの従量課金を含むサービスに適しています。
■Q&A
【Q1】 iOSサブスクリプションの「ランク」「レベル」とは何ですか?
App Store Connectでサブスクリプションを設定する際、各プランに「レベル(level)」をつける必要があります。iOS側では「レベル」の数字の大小を基準として、ダウン/アップ/クロスグレードの処理がされます。同じ文脈で「ランク(rank)」という言葉が使用されるケースもありますが、考え方は「レベル」と同様です。
Case Study
・レベル1のプラン→レベル2のプランに契約更新=「ダウングレード」で処理
・レベル2プラン→レベル1に契約更新=「アップグレード」で処理
・同一レベルで設定したプランに切り替え=「クロスグレード」で処理
<参考記事>
https://www.revenuecat.com/blog/engineering/ios-subscription-groups-explained/
【Q2】iOSサブスクリプションの「グループ」とは何ですか?
App Store Connectでサブスクリプションを設定する際、「グループ」の設定が必要です。iOS developerの多くは「1年経過後の純収益率が85%」を狙って実装するケースがほとんどだと思います。グループ設定の仕方により、継続月数の「カウント」に影響が出ますのでお気をつけください。
Case Study
・同じグループ内でのプラン変更:apple上の課金継続月のカウントはkeepされる
・違うグループへのプラン変更(複数のグループを設定):apple上の課金継続月のカウントは0から再スタート
→「1年経過後の純収益率が85%」をよりスムーズに達成させるには、「グループは1つのみ」設定するのがベター
【Q3】 ダウングレード、アップグレード、クロスグレードで注意すべき点は何ですか?
消費型コインのサブスクの場合、developerが目指す挙動としては「ユーザーがサブスクを契約→アイテム/コインを配布→ユーザーがアイテム/コインでアプリ内コンテンツを購入」だと思います。
この際、特に難しいのが「ダウングレード」「クロスグレード」「アップグレード」の取り扱いです。APPディペロッパー側がこの仕様をきちんと理解しない場合、意図しない「返金処理(ビジネス的には損失)」が生まれる可能性があるためご注意ください。
Bad Case
ユーザーにコインを配布し、コンテンツ購入でコイン消費される
→グレード処理で払い戻しが実行される
→developerがユーザーに現金の払い戻しをすることによって、コインの払い損が発生する
※グレード処理を理解しないまま設定すると上記のようなマイナスケースが発生します
Case Study
①ダウングレード
-現在契約しているプランAが終わった後に、プランBが適用される
-例:8/1〜8/31はプランAを契約済み、8/15にプランBに切り替え処理→プランA終了後の9/1からプランBに切り替わる
-プラン期間後に新プランが適用されるため、返金処理は特になし
②アップグレード
-現在のプランが継続中でも、プラン変更の決済後に即時でプランが切り替わる
-例:8/1〜8/31はプランAを契約済み、8/15にプランBの決済完了→即時でプランBに切り替わる、プランBの契約タームは8/15~9/14で取り扱われる
-変更の決済適用時を基準に、プランAの返金処理が行われる
③クロスグレード
-現在の契約プランが続いていても、変更の決済タイミングから即時で変わる
-例:8/1〜8/31はプランAを契約済み、8/15にプランBの決済完了→即時でプランBに切り替わる、プランBの契約タームは8/15~9/14で取り扱われる
-アップグレードと実質的に同じ返金処理が行われる
消費型コインのサブスクが目指すべき方向性
・App Store Connectでは「1month」「1year」といった形で、どの頻度でプランを更新させるかの期間(duration)を指定できる
・「同じ期間(duration)」での課金軸は「1つ」のみとする
<Goodな例>
・月間1000円プラン
・年間9800円プラン
で実装。この場合は同じ期間/duration(月間、年間)で課金軸は1つずつのみなので、グレードによる「返金処理」に悩まされない。
改めて注意
・同じ期間/dutationで複数の課金帯を用意する場合、現状のapple仕様では「返金処理」は避けられません。
・一部アプリではこの「返金処理」を許容として実装している例もありますが、オススメしません。
・グレードによる切り替えはappleの仕様上ユーザー側で無制限で実行できます。つまり「返金処理」も実質無制限で行わなければならないため、abusingとしてdeveloper側の運用リスクが高まります。
■参考記事
・自動更新サブスクリプション(Apple社、iOSの公式記事)
https://developer.apple.com/jp/app-store/subscriptions/#offering-subscriptions
・subtype(Apple社、iOSの公式記事)
https://developer.apple.com/documentation/appstoreservernotifications/subtype
・iOS Subscription Groups Explained
https://www.revenuecat.com/blog/engineering/ios-subscription-groups-explained/
・iOS Subscription upgrades, downgrades, and service levels
https://qonversion.io/blog/ios-subscription-upgrades-downgrades-and-service-levels/