Tous les articles
Guide pratique7 min de lecture

L'order ID sur le reçu App Store d'un client vous dit ce qu'il a acheté et si Apple l'a déjà remboursé

Le endpoint Look Up Order ID d'Apple transforme l'order ID du reçu App Store d'un client en transactions signées, avec les dates et motifs de remboursement. Comment l'utiliser face aux e-mails de remboursement, ce qu'il ne fait pas, et la comparaison avec l'order ID de Google Play.

Un poste de support avec un ordinateur portable ouvert sur une boîte de réception et un iPhone affichant un reçu d'achat, où l'order ID App Store ouvre la discussion sur un remboursement

Points clés

  • Apple envoie par e-mail un reçu avec un order ID chaque fois qu'un client effectue des achats intégrés, et le client peut aussi retrouver ses order ID dans son historique d'achats de l'App Store.
  • Le endpoint Look Up Order ID de l'App Store Server API d'Apple (GET /inApps/v1/lookup/{orderId}) renvoie une ou plusieurs transactions signées pour un order ID valide, si bien que le support voit le productId et le purchaseDate sans deviner.
  • Une transaction App Store décodée contient revocationDate et revocationReason, donc une recherche par order ID montre si Apple a déjà remboursé l'achat. Le motif 1 signifie qu'Apple l'a remboursé pour un problème réel ou perçu dans l'app.
  • Look Up Order ID renvoie OrderLookupStatus 1 et aucun tableau signedTransactions quand l'order ID n'est pas valide pour votre app, ce qui signale un mauvais reçu ou un achat fait dans une autre app.
  • Look Up Order ID n'est pas disponible dans l'environnement sandbox d'Apple, et sa limite en production est de 10 requêtes par seconde par app, appliquée sur une base horaire.
  • Les développeurs ne peuvent pas émettre de remboursements App Store. Apple les décide sur reportaproblem.apple.com, et la seule étape où le développeur apporte des éléments consiste à répondre à un CONSUMPTION_REQUEST sous 12 heures.
  • Google Play envoie par e-mail un order ID pour chaque achat ponctuel et chaque renouvellement d'abonnement, et le développeur peut rechercher cet order ID dans Play Console et le rembourser directement. Play Console précise qu'un remboursement ne peut pas être annulé.

Avant de répondre à l'e-mail de remboursement d'un client iPhone, demandez-lui l'order ID App Store qui figure sur son reçu Apple. Cette seule chaîne, passée dans le endpoint Look Up Order ID d'Apple, vous dit quel produit il a acheté, quand, et si Apple l'a déjà remboursé. Sans elle, vous comparez une capture d'écran et une adresse e-mail à votre base de données en espérant tomber juste. Avec elle, vous savez en quelques secondes si vous parlez à un client payant, à un client qu'Apple a déjà remboursé, ou à quelqu'un qui tient le reçu d'une autre app.

D'où vient l'order ID App Store

La documentation d'Apple est précise. Quand des clients effectuent un ou plusieurs achats intégrés dans votre app, l'App Store leur envoie un reçu par e-mail, et ce reçu contient un order ID. Les clients peuvent aussi retrouver leurs order ID dans leur historique d'achats de l'App Store. La page d'historique d'Apple se trouve sur reportaproblem.apple.com et dans l'app App Store, sous Apps et historique d'achats, et elle affiche par défaut les 90 derniers jours, avec des filtres pour les achats plus anciens.

Le client a donc déjà la clé. Votre formulaire de support n'a qu'à la lui demander.

Pourquoi une adresse e-mail ne suffit pas

Apple ne vous transmet pas l'e-mail du compte Apple du client. L'adresse qui écrit à votre support peut n'avoir aucun lien avec le compte qui a payé. Si vous définissez un appAccountToken à l'achat, vous pouvez relier une transaction à votre propre identifiant utilisateur, mais seulement de votre côté. L'order ID fonctionne du côté du client, à partir d'un reçu qu'il peut transférer d'un geste.

Ce que renvoie Look Up Order ID

Look Up Order ID fait partie de l'App Store Server API, disponible depuis la version 1.1.0. Vous appelez GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} avec votre JWT signé. Apple indique que la réponse s'appuie sur l'historique des achats intégrés du client, qu'il ait installé, supprimé ou réinstallé l'app.

