Sauter au contenu

Créer un groupe d'abonnement iOS

GitHub

Les groupes d'abonnements sont essentiels pour organiser et gérer plusieurs niveaux d'abonnement dans votre application iOS. Comprendre comment ils fonctionnent est crucial pour mettre en œuvre la fonctionnalité d'amélioration, de dégradation et de croisement de niveau.

Un groupe de souscriptions est une collection de souscriptions liées que les utilisateurs peuvent choisir entre. Les utilisateurs ne peuvent s'abonner qu'à une seule souscription au sein d'un groupe à la fois. Lorsqu'ils changent de souscription, Apple gère automatiquement la transition.

Les groupes de souscriptions permettent :

  • Tarification échelonnée: Proposer des plans de base, premium et ultime
  • Différentes durées: Options mensuelles, annuelles et à vie
  • Logique de mise à niveau/diminution de niveau: Gestion automatique des changements de souscription
  • Gestion simplifiée: Grouper les abonnements liés ensemble

Dans un groupe, chaque abonnement doit être classé en fonction de sa valeur, de la plus élevée (niveau 1) à la plus basse. Cette classification détermine comment les changements d'abonnement sont classés :

Hiérarchie des groupes d'abonnements

Niveau 1 (Valeur la plus élevée)

  • Annuel Premium (99,99 $ par an)
  • Mensuel Ultimate (19,99 $ par mois)

Niveau 2 (Valeur moyenne)

  • Tarif annuel standard (49,99 $ par an)
  • Tarif mensuel premium (9,99 $ par mois)

Niveau 3 (Valeur la plus basse)

  • Tarif annuel de base (29,99 $ par an)
  • Tarif mensuel standard (4,99 $ par mois)

Apple gère automatiquement trois types de changements de souscription en fonction du classement de niveau :

Passer à un abonnement de niveau supérieur (par exemple, niveau 2 → niveau 1). Comportement :

Prend effet

  • immédiatement L'utilisateur reçoit
  • un remboursement partiel pour le temps restant Le nouveau abonnement commence aussitôt
  • Exemple :

__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

Passer à un abonnement de niveau inférieur (par exemple, niveau 1 → niveau 2). Comportement :

Effet à partir de la

  • date de renouvellement suivante L'utilisateur conserve son abonnement actuel jusqu'à la fin de la période
  • Le nouveau abonnement commence automatiquement après expiration
  • Exemple :

__CAPGO_KEEP_0__

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

Passer à une autre abonnement au même niveau de tarification.

Le comportement dépend de la durée :

Durée différente → Comporte le même comportement que dégrader

  • Prend effet à la date de renouvellement suivante
  • Exemple : Abonnement mensuel Premium (Niveau 1) → Abonnement annuel Premium (Niveau 1)

Même durée → Comporte le comportement de mise à niveau

  • Prend effet immédiatement
  • Exemple : Premium Mensuel (Niveau 1) → Ultimate Mensuel (Niveau 1)
  1. Naviguez vers les Abonnements

    Dans App Store Connect, sélectionnez votre application et allez à Monétiser > Abonnements.

  2. Créer un Groupe

    Cliquez + à côté de “Groupe d'abonnements” pour créer un nouveau groupe.

  3. Nommer le Groupe

    Choisissez un nom décritif qui reflète les abonnements qu'il contient :

    • “Accès Premium”
    • “Plans de Stockage Cloud”
    • “Fonctionnalités Pro”
  4. Ajouter des Abonnements

    Après avoir créé le groupe, ajoutez des abonnements individuels à celui-ci. Chaque abonnement aura un niveau de classement.

  5. Définir les Classes de Niveau

    Organisez les abonnements de la valeur la plus élevée (1) à la valeur la plus basse. Considérez :

    • Les plans annuels sont généralement classés plus haut que les plans mensuels
    • Les tarifs plus élevés sont classés au-dessus des tarifs moins élevés
    • Les tarifs ultimes/prémières sont classés les plus hauts

Le plugin native-purchases gère automatiquement la logique des groupes d'abonnements :

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();
}
});

Communiquez toujours clairement le comportement de changement :

For Upgrades:

