Manquer des notifications de remboursement peut vous coûter les seuls remboursements que vous pouvez contester, et les deux stores vous laissent les récupérer si vous regardez à temps
Quand votre serveur manque une notification de remboursement, les deux procédures qui demandent vos preuves se ferment sans vous. Voici comment Apple et Google Play relancent l'envoi, jusqu'à quand vous pouvez récupérer les notifications de remboursement manquées, et où se trouvent les angles morts.

Points clés
- Apple relance cinq fois un envoi échoué des App Store Server Notifications V2, 1, 12, 24, 48 et 72 heures après la tentative précédente, si bien que la deuxième relance arrive environ 13 heures après le premier essai.
- Apple demande aux développeurs de répondre à un CONSUMPTION_REQUEST dans les 12 heures suivant sa réception. Un serveur qui manque le premier envoi et la relance d'une heure risque donc de ne voir la demande qu'une fois ce délai probablement écoulé.
- Le endpoint Get Notification History d'Apple renvoie les notifications V2 des 180 derniers jours en production, 20 enregistrements par page, et son option onlyFailures limite les résultats aux notifications jamais arrivées sur votre serveur, plus celles encore en cours de relance.
- Google Play ne transmet les examens de rétrofacturation que par une PendingRefundReviewNotification, et le pendingRefundToken nécessaire pour appeler orders.reviewrefund sous 24 heures arrive dans cette notification. Google ne documente aucune API distincte qui liste les examens en attente.
- Google Cloud Pub/Sub conserve les messages non acquittés 7 jours par défaut, 31 jours au maximum, et supprime un abonnement après 31 jours sans activité d'abonné, sauf si vous modifiez sa période d'expiration.
- La Voided Purchases API de Google Play récupère les remboursements, révocations et rétrofacturations des 30 derniers jours, avec un quota de 6 000 requêtes par jour et 30 requêtes sur toute période de 30 secondes, mais elle ne peut pas récupérer un examen de rétrofacturation auquel vous n'avez jamais répondu.
- Le sandbox d'Apple envoie chaque notification une seule fois, sans relance. Une procédure de récupération qui n'a tourné qu'en sandbox n'a donc jamais été testée face au vrai calendrier de relances d'Apple.
Manquer des notifications de remboursement, c'est la façon discrète dont un développeur perd les deux seules décisions de remboursement où il a voix au chapitre. Le CONSUMPTION_REQUEST d'Apple et l'examen de rétrofacturation de Google Play commencent tous deux par une notification, et tous deux se ferment sur un délai court : 12 heures chez Apple, 24 heures chez Google. Si votre serveur est en panne, lent ou mal configuré quand ce message arrive, le store ne vous attend pas. Il décide avec ce qu'il a déjà.
La bonne nouvelle, c'est qu'aucun des deux stores ne jette le message au premier échec. Apple relance et garde un historique de 180 jours que vous pouvez interroger. Google publie via Pub/Sub, qui conserve les messages non acquittés pendant des jours. La mauvaise nouvelle, c'est que le rythme des relances ne colle pas aux délais de réponse, et que l'une des deux procédures n'a aucune API de récupération.
Comment chaque store envoie les notifications de remboursement
Apple envoie les App Store Server Notifications directement à une URL HTTPS que vous définissez dans App Store Connect. Google n'appelle pas votre serveur directement. Il publie les notifications en temps réel pour les développeurs (Real-time developer notifications) sur un sujet Google Cloud Pub/Sub, et votre abonnement à ce sujet les pousse vers votre endpoint ou attend que votre serveur vienne les récupérer.
| Question | App Store | Google Play |
|---|---|---|
| Canal de livraison | HTTPS POST vers votre URL | Sujet Cloud Pub/Sub, push ou pull |
| Ce qui compte comme un succès | HTTP 200 à 206 | Acquitter le message Pub/Sub, ou un code de succès sur un endpoint push |
| Relances | 5 en V2, 1, 12, 24, 48 et 72 heures après la tentative précédente | Pub/Sub renvoie jusqu'à l'acquittement ou la fin de la période de conservation |
| Durée de vie d'un message manqué | 180 jours dans Get Notification History | 7 jours par défaut dans l'abonnement, jusqu'à 31 jours |
| Remboursement qui demande vos preuves | CONSUMPTION_REQUEST, réponse sous 12 heures | PendingRefundReviewNotification, réponse sous 24 heures |
| Filet de secours en pull pour les remboursements accordés | Get Notification History, Get Refund History | Voided Purchases API, 30 derniers jours |
| Comportement en sandbox ou en test | Une tentative, sans relance | Send Test Message depuis Play Console |
Ce qu'Apple considère comme un échec
La documentation d'Apple est précise. Renvoyez un statut entre 200 et 206 et la livraison est terminée. Renvoyez un 40x ou un 50x et Apple relance. Apple considère aussi tout autre code comme un échec. Chaque tentative est consignée avec un sendAttemptResult, et les valeurs ressemblent à une liste de vraies pannes : TIMED_OUT, TLS_ISSUE, CIRCULAR_REDIRECT, NO_RESPONSE, PREMATURE_CLOSE, UNSUCCESSFUL_HTTP_RESPONSE_CODE et quelques autres. Pour TIMED_OUT, Apple conseille elle-même de vérifier que votre serveur ne traite pas les messages de façon synchrone.
Ce que Google considère comme un échec
Sur un abonnement push, un code de réponse de succès de votre endpoint vaut acquittement. Sur un abonnement pull, votre serveur doit acquitter chaque message qu'il récupère, sinon Pub/Sub le renvoie. Le délai d'acquittement par défaut est de 10 secondes et le maximum de 600 secondes. Le guide RTDN de Google ajoute une règle qui mérite d'être rappelée : une notification indique seulement que quelque chose a changé, vous devez donc toujours appeler la Google Play Developer API pour obtenir l'état complet de l'achat.
Pourquoi le calendrier de relances d'Apple ne tient pas dans le délai de 12 heures
Les intervalles de relance d'Apple se comptent depuis la tentative précédente, pas depuis la première. Additionnez-les et vous obtenez cette chronologie pour une seule notification V2 que votre serveur continue de manquer.
| Tentative | Attente après la tentative précédente | Heures depuis la première tentative |
|---|---|---|
| Premier envoi | Aucune | 0 |
| Relance 1 | 1 heure | 1 |
| Relance 2 | 12 heures | 13 |
| Relance 3 | 24 heures | 37 |
| Relance 4 | 48 heures | 85 |
| Relance 5 | 72 heures | 157 |
Apple vous demande de répondre dans les 12 heures suivant la réception du CONSUMPTION_REQUEST. Si votre serveur est en panne lors du premier envoi et de la relance une heure plus tard, la tentative suivante arrive 13 heures après la première. Apple ne précise pas si une demande reçue pour la première fois lors d'une relance ouvre un nouveau délai de 12 heures. La lecture prudente consiste à faire partir le délai de la première tentative, ce qui veut dire que les relances seules ne sauveront pas une demande manquée de plus d'une heure.
Apple relance-t-elle après un HTTP 400 ?
Oui, d'après la documentation. Apple cite les 40x et 50x comme codes qui déclenchent une relance. En mars 2026, un développeur a signalé sur les forums d'Apple que les relances après des réponses 400 semblaient s'arrêter, puis a indiqué que les livraisons avaient repris un ou deux jours plus tard, et Apple a demandé un rapport via Feedback Assistant. Prenez le comportement documenté comme règle et votre propre supervision comme preuve.
Récupérer les notifications App Store manquées avec Get Notification History
Get Notification History renvoie les notifications de version 2 qu'Apple a tenté d'envoyer à votre serveur sur la période que vous choisissez. Chaque enregistrement contient le payload signé complet, que vous pouvez donc passer au même handler qu'une notification en direct. Chaque enregistrement inclut aussi un tableau sendAttempts de six entrées au plus, une pour le premier essai et une pour chacune des cinq relances.
- startDate et endDate sont obligatoires, et startDate doit tomber dans les 180 derniers jours en production ou les 30 derniers jours en sandbox.
- Passez onlyFailures à true pour n'obtenir que les notifications qui n'ont pas atteint votre serveur, plus celles qu'Apple relance encore.
- Filtrez par un notificationType, comme CONSUMPTION_REQUEST ou REFUND, ou par un transactionId pour un seul client, mais pas les deux dans la même requête.
- Chaque appel renvoie 20 enregistrements au plus. Continuez à appeler avec le paginationToken tant que hasMore vaut true, et envoyez chaque fois le même corps de requête.
Une réserve compte pour les remboursements. Apple indique que les enregistrements de l'historique reflètent l'état d'un achat au moment du premier envoi de la notification, pas l'état actuel. Un REFUND récupéré est donc un fait passé. Avant de révoquer l'accès, vérifiez l'état actuel avec les endpoints de transaction ou de statut d'abonnement.
Les notifications V1 ne se récupèrent pas ainsi
Get Notification History ne couvre que la version 2. Apple relance les notifications V1 trois fois, 6, 24 et 48 heures après la tentative précédente, et si toutes échouent, il n'y a aucun historique à rejouer. Raison de plus pour passer en V2 toute app encore en V1.
Récupérer les notifications de remboursement Google Play manquées
Le filet de sécurité de Google, c'est Pub/Sub lui-même. Tant que votre abonnement existe, un message que personne n'a acquitté y reste pendant la période de conservation, 7 jours par défaut et jusqu'à 31 jours si vous l'allongez. Quand votre endpoint revient, la livraison reprend. Deux réglages peuvent discrètement annuler cette protection.
- Un sujet de lettres mortes (dead-letter) retire un message de votre abonnement après un nombre défini de tentatives de livraison échouées. La valeur par défaut est 5, et avec la politique de relance par défaut, qui renvoie immédiatement, cinq tentatives peuvent passer vite. Si vous en utilisez un, surveillez-le comme une seconde boîte de réception.
- Un abonnement sans activité d'abonné, comme des connexions ouvertes, des pulls actifs ou des pushs réussis, expire après 31 jours par défaut. Un endpoint qui reste cassé pendant un mois peut perdre l'abonnement lui-même, avec tout ce qui y attendait.
Les remboursements annulés ont un filet de 30 jours
Pour les remboursements déjà effectués, la Voided Purchases API est le filet de secours en pull. Elle liste les achats annulés des 30 derniers jours, jusqu'à 1 000 par page, avec un quota de 6 000 requêtes par jour et 30 requêtes sur toute période de 30 secondes pour chaque app. Passez type 1 pour inclure les abonnements en plus des produits à achat unique. L'exécuter chaque jour rattrape tout remboursement perdu par votre chaîne de notifications, ce qui garde justes les droits d'accès et les chiffres de revenus.
Les examens de rétrofacturation n'en ont pas
Une PendingRefundReviewNotification est différente. Elle porte le pendingRefundToken que vous devez transmettre à orders.reviewrefund, et vous avez 24 heures à partir de sa réception pour envoyer votre préférence de remboursement et vos preuves d'utilisation. Google enregistre votre premier appel et ignore les suivants. La documentation de Google ne décrit aucun endpoint qui liste les examens en attente : si ce message Pub/Sub se perd, vos preuves pour cette rétrofacturation se perdent avec lui.
Ce que coûte une notification de remboursement manquée
Une notification manquée pour un remboursement déjà définitif vous coûte de la comptabilité. Vous la retrouvez plus tard dans la Voided Purchases API ou Get Notification History, vous révoquez l'accès si votre politique le prévoit, et vos rapports se remettent à jour. Agaçant, mais peu coûteux.
Une notification manquée dans l'une des deux procédures contestables coûte de l'argent réel, parce que le store décide sans vos preuves. Chez Apple, la décision de remboursement est alors prise sans vos données de consommation. Sur Google Play, pour les commandes passées après le 3 août 2026, une rétrofacturation perdue vous coûte le prix d'achat moins les frais de service de Play, plus les frais de rétrofacturation facturés par la banque de l'acheteur. Google ne prend en charge que ses propres frais de service.
Et l'argent dépensé pour livrer l'achat était déjà parti avant le début du litige.
- Calcul : temps de GPU et de serveur derrière chaque génération, rendu ou réponse de modèle que l'acheteur a déjà utilisé.
- Appels d'API : requêtes vers des tiers facturées dès leur envoi, souvent à l'appel.
- Stockage : fichiers et médias créés par l'acheteur, toujours sur votre facture d'hébergement.
- Reversements : parts de revenus déjà versées à des créateurs, affiliés ou partenaires sur cette vente.
Rien de tout cela ne revient quand un remboursement passe. Les preuves que vous envoyez pendant ces 12 ou 24 heures sont votre seul levier, et une notification manquée vous le retire.
Une procédure de récupération qui tient la route
- Acquittez d'abord. Stockez le payload brut, renvoyez un code de succès, puis traitez-le dans une file d'attente.
- Interrogez Get Notification History d'Apple avec onlyFailures toutes les quelques minutes pour CONSUMPTION_REQUEST, afin qu'une panne ne coûte que quelques minutes du délai de 12 heures.
- Lancez chaque jour un balayage de Get Notification History avec onlyFailures sur les derniers jours pour tous les types, et rejouez ce que vous trouvez.
- Lancez chaque jour un appel à la Voided Purchases API avec type 1 pour chaque app Google Play, et rapprochez le résultat des remboursements déjà enregistrés.
- Sur Pub/Sub, gardez une conservation des messages de 7 jours ou plus, configurez une alerte sur le sujet de lettres mortes si vous en avez un, et une alerte quand les messages non livrés s'accumulent.
- Testez aussi tout le parcours en production. Le sandbox d'Apple envoie chaque notification une seule fois, sans relance, et Request a Test Notification avec Get Test Notification Status montrent exactement comment votre serveur a répondu.

