Tous les articles
Analyse approfondie7 min de lecture

Chaque demande de remboursement Apple s'accompagne désormais d'un motif, et consumptionRequestReason est la façon de le lire

Depuis la WWDC24, chaque CONSUMPTION_REQUEST d'Apple contient un consumptionRequestReason, le motif déclaré par le client lui-même pour vouloir un remboursement. Il existe cinq valeurs, de UNINTENDED_PURCHASE à LEGAL, et chacune devrait changer ce que vous renvoyez dans votre fenêtre de 12 hours. Voici comment lire chacune d'elles.

Un smartphone posé sur un bureau sombre affichant un écran de paiement d'abonnement à côté d'une étiquette en papier vierge, illustrant le motif de la demande de remboursement Apple qui arrive désormais avec chaque demande de consommation

Points clés

  • Depuis la version 2.11 d'App Store Server Notifications, annoncée à la WWDC24, chaque notification CONSUMPTION_REQUEST inclut consumptionRequestReason, une chaîne qui indique pourquoi le client a demandé le remboursement.
  • Il existe exactement cinq valeurs : UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL et OTHER. Apple en envoie une par demande.
  • Le motif ne décide pas du remboursement. C'est un contexte que vous utilisez pour choisir votre refundPreference et vos données de consommation avant que la fenêtre de 12 hours ne se ferme.
  • CONSUMPTION_REQUEST se déclenche désormais aussi pour les abonnements à renouvellement automatique, et pas seulement pour les consommables, si bien que consumptionRequestReason concerne bien plus de vos remboursements qu'avant la WWDC24.
  • Un motif FULFILLMENT_ISSUE est un signal que votre propre livraison a peut-être échoué. Le contester consomme la fenêtre et invite une rétrofacturation plus tard. L'accorder est généralement la réponse la moins coûteuse.
  • Vous répondez en appelant Send Consumption Information dans les 12 hours avec customerConsented réglé sur true et un refundPreference de GRANT_FULL, GRANT_PRORATED ou DECLINE. Apple traite votre préférence comme une donnée, pas comme un ordre.
  • Un remboursement vous coûte toujours le calcul, les appels d'API, le stockage et les paiements que l'achat a déjà consommés. Le champ du motif est la façon dont vous ne dépensez votre défense que sur les cas qui valent la peine d'être défendus.

Apple a changé la manière dont les demandes de remboursement arrivent sur votre serveur, et beaucoup de développeurs ne l'ont jamais remarqué. Depuis la mise à jour 2.11 d'App Store Server Notifications annoncée à la WWDC24, chaque notification CONSUMPTION_REQUEST comporte un champ appelé consumptionRequestReason. C'est le motif déclaré par le client lui-même pour réclamer son argent. Une simple chaîne, cinq valeurs possibles, livrée dans la même charge utile à laquelle vous avez déjà douze heures pour répondre.

Le motif de la demande de remboursement Apple ne décide rien à lui seul. Ce qu'il fait, c'est vous indiquer dans laquelle de cinq situations très différentes vous vous trouvez, afin que vous cessiez d'envoyer les mêmes données de consommation génériques à un remboursement que vous devriez accorder et à un remboursement que vous devriez contester. Voici ce qu'est ce champ, les valeurs exactes qu'Apple peut envoyer, ce que chacune signale, et comment elle devrait changer la préférence et les preuves que vous renvoyez.

Ce qu'est réellement consumptionRequestReason

consumptionRequestReason est un champ de type chaîne dans l'objet data d'une notification CONSUMPTION_REQUEST. Apple l'a ajouté dans la version 2.11 d'App Store Server Notifications, en même temps que les changements de la WWDC24 apportés au flux de remboursement. Auparavant, la demande arrivait avec la transaction signée et rien sur le motif. Vous répondiez à l'aveugle. Désormais, le motif déclaré par le client voyage avec la demande.

Lisez attentivement le mot déclaré. C'est le motif que le client a sélectionné lorsqu'il a déposé sa demande auprès d'Apple, pas un fait qu'Apple a vérifié. UNINTENDED_PURCHASE ne prouve pas que l'achat est resté inutilisé, et UNSATISFIED_WITH_PURCHASE ne prouve pas que le produit était défectueux. La valeur est un prisme, pas un verdict. Vous l'associez toujours à vos propres registres de livraison et d'usage.

Il voyage dans la notification que vous traitez déjà

CONSUMPTION_REQUEST est le seul flux d'Apple qui demande des preuves au développeur. Son équivalent sur Google Play est l'examen de rétrofacturation via orders.reviewrefund. Lorsqu'une arrive, vous avez 12 hours pour répondre en appelant Send Consumption Information, un PUT vers le point de terminaison de consommation des transactions. consumptionRequestReason fait désormais partie de cette même notification, il n'y a donc rien de nouveau auquel s'abonner. Si vous analysez déjà CONSUMPTION_REQUEST, le motif est un champ que vous ignoriez probablement.

