Aller au contenu principal

Abonnements

Lister et inspecter​

ascelerate sub groups <bundle-id>
ascelerate sub list <bundle-id>
ascelerate sub info <bundle-id> <product-id>

Les trois commandes acceptent --json pour une sortie lisible par machine (conventions) ; info rapporte l'avertissement de prix manquants sous la forme d'un booléen hasPricing.

Créer, mettre à jour et supprimer des abonnements​

ascelerate sub create <bundle-id> --name "Monthly" --product-id <product-id> --period ONE_MONTH --group-id <group-id>
ascelerate sub update <bundle-id> <product-id> --name "Monthly Plan"
ascelerate sub delete <bundle-id> <product-id>

Groupes d'abonnements​

ascelerate sub create-group <bundle-id> --name "Premium"
ascelerate sub update-group <bundle-id> --name "Premium Plus"
ascelerate sub delete-group <bundle-id>

Soumettre pour examen​

ascelerate sub submit <bundle-id> <product-id>

Un produit peut être soumis dès qu'il possède une version en attente, c'est-à-dire une version à l'état « Prepare for Submission », « Ready for Review » ou dans un état rejeté. Cela inclut les produits approuvés modifiés depuis leur dernière approbation. Sans version en attente, la commande s'arrête avant d'envoyer la moindre requête. sub info affiche la version en attente lorsqu'il y en a une.

Localisations d'abonnements​

ascelerate sub localizations view <bundle-id> <product-id>
ascelerate sub localizations export <bundle-id> <product-id>
ascelerate sub localizations import <bundle-id> <product-id> --file sub-de.json

Localisations de groupes​

ascelerate sub group-localizations view <bundle-id>
ascelerate sub group-localizations export <bundle-id>
ascelerate sub group-localizations import <bundle-id> --file group-de.json

Les commandes d'import créent automatiquement les langues manquantes avec confirmation, vous permettant d'ajouter de nouvelles langues sans passer par App Store Connect.

Tarification​

La tarification des abonnements est spécifique à chaque région. Il n'existe pas de mécanisme d'alignement automatique comme pour les achats intégrés — chaque région que vous souhaitez tarifer nécessite son propre enregistrement. La CLI permet soit de définir le prix pour une seule région, soit de le diffuser sur toutes les régions en utilisant les paliers tarifaires en monnaie locale d'Apple.

# Afficher les prix actuels par région (avertit s'il n'y en a pas)
ascelerate sub pricing show <bundle-id> <product-id>

# Les afficher au format JSON (prix, devise, date de début et indicateur de préservation par région)
ascelerate sub pricing show <bundle-id> <product-id> --json

# Lister les paliers tarifaires disponibles pour une région
ascelerate sub pricing tiers <bundle-id> <product-id> --territory USA

# Définir le prix pour une seule région
ascelerate sub pricing set <bundle-id> <product-id> --price 4.99 --territory USA

# Diffuser le prix sur toutes les régions (un POST par région)
ascelerate sub pricing set <bundle-id> <product-id> --price 4.99 --equalize-all-territories

Changements de prix et abonnés existants​

Apple traite les changements de prix différemment pour les abonnés existants selon le sens du changement. sub pricing set récupère le prix actuel pour chaque région concernée, classe le changement et applique le bon comportement :

  • Baisse : les abonnés existants passent automatiquement au prix inférieur. Les exécutions interactives demandent confirmation avec un avertissement. En mode --yes, vous devez ajouter --confirm-decrease pour reconnaître l'impact sur les revenus — --yes seul ne suffit pas.
  • Hausse : vous devez choisir explicitement comment gérer les abonnés existants. La commande échoue à moins que l'une des options suivantes ne soit définie :
    • --preserve-current — conserve les abonnés existants à leur ancien prix
    • --no-preserve-current — applique le nouveau prix aux abonnés existants après la période de notification d'Apple
  • Nouvelle région (aucun prix existant) : pas d'abonnés existants à considérer ; les drapeaux sont facultatifs.
  • Inchangé : ignoré silencieusement.

Les mêmes règles s'appliquent de manière agrégée pour --equalize-all-territories. Si une région de la diffusion est une hausse, le drapeau de préservation est requis pour toutes. Si l'une est une baisse en mode --yes, --confirm-decrease est requis.