“Vous obtiendrez un accès immédiat aux fonctionnalités Premium. Nous proratiserons votre abonnement actuel.”

For Downgrades:

“Vous conserverez l'accès Premium jusqu'à [date de renouvellement], puis vous passerez à Standard.”

For Crossgrades:

“Votre plan changera à la facturation annuelle à la prochaine renouvellement le [date].”

Utilisez les notifications de serveur de l'App Store de Apple v2 ou votre propre backend de validation de récépissé pour refléter les modifications de StoreKit dans votre base de données. Associez les notifications de serveur avec l'écouteur afin que le client et le backend restent synchronisés. transactionUpdated Meilleures pratiques

Sous-titre « Meilleures pratiques »

Server monitoring
  • Conserver les abonnements liés dans le même groupe
  • Ne mêlez pas les fonctionnalités non liées (par exemple, stockage et suppression des publicités)
  • Créer des groupes séparés pour différents ensembles de fonctionnalités
  • Les plans annuels → Niveau supérieur que les plans mensuels (pour le même niveau)
  • Les tarifs plus élevés → Niveau supérieur
  • Considérer la valeur, et non seulement le prix
  • Afficher clairement la souscription actuelle
  • Afficher toutes les options disponibles dans le groupe
  • Indiquer lesquelles des modifications sont immédiates vs. à la renouvellement
  • Permettre un passage facile entre les plans
  • Tester tous les scénarios de mise à niveau
  • Tester tous les scénarios de dégradation
  • Vérifier le comportement de croisage
  • Vérifier le tirage de webhook
Level 1: Ultimate Monthly ($19.99)
Level 2: Premium Monthly ($9.99)
Level 3: Basic Monthly ($4.99)
  • Basic → Premium : Mise à niveau (immédiate)
  • Premium → Ultimate : Mise à niveau (immédiate)
  • Ultimate → Premium : Degrader (à la renouvellement)
  • Basic → Ultimate : Mise à niveau (immédiate)
Level 1: Premium Annual ($99.99/year)
Level 2: Premium Monthly ($9.99/month)
  • Mensuel → Annuel : Crois-grader (à la renouvellement)
  • Annuel → Mensuel : Degrader (à la renouvellement)
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)

Cette configuration offre la plus grande flexibilité tout en maintenant une logique d'amélioration/diminution claire.

Abonnement ne s'affiche pas dans le groupe :

  • Vérifiez qu'il est affecté au groupe correct
  • Vérifiez qu'il est en au moins « Prêt à soumettre »
  • Assurez-vous que l'ID du produit est correct

Comportement d'amélioration/diminution incorrect :

  • Examinez les classements de niveau (1 = le plus élevé)
  • Vérifiez que les niveaux de souscription sont sensés
  • Vérifiez que les niveaux sont correctement configurés

Produits de différents groupes :

  • Les utilisateurs peuvent souscrire à plusieurs groupes simultanément
  • Cela est intentionnel - gardez les produits liés dans le même groupe

getActiveProducts affichant plusieurs abonnements :

  • Vérifiez si les abonnements sont dans des groupes différents
  • Vérifiez que l'utilisateur n'est pas abonné via la partage familial
  • Révisez l'état de la souscription dans App Store Connect

Pour plus de détails, consultez la la documentation officielle d'Apple sur les groupes d'abonnement.

Continuez de la section « Créer un groupe d'abonnement iOS »

Section intitulée « Continuez de Créer un groupe d'abonnement iOS »

Si vous utilisez Créer un groupe d'abonnement iOS pour planifier l'approbation et la distribution de l'appareil, connectez-le avec Utilisation de @capgo/native-purchases pour la capacité native dans Utilisation de @capgo/native-purchases, @capgo/capacitor-in-app-review pour le détail d'implémentation dans @capgo/capacitor-in-app-review, Utilisation de @capgo/capacitor-in-app-review pour la capacité native dans Utilisation de @capgo/capacitor-in-app-review, @capgo/capacitor-marché natif pour le détail d'implémentation dans @capgo/capacitor-marché natif, et En utilisant @capgo/capacitor-marché natif pour la capacité native dans En utilisant @capgo/capacitor-marché natif.