React Native SDKでモバイルアプリ内購入を行う

モバイルアプリ内にペイウォールを表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供する上で欠かせないステップです。ただし、ペイウォールビルダーを使ってペイウォールをカスタマイズしている場合に限り、ペイウォールを表示するだけで購入が完了します。

ペイウォールビルダーを使用しない場合は、.makePurchase() という別のメソッドを使って購入を完了し、目的のコンテンツをアンロックする必要があります。このメソッドは、ユーザーがペイウォールを通じて取引を進めるための入り口となります。

ペイウォールに、ユーザーが購入しようとしているプロダクトに対するアクティブなプロモーションオファーがある場合、Adaptyは購入時に自動的にそれを適用します。

初回オファーが自動的に適用されるのは、ペイウォールビルダーを使って設定したペイウォールを使用している場合のみです。

それ以外の場合は、iOSで初回オファーの利用資格をユーザーが持っているか確認する必要があります。このステップをスキップすると、リリース時にアプリが審査で却下される可能性があります。また、初回オファーの対象ユーザーに通常価格が請求されてしまう恐れもあります。

すべてのステップを漏れなく完了した上で初期設定を終えていることを確認してください。設定が完了していないと、購入の検証ができません。

購入を行う

ペイウォールビルダーを使用していますか? 購入は自動的に処理されます。このステップはスキップできます。

ステップバイステップのガイドをお探しですか? フルコンテキストのエンドツーエンド実装手順については、クイックスタートガイドをご覧ください。

try {
    const purchaseResult = await adapty.makePurchase(product);
    switch (purchaseResult.type) {
      case 'success':
        const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;

        if (isSubscribed) {
          // Grant access to the paid features
        }
        break;
      case 'user_cancelled':
        // Handle the case where the user canceled the purchase
        break;
      case 'pending':
        // Handle deferred purchases (e.g., the user will pay offline with cash)
        break;
    }
} catch (error) {
    // Handle the error
}

リクエストパラメーター:

パラメーター必須説明
Product必須ペイウォールから取得した AdaptyPaywallProduct オブジェクト。

レスポンスパラメーター:

パラメーター説明
Profile

リクエストが成功した場合、このオブジェクトがレスポンスに含まれます。AdaptyProfile オブジェクトは、アプリ内のユーザーのアクセスレベル、サブスクリプション、および買い切り購入に関する包括的な情報を提供します。

アクセスレベルのステータスを確認して、ユーザーがアプリへの必要なアクセス権を持っているかどうかを判断してください。

注意: Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに Apple App Store の共有シークレットを提供する必要があります。この方法は現在 Apple によって非推奨とされています。

購入時にサブスクリプションを変更する

ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択した場合の動作は、アプリストアによって異なります。

  • App Store の場合、サブスクリプションはサブスクリプショングループ内で自動的に更新されます。ユーザーがあるグループのサブスクリプションを購入している状態で別のグループのサブスクリプションを購入した場合、両方のサブスクリプションが同時にアクティブになります。
  • Google Play の場合、サブスクリプションは自動的に更新されません。以下で説明するように、モバイルアプリのコードで切り替えを管理する必要があります。

Android でサブスクリプションを別のものに置き換えるには、追加パラメーターを指定して .makePurchase() メソッドを呼び出します。

try {
    const purchaseResult = await adapty.makePurchase(product, params);
    switch (purchaseResult.type) {
      case 'success':
        const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;

        if (isSubscribed) {
          // Grant access to the paid features
        }
        break;
      case 'user_cancelled':
        // Handle the case where the user canceled the purchase
        break;
      case 'pending':
        // Handle deferred purchases (e.g., the user will pay offline with cash)
        break;
    }
} catch (error) {
    // Handle the error
}

追加のリクエストパラメーター:

パラメーター必須説明
params必須MakePurchaseParamsInput 型のオブジェクト。

バージョン 3.8.2 以降: MakePurchaseParamsInput の構造が更新されました。oldSubVendorProductIdprorationModesubscriptionUpdateParams 配下にネストされ、isOfferPersonalized は上位レベルに移動しました。

