12ヶ月コミットメントプランの設定
コミットメントプランを提供するには、App Store の年間サブスクリプションとフローまたはカスタムペイウォールが必要です。フローには iOS で Adapty SDK v4.3.1 以降、Android で v4.3 以降、React Native または Flutter で v4.3.0 以降が必要です。カスタムペイウォールには iOS、React Native、または Flutter で Adapty SDK v4.3 以降が必要です。
サブスクライバーに年間プランへのコミットを促しつつ月払いで料金を受け取るには、App Store Connect と Adapty の年間プロダクトに12ヶ月コミットメントプランを追加してください。
始める前に
コミットメントプランを実装する前に、以下を確認してください。
- 適切な市場をターゲットにする: コミットメントプランはアメリカでは利用できません。ドイツ、イスラエル、南アフリカ、トルコでは、サブスクライバーはApple Supportを通じて即時解約できます。
- 適切なOSバージョンをターゲットにする: サブスクライバーはiOS 26.4以降、またはiPadOS、macOS、tvOS、visionOSの同バージョンが必要です。Xcode 26.5以降でアプリをビルドしてください。
- 適切な価格帯をターゲットにする: 12ヶ月分の月額支払いの合計額は、年額サブスクリプションの前払い価格の1倍〜1.5倍の範囲内である必要があります。
- 対応するAdapty SDKバージョンを使用する: フローにはiOSでAdapty SDK v4.3.1以降、AndroidではAdapty SDK v4.3以降、React NativeまたはFlutterではv4.3.0以降が必要です。カスタムペイウォールにはiOS、React Native、FlutterでAdapty SDK v4.3以降が必要です。それ以前のSDKを使用するアプリバージョンでは、ユーザーは前払いプランのみ購入できます。
- プロダクトIDを読み取るコードを更新する: Webhook、インテグレーション、データエクスポート、サーバーサイドAPIでは、コミットメントプランの購入が
<product_id>:monthlyとして報告されます。プロダクトIDを処理するコードがある場合は、最初のコミットメントプラン購入前にロジックを更新してください。
App Store Connect の設定
- App Store Connectで年間サブスクリプションを開くか、1 Yearの期間で新しいサブスクリプションを作成します。
- Availabilityセクションで、1 Year UpfrontとMonthly with 12-Month Commitmentに同じ国を追加します。Appleは、一括請求が利用可能な国でのみコミットメント請求を提供しています。逆は必須ではありません。つまり、コミットメントプランのない国で一括プランを提供することは可能です。
- Subscription Pricesセクションで、まだ設定されていない場合は、基本テリトリーの一括価格を設定します。コミットメントプランのみをユーザーに表示する場合でも、Appleは一括価格を必須としています。
- 基本テリトリーの月額価格を設定します。月額価格は一括価格の1/12〜1/8の範囲内である必要があります。例えば、一括価格が€59.99の場合、月額価格は€5.00〜€7.49が設定可能です。
App Store Connect は、基準地域の価格をもとに他の国の価格を自動計算します。
詳しい手順については、Apple の12ヶ月コミットメント付き月次サブスクリプションの提供ガイドをご覧ください。
2. Adaptyの設定
フローまたはカスタムペイウォールでコミットメントプランを表示するには、Adaptyの年額プロダクトでこれを有効にしてください。どちらも使用しない場合は、この手順をスキップできます。
-
年額プロダクトを開きます。まだ存在しない場合は、App Store Connectで設定したサブスクリプションを作成して接続してください。Adaptyから新しいプロダクトをプッシュしないでください。コミットメントプランのない別のサブスクリプションが作成されてしまいます。
-
App Store タブを開き、Offer monthly payments with a 12-month commitment を選択します。
-
ポップアップで、Monthly price, USD リストから App Store Connect に合わせた分割払い価格を選択します。リストには許可された範囲内の App Store の価格ポイントのみが表示されます。この価格は参照値であり、Adapty が App Store Connect に送信することはありません。
3. オファーの設定
App Store Connect では、各請求プランにそれぞれ独自の初回オファー、プロモーションオファー、ウィンバックオファー、オファーコードがあります。アップフロントプランのオファーはコミットメントプランには適用されません。
- 無料トライアルおよびその他の初回オファー: App Store Connect でコミットメントプランの初回オファーを設定します。Adapty は初回オファーを自動的に適用します。初回オファーが終了すると、サブスクライバーの12ヶ月コミットメントが開始されます。
- プロモーションオファーおよびウィンバックオファー: App Store Connect でコミットメントプランのプロモーションオファーまたはウィンバックオファーを設定します。次にオファーを Adapty に追加し、App Store plan を Monthly with 12-month commitment に設定します。フローまたはペイウォールのプロダクトには、そのプランに対応するオファーのみが表示されます。フローもカスタムペイウォールも使用しない場合は、Adapty にオファーを追加する必要はありません。
- オファーコード: App Store Connect でコミットメントプランのオファーコードを設定します。
4. フローまたはカスタムペイウォールに追加する
Appleは、購入前に分割払い価格と年間合計金額の両方を表示することを義務付けています。
フロー
- フローBuilder で Products パネルを開き、Monthly タグが付いた年間プロダクトを画面に追加します。同じ画面で一括払いプランも販売する場合は、Upfront タグが付いたプロダクトも追加してください。
- 旧バージョンの SDK を使用しているユーザーや、コミットメントプランが適用されないユーザーに対して、一括払いプランを購入した際にアップフロントオファーを提供したい場合は、Fallback offer でオファーを選択してください。
- Monthly プロダクトをプロダクトカードまたはPurchase アクションに割り当てます。
- 分割払い価格を表示するには、
prod_billing_priceとprod_billing_periodの変数を挿入します。年間合計を表示するにはprod_priceを挿入します。分割払いの変数を使用するには、iOS では Adapty SDK v4.3.1 以降、React Native または Flutter では v4.3.0 以降が必要です。 - コミットメントプランを購入できないユーザー向けの画面をプレビューするには、Products パネルで Monthly プロダクトのメニューを開き、Offer > Monthly plan unavailable を選択します。
カスタムペイウォール
- カスタムペイウォールに年間プロダクトを追加し、Billing plan を Monthly に設定します。同じペイウォールで一括払いプランも販売する場合は、年間プロダクトをもう一度追加し、Billing plan を Upfront に設定してください。
- 旧バージョンの SDK を使用している場合や、コミットメントプランが適用されないユーザーに対して一括払いプランの購入時にアップフロントオファーを提供するには、Fallback offer でオファーを選択します。
- アプリ内では
product.subscriptionPricingTermsから価格を表示します。コミットメントプランを購入できるユーザーには、Adapty SDK がそのプランの価格を返します。それ以外のユーザーには、一括払いプランの価格が返されます。- SDK が返したプランを判別するには、
product.subscriptionPricingTerms?.billingPlanを確認します。コミットメントプランの場合は.monthly、一括払いプランの場合は.upFrontになります。 - 分割払いの価格を表示するには、
subscriptionPricingTerms.localizedBillingPriceとsubscriptionPricingTerms.billingPeriodを使用します。 - 年間合計を表示するには、
subscriptionPricingTerms.commitmentInfo.localizedPriceとsubscriptionPricingTerms.commitmentInfo.periodを使用します。コミットメントプランの場合、product.localizedPriceとproduct.subscriptionPeriodも同じ年間の値を返します。 - React Native では、
product.subscription?.ios?.pricingTermsから価格を読み取ります。billingPlanは、コミットメントプランの場合は'monthly'、一括払いプランの場合は'up_front'です。分割払いの価格にはbillingPrice.localizedStringとbillingPeriodを、年間合計にはcommitmentInfo.price.localizedStringとcommitmentInfo.periodを使用します。 - Flutter では、
product.subscription?.pricingTermsから価格を読み取ります。billingPlanは、コミットメントプランの場合はAdaptySubscriptionBillingPlan.monthly、一括払いプランの場合はAdaptySubscriptionBillingPlan.upFrontです。分割払いの価格にはbillingPrice.localizedStringとbillingPeriodを、年間合計にはcommitmentInfo.price.localizedStringとcommitmentInfo.periodを使用します。
- SDK が返したプランを判別するには、
ユーザーが以下の場合、コミットメントプランを購入できません。
- サポート外のOSバージョンまたは国: ユーザーのAppleデバイスが26.4より古いシステムバージョンで動作している場合、またはプランがユーザーのApp Storeの国で利用できない場合。Adapty SDKは代わりに一括払いプランの価格を返します。
- 既存の一括払いサブスクリプション: StoreKitは、ユーザーがすでにサブスクライブしていると報告します。プランを切り替えるには、サブスクライバーはAppleのサブスクリプション設定を使用します。
- プロモートされたアプリ内課金: ユーザーがApp Storeでプロダクトを選択すると、Adapty SDKがアプリ内で購入を開始します。これらの購入では、SDKは一括払いプランのみをサポートします。
コミットメントプランの提供を停止するには、フローでは月額プロダクトを置き換えるか削除してください。カスタムペイウォールでは、年額プロダクトの課金プランを前払いに設定するか、月額行を削除してください。Adapty で12か月コミットメントで月払いを提供するチェックボックスをオフにすることはできません。既存のサブスクライバーは、App Store Connect の年額サブスクリプションでRemove Monthly Billingをクリックしない限り、毎年新しいコミットメントに更新され続けます。すでにコミットしたサブスクライバーは、コミットメント期間が終了するまで支払いを続けます。
5. サンドボックスでプランをテストする
サンドボックステストガイドに従って、2つのサンドボックスアカウントでテストします。
- コミットメントプランを提供している国のアカウント: ペイウォールには、合計金額と並んで月額料金付きのコミットメントプランが表示されます。購入後、サンドボックスユーザーのプロファイルには年間プロダクトのアクセスレベルが付与されます。
- USアカウント: ペイウォールには前払いプランのみが表示されます。
ウェブフックまたはServer-side APIからプロダクトIDを処理するコードがある場合は、コミットメントプランの購入が <product_id>:monthly として受信されることを確認してください。
購入ロジックをローカルでテストするには、Xcode の StoreKit Testing 26.5 以降を使用してください。StoreKit Testing での購入は Adapty には届きません。
アプリでコミットメントの進捗を表示する
サブスクリプションユーザーにコミットメントの進捗を表示するには、ユーザープロファイルからアクセスレベルを読み取ります。billingPlan プロパティと commitmentInfo プロパティを使用するには、iOS では Adapty SDK v4.3 以降、React Native または Flutter では v4.3.0 以降が必要です。
- サブスクライバーがコミットメントプランを利用中かどうかを確認するには、
billingPlanを月次の値と比較してください。プロパティが設定されているかどうかだけを確認しないでください:前払いの値を持つ場合もあります。 - 進捗を表示するには、現在の支払いに
commitmentInfo.billingPeriodNumberを、支払い回数にcommitmentInfo.totalBillingPeriodsを使用してください。 - コミットメントの終了日を表示するには、アクセスレベルの
expiresAtプロパティではなく、commitmentInfo.expiresAtを使用してください。
トラブルシューティング
- 月額支払いのチェックボックスが表示されない: Offer monthly payments with a 12-month commitment チェックボックスは、App Store プロダクト ID が設定された Annual プロダクトにのみ表示されます。Price (USD) が設定されるまでは非アクティブのままです。
- コミットメントプランで無料トライアルやその他のオファーがユーザーに表示されない: App Store Connect では、各オファーは1つの請求プランに紐付いています。コミットメントプランに対してオファーを設定してください。プロモーションオファーまたはウィンバックオファーの場合は、Adapty でオファーの App Store plan を Monthly with 12-month commitment に設定してください。
- すべてのユーザーに一括払い価格が表示される: 次の両方を確認してください:
- アプリが Xcode 26.5 以降でビルドされていること。それより古い Xcode バージョンでは、Adapty SDK は常に一括払いプランの価格を返します。
- フローでは、画面が Monthly タグの付いた年間プロダクトを使用していること。カスタムペイウォールでは、年間プロダクトの Billing plan が Monthly になっていること。
- 一部のユーザーに一括払い価格が表示される: そのユーザーはコミットメントプランを購入できません。
- ペイウォールに分割払い価格ではなく年間合計金額が表示される:
- フローでは、
prod_priceは年間合計金額を返します。分割払い価格を表示するにはprod_billing_priceを使用してください。Adapty iOS SDK v4.3.0 ではprod_billing_priceも年間合計金額を返すため、SDK を v4.3.1 以降にアップデートしてください。 - カスタムペイウォールでは、
product.localizedPriceは年間合計金額を返します。分割払い価格を表示するにはsubscriptionPricingTerms.localizedBillingPriceを使用してください。React Native ではproduct.subscription?.ios?.pricingTerms?.billingPrice.localizedStringを、Flutter ではproduct.subscription?.pricingTerms?.billingPrice.localizedStringを使用してください。
- フローでは、