Champ ou comportementCe que dit la documentation d'AppleCe que le support en fait
OrderLookupStatus 0Order ID valide. La réponse contient un tableau d'une ou plusieurs transactions signéesDécodez chacune et lisez l'achat
OrderLookupStatus 1La réponse ne contient pas de tableau signedTransactionsConsidérez l'order ID comme non valide pour votre app. Demandez le bon reçu
productId et purchaseDateApple les cite comme les champs à utiliser pour le support clientConfirmez ce qui a été acheté et quand
revocationDateLe moment où l'App Store a remboursé la transaction ou l'a retirée du partage familialS'il est présent, Apple a déjà remboursé le client
revocationReason0 : remboursée pour d'autres raisons, comme un achat accidentel. 1 : remboursée pour un problème réel ou perçu dans votre appUn 1 est un signal produit, pas seulement un ticket de support
appAccountTokenL'UUID que vous définissez à l'achat, si vous en définissez unReliez la commande à votre propre fiche utilisateur
price et currencyApple dit de ne pas les utiliser pour le rapprochement des revenusUtilisez les rapports App Store Connect pour l'argent
SandboxLe endpoint n'est pas disponible dans l'environnement sandboxTestez uniquement avec des order ID de production
Limite de requêtes10 requêtes par seconde par app, appliquée sur une base horaire. Au-delà, HTTP 429 avec un en-tête Retry-AfterLargement assez pour un support, pas pour des analyses en masse

Est-ce un reçu valide pour mon app ?

C'est la première question à laquelle répond OrderLookupStatus. Un 1 signifie que l'order ID ne correspond à aucun achat dans votre app. Les cas courants sont une faute de frappe, un reçu d'une autre app, ou un reçu qui ne vient même pas de l'App Store. Ne remboursez, ne créditez et ne restaurez rien sur un 1. Demandez au client de vérifier à nouveau son reçu.

Apple a-t-il déjà remboursé cet achat ?

Vérifiez revocationDate sur chaque transaction décodée. S'il est renseigné, Apple a déjà remboursé cet achat ou l'a retiré du partage familial, et le client a récupéré son argent. Vos App Store Server Notifications auraient dû envoyer un REFUND pour la même transaction, c'est donc aussi un moyen peu coûteux de confirmer que votre serveur a bien révoqué l'accès.

Un développeur compare un reçu App Store imprimé avec des lignes de transactions sur un ordinateur portable, en vérifiant un order ID App Store avant de répondre à une demande de remboursement

Ce que l'order ID ne peut pas faire sur l'App Store

Il ne peut pas déclencher de remboursement. Les développeurs n'ont aucun bouton de remboursement sur l'App Store. Apple décide des remboursements, et son article d'assistance renvoie les clients vers reportaproblem.apple.com, où ils choisissent « I'd like to », puis « Request a refund », indiquent un motif et sélectionnent l'article. Apple précise aussi qu'un débit en attente ne peut pas être remboursé tant que le client n'a pas reçu le reçu par e-mail.

Le seul moment où vous avez votre mot à dire, c'est le CONSUMPTION_REQUEST d'Apple. Quand un client demande un remboursement à Apple, Apple peut envoyer cette notification, et vous avez 12 heures pour répondre avec Send Consumption Information. La recherche par order ID est un outil de support. Elle n'ouvre pas cette fenêtre et ne la prolonge pas.

Ce que coûte un e-mail de remboursement quand on saute la recherche

Le support sans order ID, c'est là que l'argent fuit sans bruit. Trois schémas reviennent sans cesse.

  • Un geste commercial en plus d'un remboursement. Apple rembourse l'achat, le client vous écrit aussi, et le support accorde des crédits gratuits ou un mois de plus. Chaque crédit offert tourne sur du calcul, des appels d'API et du stockage que vous payez, pour un compte déjà remboursé.
  • Un accès jamais révoqué. Si votre traitement des REFUND a échoué, le client remboursé continue de consommer. Une recherche qui affiche un revocationDate alors que votre base indique encore actif, c'est un rapport de bug avec un prix.
  • Mauvais compte, mauvaise correction. Restaurer ou créditer le compte derrière un e-mail transféré, alors que l'order ID appartient à quelqu'un d'autre, offre un service payant à une personne qui ne l'a jamais acheté.

Aucun de ces cas n'a besoin d'un litige ou d'un délai pour coûter cher. Ce sont simplement des réponses de support données sans les faits. Un appel d'API par ticket supprime les suppositions.

revocationReason 1 veut-il dire que j'ai fait une erreur ?

Pas forcément. Apple indique que le motif 1 signifie qu'il a remboursé l'achat pour un problème réel ou perçu dans votre app. Le mot perçu pèse lourd ici. Mais une série de remboursements au motif 1 sur un même produit, après une même version, c'est le retour produit le plus clair qu'Apple vous donne. Comptez-les.

Comment se compare l'order ID de Google Play

