Tous les articles
Deep dive7 min de lecture

L'envoi des informations de consommation d'Apple demande maintenant cinq champs, pas douze, et voici chacun d'eux

Quand un client demande un remboursement à Apple, la charge Send Consumption Information est votre réponse. Apple l'a réduite de douze champs à cinq, trois obligatoires et deux facultatifs. Voici chaque champ, les valeurs que chacun accepte et la fenêtre de 12 heures dans laquelle vous l'envoyez.

Un smartphone à côté d'une fine pile de formulaires papier dont la plupart des pages sont arrachées, illustrant la charge Send Consumption Information d'Apple réduite de douze champs à cinq

Points clés

  • La charge Send Consumption Information d'Apple porte maintenant cinq champs, contre douze auparavant. Trois sont obligatoires, customerConsented, deliveryStatus et sampleContentProvided, et deux sont facultatifs, consumptionPercentage et refundPreference.
  • customerConsented est une barrière stricte. La propre consigne d'Apple est que, si le client n'a pas accepté de partager les données de consommation, vous n'envoyez pas du tout la charge.
  • deliveryStatus porte votre signal le plus fort. DELIVERED indique que l'achat a fonctionné, et les quatre valeurs UNDELIVERED disent à Apple que le client n'a jamais reçu un produit fonctionnel.
  • consumptionPercentage a remplacé l'ancien enum consumptionStatus à quatre paliers par un nombre précis en milliunits, où 100,000 milliunits signifie que l'article a été entièrement consommé.
  • refundPreference est désormais une chaîne, pas un nombre. Les trois valeurs sont DECLINE, GRANT_FULL et GRANT_PRORATED, et elle exprime une préférence, pas une décision. Apple décide toujours.
  • Vous envoyez la charge avec un PUT vers le endpoint Send Consumption Information identifié par l'id de la transaction, et Apple renvoie 202 Accepted avec un corps vide. La fenêtre est de 12 heures après le CONSUMPTION_REQUEST.
  • Pour les abonnements à renouvellement automatique Apple calcule la consommation elle-même à partir du temps écoulé, donc consumptionPercentage est destiné aux achats consommables et non renouvelables.

La liste des faits qu'Apple vous demande quand un client veut un remboursement est devenue bien plus courte. La charge Send Consumption Information, la seule réponse qu'un développeur peut apporter à une décision de remboursement de l'App Store, avait autrefois douze champs. Elle en a maintenant cinq. Apple l'a allégée autour de la WWDC24 et a condensé la plupart des anciennes questions de profilage de compte en deux questions simples et un nombre. Moins de champs n'est pas une petite modification. Cela change quelles preuves Apple pèse et cela change quels champs vous ne pouvez pas vous permettre de rater.

Voici pourquoi cela mérite votre attention et n'est pas juste une note sur le schéma. Cette charge est le seul moment dans un remboursement Apple où votre version de l'histoire atteint la décision. Un remboursement de consommable annule des revenus que vous avez déjà dépensé de l'argent réel pour livrer, et les cinq champs sont la façon dont vous dites à Apple que le produit a été livré et utilisé. Manquez la fenêtre de 12 heures ou remplissez mal un champ, et Apple tranche sur la seule réclamation du client.

Ce qu'est Send Consumption Information

Send Consumption Information est le endpoint de l'App Store Server API que vous appelez après qu'Apple a envoyé à votre serveur une notification CONSUMPTION_REQUEST. Cette notification signifie qu'un client a demandé à Apple un remboursement sur un achat intégré et qu'Apple veut votre contribution avant de décider. Vous répondez en envoyant avec un PUT un petit corps JSON, le ConsumptionRequest, vers le endpoint. Apple le lit, le pèse face à l'historique du client et prend la décision. Vous ne décidez jamais du remboursement. Vous fournissez des faits.

Le corps est toute l'interface. Il n'y a pas de formulaire séparé, pas d'appel, pas de second envoi qui compte. Ce que vous envoyez dans cette unique charge est votre dossier complet, donc le sens de chaque champ importe plus que le nombre de champs ne le suggère.