Les cinq motifs, et ce que chacun vous dit

Apple documente exactement cinq valeurs. Une seule arrive par demande. Voici l'ensemble complet et comment lire chacune en pratique.

ValeurCe que le client a déclaréCe que cela signifie généralement pour vous
UNINTENDED_PURCHASEIl n'avait pas l'intention de l'acheterSouvent une pression accidentelle ou familiale. Vérifiez la livraison et la consommation avant de décider.
FULFILLMENT_ISSUEIl n'a pas pu le recevoir ou l'utiliserRenvoie à votre propre livraison. Vérifiez vos journaux avant de contester.
UNSATISFIED_WITH_PURCHASEIl n'en était pas satisfaitRemords de l'acheteur. Ici, vos preuves de consommation pèsent le plus.
LEGALIl a invoqué un motif légalTraitez cela comme un octroi. Contester une demande légale ne vaut pas la fenêtre.
OTHERTout motif non listé ci-dessusAucun signal en soi. Repliez-vous sur vos données de livraison et d'usage.

UNINTENDED_PURCHASE est la catégorie de la pression accidentelle

C'est le motif qu'un parent sélectionne après qu'un enfant a acheté 10,000 pièces, ou un adulte qui a effleuré par erreur un bouton de confirmation. Il est corrélé aux achats qui n'ont jamais été ouverts ni utilisés. C'est précisément pourquoi vos propres données comptent. Si vos registres montrent que le consommable a été entièrement livré et largement consommé, une réclamation d'achat non intentionnel et un solde entièrement dépensé ne concordent pas, et cet écart vaut la peine d'être signalé via consumptionPercentage.

FULFILLMENT_ISSUE renvoie vers vous

FULFILLMENT_ISSUE est le seul motif qui concerne en partie votre application, et non le client. Il signifie qu'il dit ne pas avoir pu recevoir ou utiliser ce qu'il a payé. Avant de contester par réflexe, sortez vos journaux de livraison. Si votre propre serveur montre que le droit n'a jamais été activé, ou que les crédits n'ont jamais été crédités, le client a raison, et DECLINE est la mauvaise préférence. Se battre contre un véritable échec de livraison gaspille la fenêtre et peut pousser le client vers sa banque, où une rétrofacturation coûte plus cher que ne l'aurait fait le remboursement.

UNSATISFIED_WITH_PURCHASE est là où les preuves décident

C'est le remords ordinaire de l'acheteur, et c'est le motif où vos données de consommation font le plus de travail. Le produit a fonctionné. Le client en a utilisé une partie ou la totalité et veut maintenant récupérer son argent. Un consumptionPercentage élevé, un deliveryStatus honnête de DELIVERED et un refundPreference de DECLINE ou GRANT_PRORATED, c'est le dossier qu'Apple vous demande de présenter. Envoyez les chiffres, pas un argument.

LEGAL et OTHER

LEGAL signifie que le client a invoqué un droit légal ou réglementaire. Les gens raisonnables ne sont pas d'accord, mais en règle générale ce n'est pas la fenêtre pour plaider. Accordez-le et passez à autre chose. OTHER est le fourre-tout qu'Apple utilise lorsque le motif déclaré ne correspond à aucun des quatre ci-dessus. Il ne porte aucun signal en soi, alors traitez un OTHER exactement comme vous traiteriez une demande sans motif du tout : commencez par votre statut de livraison et vos preuves d'usage.

Cinq cartes pliables vierges déployées en éventail sur un bureau sombre à côté d'un téléphone, représentant les cinq valeurs de consumptionRequestReason qu'un client peut envoyer

Comment le motif change votre réponse, champ par champ

Vous répondez à un CONSUMPTION_REQUEST en appelant Send Consumption Information avec un corps ConsumptionRequest. Le motif devrait façonner trois champs de ce corps.

customerConsented doit être true

Apple n'accepte la soumission que lorsque customerConsented est true, ce qui signifie que le client a accepté de partager les données de consommation. Si vous n'avez pas ce consentement, vous ne pouvez envoyer aucune donnée, quel que soit le motif. Pas de consentement, pas de preuves, et la demande est tranchée sans vos chiffres.

deliveryStatus et consumptionPercentage portent les faits

deliveryStatus indique si vous avez livré un achat fonctionnel. S'il vaut autre chose que DELIVERED, Apple exige que consumptionPercentage soit 0. Lorsque vous avez bien livré, consumptionPercentage est un entier en milliunits de 0 à 100,000, où 100,000 signifie que le client a utilisé l'achat entier. Cette paire est votre socle factuel, et c'est elle qui devrait porter un dossier FULFILLMENT_ISSUE ou UNSATISFIED_WITH_PURCHASE, pas le motif lui-même.

refundPreference est votre seul levier

