Abonnements
Lister et inspecter
ascelerate sub groups <bundle-id>
ascelerate sub list <bundle-id>
ascelerate sub info <bundle-id> <product-id>
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>
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>
# 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-decreasepour reconnaître l'impact sur les revenus —--yesseul 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
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
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
# 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 \
--territory 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. Sans --territory, l'offre s'applique globalement ; avec --territory, elle est limitée à cette seule région. --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>
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>
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 (pas encore implémentées)
Les offres de reconquête (offres pour les abonnés perdus) ne sont intentionnellement pas encore implémentées. Le type WinBackOfferPriceInlineCreate dans notre dépendance asc-swift ne contient pas les relations territory et subscriptionPricePoint requises par l'API, donc nous ne pouvons pas construire une requête de création valide. À revoir lorsque la dépendance sera mise à jour.