Les cinq champs qu'Apple demande maintenant

Le ConsumptionRequest actuel a cinq membres. Trois sont obligatoires et deux sont facultatifs. Tout ce qu'Apple demandait autrefois sur le compte du client, son ancienneté, ses dépenses cumulées, ses remboursements cumulés, son temps de jeu, a été retiré de ce que vous envoyez.

ChampObligatoireTypeCe qu'il porte
customerConsentedOuiBooléenSi le client a accepté de partager les données de consommation avec Apple
deliveryStatusOuiChaîneSi votre app a livré un produit fonctionnel
sampleContentProvidedOuiBooléenSi vous avez proposé un échantillon ou un essai gratuit avant l'achat
consumptionPercentageNonEntierQuelle part de l'achat a été consommée, en milliunits
refundPreferenceNonChaîneVotre résultat préféré pour la demande de remboursement

customerConsented est la barrière

customerConsented est un booléen, et c'est le champ qui décide si vous envoyez quoi que ce soit. Il enregistre si le client a accepté que vous partagiez les données de consommation avec Apple. La consigne d'Apple est directe : si le client n'a pas consenti, n'envoyez pas les informations de consommation. Ce n'est donc pas un champ que vous mettez à true pour renforcer votre dossier. Il reflète un oui ou non réel que vous devez déjà détenir, et un false ici signifie que le reste de la charge ne doit pas être envoyé.

deliveryStatus est le champ qui fait bouger les remboursements

deliveryStatus est un enum de chaîne, et c'est le levier le plus fort dont vous disposez. Il dit à Apple si votre app a réellement livré un achat intégré fonctionnel. Une valeur dit oui. Les quatre autres disent non, chacune pour une raison différente, et chacune dit à Apple que le client a un grief légitime.

ValeurCe qu'elle dit à Apple
DELIVEREDL'app a livré un achat intégré fonctionnel
UNDELIVERED_QUALITY_ISSUEL'achat n'a pas été livré à cause d'un problème de qualité
UNDELIVERED_WRONG_ITEMLe client a reçu le mauvais article
UNDELIVERED_SERVER_OUTAGEUne panne de serveur a interrompu la livraison
UNDELIVERED_OTHERL'achat n'a pas été livré pour une autre raison

sampleContentProvided répond à une question d'équité

sampleContentProvided est un booléen. Il enregistre si vous avez donné au client un échantillon gratuit, un essai ou une information claire sur ce que fait l'achat avant qu'il n'achète. Un true ici est un petit signal d'équité : le client a eu la chance de savoir ce qu'il achetait. Il ne décide rien à lui seul, mais c'est l'un des trois seuls champs obligatoires, donc Apple le veut clairement dans chaque réponse.

consumptionPercentage est maintenant un nombre, pas un statut

C'est le champ qui a le plus changé. L'ancienne charge avait consumptionStatus, un enum à quatre paliers : UNDECLARED, NOT_CONSUMED, PARTIALLY_CONSUMED, FULLY_CONSUMED. La nouvelle charge le remplace par consumptionPercentage, un entier mesuré en milliunits. 100,000 milliunits signifie que l'article a été entièrement consommé, donc 50,000 c'est la moitié et 0 c'est intact. Un nombre précis vaut mieux qu'un panier à quatre choix, car il vous permet de dire qu'un client a brûlé 90 pour cent d'un pack de crédits plutôt que d'arrondir vers le bas à partiellement consommé.

Une réserve qui déroute les gens. Pour les abonnements à renouvellement automatique Apple calcule la consommation elle-même à partir du temps écoulé, donc consumptionPercentage est destiné aux achats consommables et non renouvelables. Envoyez-le là où il s'applique, et laissez Apple le dériver là où il ne s'applique pas.

Un smartphone affichant un anneau de progression circulaire rempli environ aux deux tiers, illustrant consumptionPercentage mesuré en milliunits où 100,000 signifie entièrement consommé

refundPreference exprime une préférence, pas un verdict

refundPreference est une chaîne facultative, et c'est là que vous dites à Apple quel résultat vous préféreriez. Il a aussi changé de forme. L'ancien champ était un nombre avec des valeurs comme prefer-grant, prefer-decline et no-preference. Le nouveau est une chaîne nommée à trois valeurs.