refundPreference est l'endroit où vous déclarez ce que vous voulez. Apple documente trois valeurs : GRANT_FULL, GRANT_PRORATED et DECLINE. Lisez le motif, pesez-le face à vos données, puis choisissez. Un FULFILLMENT_ISSUE avec une livraison en échec dans vos journaux penche vers GRANT_FULL. Un UNSATISFIED_WITH_PURCHASE sur un produit entièrement consommé penche vers DECLINE ou GRANT_PRORATED. LEGAL penche vers GRANT_FULL.

Ce qu'un remboursement vous coûte réellement

Le champ du motif compte parce qu'un remboursement n'est que rarement la seule vente qui sort de votre comptabilité. Pour un consommable déjà écoulé, vous avez payé pour l'honorer. Un pack de crédits qui a appelé une API d'inférence payante, un lot d'images générées qui a brûlé du temps de GPU, un export stocké qui pèse sur votre facture de stockage, un paiement à un créateur que vous avez déjà envoyé : ces coûts restent dépensés lorsque l'achat est annulé. La boutique rend l'argent du client. Elle ne vous rend pas votre calcul.

C'est pourquoi le motif vaut la peine d'être lu. Supposons qu'un client ait acheté 5,000 crédits qui déclenchent chacun un appel d'API payant, en ait dépensé 4,000, puis ait déposé sa demande sous UNSATISFIED_WITH_PURCHASE. Votre deliveryStatus est DELIVERED, votre consumptionPercentage est de 80,000 milliunits, et une préférence DECLINE ou GRANT_PRORATED fait la différence entre encaisser la facture d'API et en récupérer la majeure partie. Inversez maintenant le motif en FULFILLMENT_ISSUE avec des journaux montrant que les crédits n'ont jamais été crédités, et le geste honnête et le moins coûteux est GRANT_FULL avant que le client n'escalade vers sa banque.

Lire le motif sans réagir de façon excessive

Le piège est de traiter le motif comme une preuve. UNINTENDED_PURCHASE n'est pas un aveu que le produit est resté inutilisé, et LEGAL n'est pas toujours une véritable réclamation légale. Le motif resserre la situation. Vos journaux de livraison et vos registres de consommation la résolvent. Lorsqu'ils concordent avec le client, accordez tôt et à moindre coût. Lorsqu'ils contredisent le client, cette contradiction, exprimée sous forme de deliveryStatus et de consumptionPercentage, est la chose la plus forte que vous puissiez envoyer. RefundHalt lit consumptionRequestReason sur chaque CONSUMPTION_REQUEST et l'associe automatiquement à vos données d'usage réelles, afin que chaque motif reçoive la réponse qu'il mérite dans la fenêtre de 12 hours.

Le changement est petit et facile à manquer, mais il a fait pencher la conversation sur le remboursement en votre faveur. Apple vous dit désormais pourquoi, avant que vous ne répondiez. Servez-vous-en.

Questions fréquentes

Qu'est-ce que consumptionRequestReason ?
consumptionRequestReason est un champ de type chaîne qu'Apple inclut dans chaque notification CONSUMPTION_REQUEST, ajouté dans la version 2.11 d'App Store Server Notifications à la WWDC24. Il indique le motif déclaré par le client lui-même pour demander le remboursement, vous donnant un contexte avant que vous ne répondiez avec des données de consommation dans la fenêtre de 12 hours.
Quelles sont les valeurs possibles de consumptionRequestReason ?
Il y en a cinq : UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL et OTHER. Apple en envoie exactement une par demande de remboursement. Chacune pointe vers une situation différente, d'une pression accidentelle à un motif légal déclaré, et chacune devrait façonner le refundPreference et les données de consommation que vous renvoyez.
Le motif du remboursement décide-t-il si je conserve l'argent ?
Non. consumptionRequestReason est un contexte, pas un verdict. Apple décide toujours du remboursement, en pesant votre refundPreference, votre deliveryStatus et consumptionPercentage, ainsi que l'historique du client. Le motif vous dit quel dossier présenter. Ce sont vos données de livraison et d'usage qui le constituent.
Combien de temps ai-je pour répondre à un CONSUMPTION_REQUEST ?
Vous disposez de 12 hours à compter de la réception de la notification CONSUMPTION_REQUEST pour appeler Send Consumption Information. L'appel doit régler customerConsented sur true, sinon Apple le rejette. Manquez la fenêtre et le remboursement est tranché sans aucune de vos données.
consumptionRequestReason apparaît-il pour les remboursements d'abonnements ?
Oui. La même mise à jour de la WWDC24 qui a ajouté consumptionRequestReason a aussi commencé à envoyer CONSUMPTION_REQUEST pour les abonnements à renouvellement automatique, pas seulement pour les consommables. Pour la plupart des applications, cela signifie que le champ du motif atteint désormais les remboursements qui comptent le plus financièrement.

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.