コンテンツにスキップ

Create iOS Subscription Group

GitHub

iOSアプリの複数のサブスクリプションレベルを管理するために不可欠なサブスクリプショングループの理解は、アップグレード、ダウン グレード、クロス グレード機能の実装に不可欠です。

サブスクリプショングループとは?

サブスクリプショングループとは?

サブスクリプショングループとは、ユーザーが選択できる関連サブスクリプションの集合体です。ユーザーは、グループ内で1つのサブスクリプションにのみサブスクライブできます。サブスクリプションを切り替えると、Appleは自動的に移行を処理します。

サブスクリプショングループの重要性

サブスクリプショングループの重要性

サブスクリプショングループにより次のことが可能になります。

  • 価格設定の階層化基本、プレミアム、究極のプランを提供
  • 期間の異なるサブスクリプション: 月額、年額、ライフタイムのオプション
  • アップグレード/ダウングレードロジック: サブスクリプションの変更を自動的に管理
  • シンプルな管理: 相関するサブスクリプションをグループ化

サブスクリプションレベル

サブスクリプションレベルのセクション

グループ内で、各サブスクリプションは、値の高い順 (レベル 1) から低い順にランク付けされます。このランク付けは、サブスクリプションの変更を分類するために使用されます:

サブスクリプショングループの階層

レベル 1 (最高値)

  • プレミアム年間 ($99.99/年)
  • アクティベート月額 ($19.99/月)

レベル 2 (中間値)

  • スタンダード年間 ($49.99/年)
  • プレミアム月額 ($9.99/月)

レベル 3 (最低値)

  • ベーシック年間 ($29.99/年)
  • スタンダード月額 ($4.99/月)

サブスクリプション変更の種類

サブスクリプション変更タイプ

Appleは、レベルランキングに基づいて、自動的に3種類のサブスクリプション変更を処理します。

レベルを 上位の サブスクリプション (例:レベル2 → レベル1) に変更します。

動作:

  • 即時効果 ユーザーは
  • 割引の払い戻しを受け取ります __CAPGO_KEEP_0__ 残り期間
  • 新しいサブスクリプションはすぐに始まります

例:

// User currently has: Standard Monthly (Level 2)
// User upgrades to: Premium Annual (Level 1)
// Result: Immediate access to Premium, refund for unused Standard time

レベルを下げる 下位のサブスクリプション (例: レベル 1 → レベル 2) への移行 動作:

次回の更新日付で効果を発揮

  • 次回の更新日付で効果を発揮します next renewal date
  • 期限内は、ユーザーは現在のサブスクリプションを維持します。
  • 期限切れ後、自動的に新しいサブスクリプションが開始されます。

例:

// User currently has: Premium Annual (Level 1)
// User downgrades to: Standard Monthly (Level 2)
// Result: Premium access continues until annual renewal date, then switches

別のサブスクリプションに切り替える 同じレベルの.

行動は、期間によって異なります。

異なる期間 → ダウングレードと同じ動作 ダウングレード

  • 次回更新日以降に有効
  • 例: 月額プレミアム (レベル 1) → 年額プレミアム (レベル 1)

同じ期間 → そのような動作 アップグレード

  • 即時効果
  • 例: プレミアム月額 (レベル 1) → アンリミテッド月額 (レベル 1)

サブスクリプション グループの作成

「サブスクリプション グループの作成」のセクション
  1. サブスクリプションに移動

    App Store Connect で、アプリを選択し、 「収益化」 > 「サブスクリプション」.

  2. グループを作成

    「サブスクリプション グループ」をクリック + 「サブスクリプション グループ」をクリックして新しいグループを作成

  3. グループ名を設定

    グループに含まれるサブスクリプションを反映した説明的な名前を選択してください

    • 「プレミアム アクセス」
    • 「クラウド ストレージ プラン」
    • 「プロ フィーチャー」
  4. サブスクリプションを追加

    グループを作成した後、個々のサブスクリプションを追加してください。各サブスクリプションにはレベルランキングが設定されます。

  5. レベルランキングを設定

    サブスクリプションを値の高いものから低いものまで並べ替えてください。考慮すべき点は

    • 年間プランは通常月額プランよりもランクが高い
    • 価格が高いレベルは価格が低いレベルの上にランク付けされる
    • 最高/プレミアムレベルは最高ランク

ネイティブ購入プラグインは自動的にサブスクリプション グループ ロジックを処理します:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Fetch all subscriptions in a group
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_annual', 'ultimate_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
// Display current subscription using StoreKit transactions
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const activeSubs = purchases.filter((purchase) => purchase.isActive);
// Detect pending downgrade/cancellation (StoreKit sets willCancel === true)
const pendingChange = purchases.find((purchase) => purchase.willCancel === true);
if (pendingChange) {
console.log('Subscription will stop auto-renewing on', pendingChange.expirationDate);
}
// Purchase (StoreKit handles upgrades/downgrades automatically)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_annual',
productType: PURCHASE_TYPE.SUBS,
});
// Listen for StoreKit updates (fires on upgrades/downgrades/refunds)
NativePurchases.addListener('transactionUpdated', (transaction) => {
console.log('Subscription updated:', transaction);
});

サブスクリプションの変更を処理する