ValeurCe que vous demandez
GRANT_FULLVous préféreriez qu'Apple accorde un remboursement complet
GRANT_PRORATEDVous préféreriez un remboursement partiel reflétant ce qui a été utilisé
DECLINEVous préféreriez qu'Apple refuse le remboursement

Ce qu'Apple a supprimé, et pourquoi cela compte

L'ancien ConsumptionRequest avait douze champs. Sept d'entre eux ont disparu de ce que vous envoyez. accountTenure, lifetimeDollarsPurchased, lifetimeDollarsRefunded, playTime, userStatus, platform et appAccountToken étaient la moitié profilage de compte de la charge, les champs qui vous demandaient de classer un client selon depuis combien de temps il avait un compte, combien il avait dépensé, combien on l'avait remboursé et depuis combien de temps il utilisait l'app.

Apple les a supprimés pour une raison qui mérite d'être notée. Ces champs demandaient aux développeurs de livrer un profil du client, et la plupart des développeurs soit les laissaient non déclarés soit les devinaient. Les cinq qui restent portent sur l'achat et la livraison, des faits que vous pouvez réellement vérifier depuis vos propres systèmes. Le glissement va de qui est le client à ce qui s'est passé avec cet achat précis.

Ancienne chargeCharge actuelle
Total des champs125
Champs obligatoiresEn pratique aucun imposé3
Signal de consommationconsumptionStatus, quatre paniersconsumptionPercentage, milliunits exacts
Préférence de remboursementEnum numériqueChaîne nommée, 3 valeurs
Profilage de compteancienneté, dépenses cumulées, remboursements, temps de jeu, statutSupprimé

Le endpoint et l'horloge

Vous envoyez la charge avec un PUT HTTP vers le endpoint Send Consumption Information, identifié par l'id de la transaction de l'achat en litige : PUT /inApps/v1/transactions/consumption/{transactionId}. Un succès renvoie 202 Accepted, et le corps de la réponse est vide. Cette réponse vide est attendue, pas un bug. Elle confirme qu'Apple a mis vos données en file, et ne vous dit rien sur le résultat final, qui arrive plus tard sous forme de notification REFUND ou REFUND_DECLINED.

L'horloge est la partie que vous ne pouvez pas étirer. Apple vous donne 12 heures à partir du CONSUMPTION_REQUEST pour répondre. Seule votre première réponse est utilisée, donc la première charge doit être la complète et correcte. Apple peut envoyer le CONSUMPTION_REQUEST plus d'une fois pour le même achat, mais le délai de chacun est fixe, et une revue manuelle tient rarement dans 12 heures entre fuseaux horaires et week-ends.

Ce que coûte un champ mal géré

L'argent a quitté les lieux avant le remboursement

Le remboursement d'un consommable n'est pas une annulation propre. Au moment où un client réclame son argent sur un pack de crédits ou un lot de générations d'IA, vous avez déjà dépensé pour le livrer : inférence GPU sur chaque requête, appels à des API de modèles tiers facturés au token, stockage de ce que vous avez produit, et tout versement aux créateurs ou partenaires lié à cet usage. Le prix de la boutique revient au client. Votre coût de livraison ne vous revient pas. Donc un remboursement que vous auriez pu contester n'est pas un événement à l'équilibre, c'est une perte nette de tout ce que vous avez payé pour servir le compte.

Les cinq champs sont la façon d'éviter de payer deux fois

deliveryStatus réglé sur DELIVERED et un consumptionPercentage élevé sont les deux faits qui disent à Apple que le client a reçu et utilisé le produit. Ils sont votre preuve que le calcul, les appels d'API et le stockage ont tous fait leur travail. Laissez la charge non envoyée et Apple n'en entend jamais parler. Elle décide à partir de la réclamation du client, le remboursement passe plus probablement, et vous encaissez à la fois les revenus annulés et le coût de livraison derrière.

Les rétrofacturations sont la pire porte, et le silence y mène