# Hausse de prix globale standard : $4.99 → $9.99 dans toutes les régions,
# conserver les abonnés existants à l'ancien prix
ascelerate sub pricing set myapp com.example.monthly \
--price 9.99 --territory USA --equalize-all-territories \
--preserve-current

Copier les prix entre produits​

# Exporter le prix actuel de chaque région en JSON
ascelerate sub pricing export <bundle-id> <product-id> --output prices.json

# L'appliquer à un autre abonnement — dans la même app ou une autre
ascelerate sub pricing import <other-bundle-id> <other-product-id> --file prices.json

Le fichier contient les prix client indexés par code de région (les prix préservés et les prix planifiés pour le futur sont exclus de l'export). À l'import, chaque prix est mis en correspondance avec les paliers tarifaires de l'abonnement cible d'après le prix client ; le même fichier fonctionne donc d'un produit ou d'une app à l'autre. L'import ne touche que les régions listées dans le fichier, ignore celles déjà au prix indiqué et applique les mêmes règles de sécurité pour les hausses et les baisses que set — y compris --preserve-current/--no-preserve-current et --confirm-decrease.

Un prix qui ne correspond à aucun palier de la cible fait échouer l’importation, qui indique les paliers les plus proches ; avec --snap, chacun de ces prix prend plutôt le palier le plus proche (le moins cher à distance égale), et les prix ajustés sont listés avant la confirmation.

Les erreurs transitoires d'App Store Connect (HTTP 429/5xx) lors des écritures multi-régions sont automatiquement réessayées — d'abord sur place avec temporisation, puis dans une seconde passe en fin d'exécution. Les régions qui échouent malgré tout sont listées dans le rapport final et la commande se termine avec un code d'erreur ; relancer la même commande ne réessaie que celles-ci, les régions déjà mises à jour étant ignorées comme inchangées.

Disponibilité territoriale​

Chaque abonnement a sa propre disponibilité territoriale, indépendante de l'application. Par défaut, un abonnement hérite des territoires de son application ; dès que vous appelez sub availability avec des modifications, l'abonnement obtient une liste explicite.

ascelerate sub availability <bundle-id> <product-id>
ascelerate sub availability <bundle-id> <product-id> --add CHN,RUS
ascelerate sub availability <bundle-id> <product-id> --remove ITA
ascelerate sub availability <bundle-id> <product-id> --available-in-new-territories true
ascelerate sub availability <bundle-id> <product-id> --plan monthly --add DEU,FRA

Les abonnements annuels peuvent aussi être proposés en mensuel avec engagement de 12 mois (facturé chaque mois ; non proposé aux États-Unis ni à Singapour). Ce plan de facturation a sa propre liste de territoires : ajoutez --plan monthly pour l'afficher ou la modifier. Sans --plan, la commande gère le plan habituel payé d'avance.

Offres d'introduction​

Les offres d'introduction ciblent les nouveaux abonnés — essais gratuits et remises d'introduction.

ascelerate sub intro-offer list <bundle-id> <product-id>

# Essai gratuit (pas de prix nécessaire ; --periods + --duration définissent la durée)
ascelerate sub intro-offer create <bundle-id> <product-id> \
--mode FREE_TRIAL --duration ONE_WEEK --periods 1 --territories all

# Remise pay-as-you-go (3 mois à 0,99 $/mois, limité aux USA)
ascelerate sub intro-offer create <bundle-id> <product-id> \
--mode PAY_AS_YOU_GO --duration ONE_MONTH --periods 3 \
--territories USA --price 0.99

# Mettre à jour uniquement la date de fin (les autres champs nécessitent suppression + recréation)
ascelerate sub intro-offer update <bundle-id> <product-id> <offer-id> --end-date 2026-12-31

ascelerate sub intro-offer delete <bundle-id> <product-id> <offer-id>

Modes : FREE_TRIAL, PAY_AS_YOU_GO, PAY_UP_FRONT. --territories est obligatoire : des codes de pays ou régions comme USA,TUR, ou all. Apple conserve une offre par pays ou région, et ascelerate les crée en une seule requête, en ignorant les pays ou régions où l'offre chevaucherait une offre existante ou qui ont déjà une offre à venir. Le --price d'une offre payante est exprimé dans la devise du premier pays ou région ; les autres reçoivent le prix équivalent d'Apple. --price est requis pour les deux modes payants et interdit pour FREE_TRIAL.

Offres promotionnelles​

Les offres promotionnelles ciblent les abonnés existants — typiquement utilisées pour les flux de montée en gamme dans l'application. Le code de l'offre (la valeur --code) doit être intégré dans une charge utile signée que votre serveur génère au moment de l'exécution avant que les clients puissent l'utiliser.

ascelerate sub promo-offer list <bundle-id> <product-id>
ascelerate sub promo-offer info <bundle-id> <product-id> <offer-id>

# Créer — même motif mono-région ou --equalize-all-territories
ascelerate sub promo-offer create <bundle-id> <product-id> \
--name "Loyalty 50%" --code LOYALTY50 \
--mode PAY_AS_YOU_GO --duration ONE_MONTH --periods 3 \
--price 4.99 --territory USA --equalize-all-territories

# Mettre à jour uniquement les prix (les autres champs nécessitent suppression + recréation)
ascelerate sub promo-offer update <bundle-id> <product-id> <offer-id> \
--price 5.99 --equalize-all-territories

ascelerate sub promo-offer delete <bundle-id> <product-id> <offer-id>

Messages et offres de fidélisation​

Lorsqu'un abonné va résilier depuis les réglages d'abonnement de l'App Store, l'App Store peut lui montrer un message de fidélisation : un titre et un texte dans sa langue, une image facultative et des offres pour rester. Un message appartient à l'app et passe par App Review. Chaque abonnement affiche un message et, dans celui-ci, les offres de fidélisation de votre choix.

ascelerate sub retention-message list <bundle-id>
ascelerate sub retention-message info <bundle-id> "Stay with us"
ascelerate sub retention-message create <bundle-id> --name "Stay with us" \
--locale en-US --header "Before you go" --body "Your plan gets new features every month."
ascelerate sub retention-message localizations set <bundle-id> "Stay with us" \
--locale fr-FR --header "Avant de partir" --body "Votre abonnement reçoit de nouvelles fonctions chaque mois."
ascelerate sub retention-message image upload <bundle-id> "Stay with us" ./retention.png
ascelerate sub retention-message submit <bundle-id> "Stay with us"
ascelerate sub retention-message new-version <bundle-id> "Stay with us"

# Offres de fidélisation, puis le message et les offres qu'un abonnement affiche
ascelerate sub retention-offer create <bundle-id> <product-id> \
--name "Half off" --offer-id stay.half --mode PAY_AS_YOU_GO --duration ONE_MONTH --periods 3 \
--paid-months 6 --wait-months 12 --price 4.99 --territories all
ascelerate sub retention-offer update <bundle-id> <product-id> stay.half --paid-months 3
ascelerate sub retention-message assign <bundle-id> <product-id> "Stay with us" --offers stay.half
  • Texte et image : le titre accepte 66 caractères et le texte 144. L'image est au format 16:9 sans transparence : 3840×2160 (PNG ou JPEG) ou 5244×2950 (PNG), une par version.
  • Versions : un message n'a qu'une version non publiée à la fois. Une fois qu'App Review l'a reçue, new-version commence la suivante. submit ajoute le message à la soumission en brouillon ; envoyez-la avec apps review submit.
  • Qui reçoit une offre : les abonnés qui ont payé au moins --paid-months mois (1–24, 36, 48 ou 60) et, avec --wait-months, dont la dernière offre remonte à 2–24 mois. Seuls ces deux critères changent après la création d'une offre, et un délai ne peut plus être retiré une fois fixé.
  • Prix : le --price d'une offre payante s'applique au premier pays ou région de --territories ; les autres reçoivent le prix équivalent d'Apple. Un essai gratuit n'a pas de prix. --plan monthly cible le paiement mensuel d'un abonnement annuel (paiement initial par défaut).

Codes promotionnels​

Codes échangeables pour abonnements, en deux variantes :

  • Codes à usage unique : Apple génère N codes uniques dans un lot (de manière asynchrone).
  • Codes personnalisés : chaîne fournie par le développeur, utilisable N fois.
ascelerate sub offer-code list <bundle-id> <product-id>
ascelerate sub offer-code info <bundle-id> <product-id> <offer-code-id>

# Créer un code promotionnel (avec tous les attributs d'offre)
ascelerate sub offer-code create <bundle-id> <product-id> \
--name "Launch Free Month" \
--eligibility NEW \
--offer-eligibility STACK_WITH_INTRO_OFFERS \
--mode FREE_TRIAL --duration ONE_MONTH --periods 1 \
--price 0 --territory USA --equalize-all-territories

ascelerate sub offer-code toggle <bundle-id> <product-id> <offer-code-id> --active true

# Générer des codes à usage unique (asynchrone)
ascelerate sub offer-code gen-codes <bundle-id> <product-id> <offer-code-id> \
--count 500 --expires 2026-12-31

# Récupérer les valeurs réelles des codes une fois la génération terminée
ascelerate sub offer-code view-codes <one-time-use-batch-id> --output codes.txt

# Ajouter un code personnalisé fourni par le développeur
ascelerate sub offer-code add-custom-codes <bundle-id> <product-id> <offer-code-id> \
--code SUBPROMO --count 1000 --expires 2026-12-31

Éligibilités client pour les codes promotionnels d'abonnement : NEW, EXISTING, EXPIRED. Éligibilité de l'offre : STACK_WITH_INTRO_OFFERS ou REPLACE_INTRO_OFFERS.

Soumettre un groupe d'abonnements pour examen​

Les groupes d'abonnements sont examinés en même temps que la prochaine version de l'application. sub submit-group est l'équivalent au niveau du groupe de sub submit.

ascelerate sub submit-group <bundle-id>

Le groupe doit avoir sa propre version en attente (par exemple des localisations de groupe modifiées) ; sinon la commande s'arrête avant d'envoyer la moindre requête.

Images promotionnelles​

Téléchargez les images promotionnelles affichées à côté de l'abonnement dans l'App Store.

ascelerate sub images list <bundle-id> <product-id>
ascelerate sub images upload <bundle-id> <product-id> ./hero.png
ascelerate sub images delete <bundle-id> <product-id> <image-id>

Capture d'écran d'examen App Review​

Chaque abonnement peut avoir au plus une capture d'écran App Review. Un téléchargement remplace toute capture existante.

ascelerate sub review-screenshot view <bundle-id> <product-id>
ascelerate sub review-screenshot upload <bundle-id> <product-id> ./review.png
ascelerate sub review-screenshot delete <bundle-id> <product-id>

Les téléchargements d'images et de captures d'écran utilisent le flux en 3 étapes d'Apple (réserver → envoyer les morceaux par PUT → valider avec MD5). Un seul appel upload gère les trois étapes.

Offres de reconquête​

Les offres de reconquête s'adressent aux personnes dont l'abonnement a pris fin : l'App Store leur propose une réduction ou une période gratuite pour revenir, d'une date de début à une date de fin facultative. Seul un abonnement approuvé peut en avoir.

ascelerate sub win-back-offer list <bundle-id> <product-id>
ascelerate sub win-back-offer info <bundle-id> <product-id> comeback.half
ascelerate sub win-back-offer create <bundle-id> <product-id> \
--name "Come back" --offer-id comeback.half --mode PAY_AS_YOU_GO --duration ONE_MONTH --periods 3 \
--since-months 3-12 --paid-months 6 --end-date 2027-01-31 --priority high --promote \
--price 4.99 --territories all
ascelerate sub win-back-offer update <bundle-id> <product-id> comeback.half --since-months 2-24 --end-date 2027-03-31
ascelerate sub win-back-offer delete <bundle-id> <product-id> comeback.half
  • Qui reçoit une offre : les personnes dont l'abonnement a pris fin il y a --since-months mois (une plage, de 1–23 à 2–24 mois), qui ont payé au moins --paid-months mois (1–24, 36, 48 ou 60) et, avec --wait-months, dont la dernière offre remonte à 2–24 mois.
  • Dates : elle commence le --start-date (demain au plus tôt, et par défaut) et, avec --end-date, se termine au moins 3 jours plus tard.
  • Sur l'App Store : --priority high la place avant les autres offres ; --promote permet à l'App Store de la promouvoir avec des éléments générés par Apple.
  • Prix : comme pour les offres de fidélisation, --price s'applique au premier pays ou région de --territories et les autres reçoivent le prix équivalent d'Apple ; un essai gratuit n'a pas de prix. Une offre PAY_AS_YOU_GO dure la période de l'abonnement lui-même (ONE_YEAR pour un abonnement annuel).
  • Modifications : l'éligibilité, les dates, la priorité et la promotion peuvent changer ; pour le reste, supprimez l'offre et créez-la de nouveau.