セクション「サブスクリプションの変更を処理する」
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Get current subscription info
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const currentSubscription = purchases.find(
(purchase) => purchase.subscriptionState === 'subscribed',
);
if (currentSubscription) {
// StoreKit reports if user cancelled auto-renew
if (currentSubscription.willCancel) {
console.log(
`User cancelled. Access remains until ${currentSubscription.expirationDate}`,
);
}
if (currentSubscription.isUpgraded) {
console.log('User recently upgraded to this plan.');
}
}
// Listen for automatic upgrades/downgrades
NativePurchases.addListener('transactionUpdated', (transaction) => {
console.log('Subscription changed!', transaction);
if (transaction.subscriptionState === 'revoked') {
revokeAccess();
} else if (transaction.isActive) {
unlockPremiumFeatures();
}
});

ユーザーとのコミュニケーション

「ユーザーとのコミュニケーション」

常に、変更の動作を明確に伝えます:

アップグレードの場合:

“You’ll get immediate access to Premium features. We’ll prorate your current subscription.”

ダウングレードの場合:

“You’ll keep Premium access until [renewal date], then switch to Standard.”

クロスグレードの場合:

“Your plan will change to Annual billing at the next renewal on [date].”

サーバー監視

「サーバー監視」

App Store Server Notifications v2を使用するか、独自の受領検証バックエンドを使用して、StoreKitの変更をデータベースに反映するために、AppleのApp Store Server Notifications v2または独自の受領検証バックエンドを使用します。サーバー通知をサーバー通知と組み合わせて、 transactionUpdated リスナーは両方のクライアントとバックエンドを同期させるようにします。

  • 関連するサブスクリプションを同じグループに保管する
  • 無関係な機能を混ぜない (例: ストレージと広告の削除)
  • 異なる機能セットごとに別々のグループを作成する
  • 年間プラン → 同等のレベルより高い月額プラン
  • 高額のプラン → 高いレベル
  • 価格だけではなく、価値を考慮してください
  • 現在のサブスクリプションを明確に表示する
  • グループ内のすべてのオプションを表示する
  • 即時変更と再契約時変更を区別する
  • プランを簡単に切り替える
  • アップグレードシナリオをすべてテストする
  • ダウングレードシナリオをすべてテストする
  • クロスグレード動作を検証する
  • ウェブホックの発射を確認する

一般的なシナリオ

「一般的なシナリオ」

シナリオ1: 月額3レベルプラン

「シナリオ1: 月額3レベルプラン」
Level 1: Ultimate Monthly ($19.99)
Level 2: Premium Monthly ($9.99)
Level 3: Basic Monthly ($4.99)
  • 基本 → 高級: 即時アップグレード
  • 高級 → 最高: 即時アップグレード
  • 最高 → 高級: 再契約時ダウングレード
  • 基本 → 最高: 即時アップグレード

シナリオ2: 混合期間プラン

「シナリオ2: 混合期間プラン」
Level 1: Premium Annual ($99.99/year)
Level 2: Premium Monthly ($9.99/month)
  • 月額 → 年額: 再契約時クロスグレード
  • 年額 → 月額: 再契約時ダウングレード

シナリオ 3: 多層多期間

「シナリオ 3: 多層多期間」
Level 1: Ultimate Annual ($199/year)
Level 2: Ultimate Monthly ($19.99/month)
Level 3: Premium Annual ($99/year)
Level 4: Premium Monthly ($9.99/month)
Level 5: Basic Annual ($49/year)
Level 6: Basic Monthly ($4.99/month)

最大の柔軟性を維持しながら、明確なアップグレード/ダウングレードロジックを提供します。

トラブルシューティング

「トラブルシューティング」

グループ内にサブスクリプションが表示されない場合:

  • 正しいグループに割り当てられていることを確認する
  • 「準備中」ステータス以上であることを確認する
  • 正しい製品IDが確保されているか確認してください。

アップグレード/ダウングレードの挙動が間違っている:

  • レベルランキングの確認 (1 = 最高)
  • サブスクリプションの階層が意味をなしているか確認してください。
  • レベルが正しく設定されているか確認してください。

異なるグループの製品:

  • ユーザーは同時に複数のグループにサブスクライブできる。
  • 関連する製品を同じグループに残すため、これは意図的な動作です。

getActiveProductsで複数のサブスクリプションが表示される:

  • サブスクリプションが異なるグループに所属しているか確認してください。
  • ユーザーがファミリー共有を通じてサブスクライブしていないか確認してください。
  • App Store Connectでサブスクリプションの状態を確認してください。

詳細については、 iOS サブスクリプション グループに関する公式の Apple ドキュメントを参照してください.

「Create iOS Subscription Group」から続けてください

「Create iOS Subscription Group」から続けてください

Capgo を使用している場合 Create iOS Subscription Group Capgo の native capability を使用するには、 Capgo の native capability を使用するには、@capgo/native-purchases Capgo の native capability を使用するには、@capgo/native-purchases、@capgo/__CAPGO_KEEP_1__-in-app-review @capgo/capacitor-in-app-review Capgoの実装詳細については@capgo/capacitor-in-app-reviewを参照してください。 Capgoの@capgo/capacitor-in-app-reviewを使用します。 Capgoのネイティブ機能については、Capgoの@capgo/capacitor-in-app-reviewを参照してください。 Capgoの@capgo/capacitor-native-market Capgoの実装詳細については@capgo/capacitor-native-market、 Capgoの@capgo/capacitor-native-marketを使用します。 Capgoのネイティブ機能については、Capgoの@capgo/capacitor-native-marketを参照してください。