Un client qui n'obtient pas satisfaction via le flux de remboursement d'Apple peut encore contester la charge auprès de sa banque. Une rétrofacturation de carte est définitive, elle porte des frais de litige fixes, et elle retire la décision des mains d'Apple et des vôtres. Bien répondre au CONSUMPTION_REQUEST maintient le litige dans le système d'Apple, où vous avez voix au chapitre. L'ignorer pousse les cas limites vers le seul canal où vous n'en avez aucune.

Comment RefundHalt gère cela

Les cinq champs semblent simples jusqu'à ce que vous deviez les remplir correctement, en 12 heures, à chaque CONSUMPTION_REQUEST, rattachés à la bonne transaction. RefundHalt capte la notification, lit vos propres relevés de livraison et d'usage pour cet achat, et envoie la charge automatiquement avant que la fenêtre ne se ferme. deliveryStatus reflète ce que vos journaux montrent réellement, consumptionPercentage vient d'un usage réel plutôt que d'une supposition, et refundPreference suit la politique que vous avez configurée une fois. Vous obtenez le remboursement contestable examiné avec des preuves, pas un délai manqué et une décision prise sans vous.

Questions fréquentes

Combien de champs le Send Consumption Information d'Apple a-t-il maintenant ?
Cinq. Trois sont obligatoires, customerConsented, deliveryStatus et sampleContentProvided, et deux sont facultatifs, consumptionPercentage et refundPreference. La version précédente de la charge avait douze champs, et Apple a retiré ceux de profilage de compte comme accountTenure, lifetimeDollarsPurchased et userStatus.
Que signifie deliveryStatus dans un consumption request ?
deliveryStatus dit à Apple si votre app a livré un achat intégré fonctionnel. DELIVERED signifie que oui. Les quatre valeurs UNDELIVERED, UNDELIVERED_QUALITY_ISSUE, UNDELIVERED_WRONG_ITEM, UNDELIVERED_SERVER_OUTAGE et UNDELIVERED_OTHER, chacune dit que non, pour une raison déclarée. C'est le signal le plus fort de la charge, il doit donc correspondre à vos propres journaux.
consumptionPercentage est-il un pourcentage ou un nombre brut ?
C'est un entier mesuré en milliunits, pas un simple pourcentage. 100,000 milliunits signifie que le client a entièrement consommé l'achat, donc 50,000 c'est la moitié et 0 c'est intact. Il a remplacé l'ancien enum consumptionStatus, qui n'avait que quatre paniers, de non consommé à entièrement consommé.
Régler refundPreference sur DECLINE arrête-t-il le remboursement ?
Non. refundPreference exprime votre résultat préféré, il ne décide rien. DECLINE dit à Apple que vous préféreriez qu'elle ne rembourse pas, et GRANT_FULL ou GRANT_PRORATED disent le contraire, mais Apple pèse votre préférence face à l'historique du client et à sa propre politique et prend la décision finale.
Et si le client n'a pas consenti à partager les données de consommation ?
Alors vous ne devez pas envoyer la charge. customerConsented est un booléen obligatoire, et la consigne d'Apple est que, si le client n'a pas accepté de partager les données de consommation, vous ne répondez pas du tout au CONSUMPTION_REQUEST. Le consentement est un oui ou non réel que vous devez déjà détenir, pas une valeur que vous mettez à true pour aider votre dossier.
Combien de temps ai-je pour envoyer les informations de consommation ?
12 heures à partir du moment où Apple envoie la notification CONSUMPTION_REQUEST. Vous répondez avec un PUT vers le endpoint Send Consumption Information, et un succès renvoie 202 Accepted avec un corps vide. Seule votre première réponse est utilisée, donc la première charge doit être complète, et un processus manuel tient rarement dans la fenêtre.

Sources et lectures complémentaires

RefundHalt

Le pilote automatique des remboursements pour l'App Store et Google Play

Poursuivre la lecture

La prochaine demande de remboursement est déjà en route.

Configurez RefundHalt dans le temps qu'il vous faudrait pour lire un nouvel e-mail d'assistance au sujet d'un remboursement que vous n'avez pas pu contester.