Google Play fonctionne dans l'autre sens. La documentation de facturation de Google indique que les utilisateurs reçoivent un e-mail avec un order ID unique pour chaque achat de produit ponctuel, pour l'achat initial d'un abonnement et pour chaque renouvellement, et que vous pouvez utiliser l'order ID pour gérer les remboursements dans Play Console. Vous cherchez dans la gestion des commandes par order ID ou par l'adresse e-mail complète de l'utilisateur, puis vous remboursez vous-même.

QuestionOrder ID App StoreOrder ID Google Play
Où le client le trouveReçu par e-mail et historique d'achats de l'App StoreReçu par e-mail pour chaque achat et chaque renouvellement
Comment vous le recherchezLook Up Order ID dans l'App Store Server APIRecherche dans la gestion des commandes de Play Console
Pouvez-vous rembourser avecNon. Apple décideOui. Remboursements complets, et partiels sur les achats intégrés et les abonnements
Fenêtre de preuve pour le remboursementCONSUMPTION_REQUEST, 12 heures, Apple décideExamen de rétrofacturation via orders.reviewrefund, 24 heures
Un remboursement peut-il être annuléPas par vousNon. Play Console précise qu'un remboursement ne peut pas être annulé

Sur Google Play, l'order ID compte davantage parce que c'est vous qui appuyez sur le bouton. Play Console indique que rembourser la commande d'abonnement la plus récente supprime immédiatement l'abonnement et annule les renouvellements futurs, tandis que rembourser une commande plus ancienne est un simple remboursement qui laisse l'abonnement actif. Les remboursements partiels ne sont possibles que pour les commandes passées après mars 2018, et vous ne pouvez pas rembourser partiellement une app payante.

Placez l'order ID en tête de votre parcours de support aux remboursements

  • Demandez l'order ID dans votre formulaire de support, avec une indication d'une ligne : il figure dans l'e-mail de reçu d'Apple ou de Google Play.
  • Sur iOS, appelez Look Up Order ID, décodez chaque transaction et montrez au support le productId, le purchaseDate, le revocationDate et le revocationReason sur un seul écran.
  • Si OrderLookupStatus vaut 1, arrêtez-vous et demandez le bon reçu. N'accordez rien.
  • Si revocationDate est renseigné, vérifiez que l'accès est déjà révoqué sur votre serveur, puis clôturez le ticket. Pas de geste commercial en plus.
  • S'il ne l'est pas et que le client veut être remboursé, renvoyez-le vers reportaproblem.apple.com et gardez votre traitement du CONSUMPTION_REQUEST prêt pour la fenêtre de 12 heures. RefundHalt répond à cette demande avec les données de consommation qu'Apple réclame.
  • Sur Android, trouvez la commande exacte dans Play Console avant de rembourser, et choisissez délibérément entre remboursement seul et remboursement avec révocation.

Questions fréquentes

Comment rechercher un order ID App Store en tant que développeur ?
Appelez le endpoint Look Up Order ID de l'App Store Server API, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, avec votre JWT signé. Un order ID valide renvoie OrderLookupStatus 0 et une ou plusieurs transactions signées, que vous décodez pour lire le productId, le purchaseDate et les éventuels détails de remboursement. Le endpoint n'est pas disponible en sandbox.
Où un client trouve-t-il son order ID App Store ?
Dans le reçu qu'Apple lui envoie par e-mail à chaque achat intégré, et dans son historique d'achats de l'App Store, sur reportaproblem.apple.com ou sous Apps et historique d'achats dans l'app App Store. L'historique affiche par défaut les 90 derniers jours, avec des filtres pour les achats plus anciens.
Puis-je rembourser un achat App Store avec l'order ID ?
Non. Les développeurs ne peuvent pas émettre de remboursements App Store. Apple les décide quand le client en demande un sur reportaproblem.apple.com. Votre contribution consiste à répondre au CONSUMPTION_REQUEST d'Apple sous 12 heures avec Send Consumption Information.
Comment savoir si Apple a déjà remboursé un achat ?
Recherchez l'order ID et vérifiez revocationDate dans chaque transaction décodée. S'il est renseigné, Apple a remboursé l'achat ou l'a retiré du partage familial. revocationReason 0 signifie d'autres raisons, comme un achat accidentel, et 1 signifie un problème réel ou perçu dans votre app.
Que signifie OrderLookupStatus 1 ?
Cela signifie que l'order ID n'est pas valide pour votre app, et la réponse ne contient pas de tableau signedTransactions. En général, le client a envoyé le reçu d'une autre app, a mal saisi l'identifiant ou a envoyé un reçu qui ne vient pas de l'App Store. Demandez le bon reçu avant d'accorder quoi que ce soit.

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.