RefundHalt reçoit pour vous les notifications des deux stores et répond automatiquement aux CONSUMPTION_REQUEST et aux examens de rétrofacturation dans les délais, pour que ce ne soit pas à vous de surveiller l'horloge.
Questions fréquentes
- Pendant combien de temps Apple relance-t-elle une notification serveur App Store en échec ?
- Environ six jours et demi en version 2. Apple relance cinq fois, 1, 12, 24, 48 et 72 heures après la tentative précédente, si bien que la dernière relance arrive 157 heures après le premier envoi. Les notifications de version 1 ont droit à trois relances, 6, 24 et 48 heures après la tentative précédente.
- Jusqu'à quand puis-je récupérer des notifications serveur App Store manquées ?
- 180 jours en production. Le endpoint Get Notification History d'Apple renvoie les notifications de version 2 des 180 derniers jours, ou des 30 derniers jours en sandbox, 20 enregistrements par appel, et l'option onlyFailures limite les résultats aux notifications jamais arrivées sur votre serveur.
- Apple relance-t-elle une notification si mon serveur renvoie HTTP 400 ?
- Oui, d'après la documentation d'Apple. Apple relance quand votre serveur renvoie un statut 40x ou 50x, et considère 200 à 206 comme un succès. Tout autre statut compte aussi comme un échec.
- Puis-je récupérer un examen de rétrofacturation Google Play manqué ?
- Seulement tant que le message Pub/Sub existe encore. Le pendingRefundToken nécessaire pour orders.reviewrefund arrive dans la PendingRefundReviewNotification, et Google ne documente aucune API qui liste les examens en attente. Les messages non acquittés de l'abonnement, conservés 7 jours par défaut, sont donc votre seule copie.
- Comment retrouver les remboursements Google Play que mon serveur a manqués ?
- Appelez la Voided Purchases API. Elle renvoie les achats annulés des 30 derniers jours, y compris les remboursements, révocations et rétrofacturations, avec jusqu'à 1 000 résultats par page et un quota de 6 000 requêtes par jour et par app. Passez type 1 pour inclure les abonnements.
Sources et lectures complémentaires
- Apple Developer: Responding to App Store Server Notifications
- Apple Developer: Get Notification History
- Apple Developer: NotificationHistoryRequest
- Apple Developer: Send Consumption Information
- Android Developers: Real-time developer notifications reference
- Android Developers: Help Google dispute chargebacks
- Google Play Developer API: Voided Purchases API
- Google Cloud: Pub/Sub subscription properties
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Le pilote automatique des remboursements pour l'App Store et Google Play
Poursuivre la lecture
Des demandes de remboursement excessives peuvent vous coûter plus cher que les remboursements eux-mêmes, car les deux stores y voient un signal de qualité
La règle 5.6.4 d'Apple cite les demandes de remboursement excessives comme le signe qu'une app ne respecte pas les normes de qualité, et le contrat de distribution de Google l'autorise à retirer les apps des nouveaux développeurs en fonction de leur taux de remboursement. Voici ce que dit chaque store, ce que coûte un retrait et comment l'éviter.
Vérifiez les notifications serveur de l'App Store avant d'agir sur un remboursement, car n'importe qui peut envoyer des requêtes à votre URL de webhook
Une notification de remboursement n'est qu'une requête HTTPS tant que vous n'avez pas vérifié sa signature. Voici comment vérifier les notifications serveur de l'App Store et les messages RTDN de Google Play, ce que signe chaque store et ce que vous coûte un remboursement falsifié ou rejeté à tort.