例:

makePurchase(product, {
    android: {
        subscriptionUpdateParams: {
            oldSubVendorProductId: 'old_product_id',
            prorationMode: 'charge_prorated_price'
        },
        isOfferPersonalized: true
    }
});

サブスクリプションと置き換えモードの詳細については、Google デベロッパードキュメントをご覧ください:

iOSでオファーコードを利用する

オファーコードについて

オファーコードを使うと、特定のユーザーに割引や無料トライアルを提供できます。自動的に適用される通常のオファーとは異なり、オファーコードはメールキャンペーン、SNS、印刷物など、アプリの外で配布します。ユーザーはApp Storeでコードを入力するか、引き換えURLを使うか、アプリ内ダイアログから利用できます。

オファーコードを設定するには、App Store Connectでサブスクリプションを開き、Offer Codes セクションに移動してください。オファーコードは3種類作成できます。

  • Free — 指定した期間はサブスクリプションが無料になり、次の更新から通常価格になります。
  • Pay as you go — 指定した期間、各請求サイクルに割引価格が適用され、その後は通常価格で更新されます。
  • Pay up front — オファー期間全体に対して一括で割引価格を支払い、その後は通常価格で更新されます。

オファーコードをAdaptyに追加する必要はありません。Appleはオファー期間中のすべてのトランザクションにオファーコードカテゴリのタグを付与します。これには最初の引き換えとその後の割引更新がすべて含まれます。Adaptyはこのタグを検出し、各トランザクションをオファーカテゴリ offer_code として記録します。オファー期間が終了してサブスクリプションが通常価格で更新されると、タグは付与されなくなります。Adapty ダッシュボードのアナリティクスで Offer Code オファータイプによるフィルタリングが可能です。

収益の差異が生じた場合のトラブルシューティング

オファーコードのトランザクションが、割引価格ではなく通常価格でAdaptyに記録されている場合は、App Store Connectで以下を確認してください。

  • オファーコードに、ユーザーが引き換え可能なすべての地域に対して正しい価格が設定されているか。
  • ユーザーの特定の国や地域に対してオファー価格が設定されているか。Appleはトランザクションに地域価格を含めて送信します。その地域のオファー価格が設定されていない場合、Appleは通常価格を送信することがあります。

Adapty ダッシュボードで、Offer Code オファータイプと Offer Discount Type フィルターを使ってオファーコードのトランザクションをフィルタリング・確認できます。

レガシープロモコード(非推奨)

Appleは2026年3月にアプリ内課金向けのプロモコードを廃止しました。オファーコードはより多くの機能(適格性の設定、有効期限、四半期あたり最大100万コード)を備えた後継機能です。アプリ内課金にプロモコードを使用していた場合は、App Store Connectでオファーコードに移行してください。

レガシープロモコード(アプリのバージョンごとに最大100件)は、サブスクリプションへの無料アクセスを付与していました。オファーコードとは異なり、Appleはプロモコードのトランザクションに割引情報を含めず、レシートには通常価格が記載されていました。そのため、Adaptyはこれらのトランザクションを通常価格で記録し、Adaptyアナリティクスとレポートの間に収益の差異が生じていました。

本来は無料であるべきトランザクションが通常価格で記録されている履歴がある場合、それはレガシープロモコードによるものと考えられます。これらのコードは現在廃止されているため、正確な収益追跡のためにオファーコードに移行してください。

アプリ内にコード利用シートを表示するには:

adapty.presentCodeRedemptionSheet();

弊社の観測によると、一部のアプリではオファーコード利用シートが正常に動作しない場合があります。ユーザーを App Store に直接リダイレクトすることをお勧めします。

そのためには、以下の形式のURLを開く必要があります: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}

プリペイドプランの管理(Android)

アプリのユーザーがプリペイドプラン(例:数ヶ月分の非更新型サブスクリプションを購入)を利用できる場合、プリペイドプランの保留中のトランザクションを有効にすることができます。

adapty.activate("PUBLIC_SDK_KEY", {
    android: { pendingPrepaidPlansEnabled: true }
});