Capacitor SDKでモバイルアプリ内で購入する

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

ペイウォールビルダーを使用していない場合は、購入を完了してコンテンツをアンロックするために、.makePurchase() という別のメソッドを使用する必要があります。このメソッドは、ユーザーがペイウォールを操作して希望する取引を進めるためのゲートウェイとして機能します。

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

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

購入する

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

ステップバイステップのガイダンスをお探しですか? 全体的なコンテキストを含むエンドツーエンドの実装手順については、クイックスタートガイドを確認してください。


try {
  const result = await adapty.makePurchase({ product });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('User is now subscribed!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}

リクエストパラメータ:

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

レスポンスパラメータ:

パラメータ説明
result購入結果を示す type フィールド('success''user_cancelled'、または 'pending')と、購入成功時に更新された AdaptyProfile を含む profile フィールドを持つ AdaptyPurchaseResult オブジェクト。

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

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

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

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


try {
  const result = await adapty.makePurchase({ 
    product,
    params: {
      android: {
        subscriptionUpdateParams: {
          oldSubVendorProductId: 'old_product_id',
          prorationMode: 'charge_prorated_price'
        },
        isOfferPersonalized: true
      }
    }
  });
  
  if (result.type === 'success') {
    const isSubscribed = result.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
    
    if (isSubscribed) {
      // Grant access to the paid features
      console.log('Subscription updated successfully!');
    }
  } else if (result.type === 'user_cancelled') {
    console.log('Purchase cancelled by user');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  console.error('Purchase failed:', error);
}

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

パラメータ必須/任意説明
params任意プラットフォーム固有の購入パラメータを含む MakePurchaseParamsInput 型のオブジェクト。

MakePurchaseParamsInput の構造は以下のとおりです:

{
  android: {
    subscriptionUpdateParams: {
      oldSubVendorProductId: 'old_product_id',
      prorationMode: 'charge_prorated_price'
    },
    isOfferPersonalized: true
  }
}

サブスクリプションと置き換えモードの詳細については、Google Developerのドキュメントを参照してください:

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

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

await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    android: {
        enablePendingPrepaidPlans: true,      
    },
  }
});

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アナリティクスとレポートの間に収益の差異が生じていました。

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

アプリ内でコード引き換えシートを表示するには:


try {
  await adapty.presentCodeRedemptionSheet();
} catch (error) {
  console.error('Failed to present code redemption sheet:', error);
}

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

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