Le ROAS de votre app compte encore les achats qu'Apple et Google ont remboursés, alors enchérissez sur le ROAS net
Les remboursements remontent rarement aux plateformes publicitaires, si bien que le ROAS continue de créditer des achats qu'Apple et Google ont déjà remboursés. Voici où Firebase, Google Ads et AdAttributionKit perdent les remboursements, ce que cela coûte et comment construire le ROAS net d'une app.

Points clés
- L'événement app_store_refund, collecté automatiquement par Firebase, ne se déclenche que lorsque Google Play rembourse un achat intégré. Google l'indique comme réservé à Android, donc les remboursements de l'App Store ne réduisent jamais les revenus in_app_purchase enregistrés par Firebase.
- Google Ads suit automatiquement les achats intégrés Google Play des apps Android et remonte le montant de l'achat comme valeur de conversion. Pour les abonnements, il n'enregistre que le premier achat et le montant du premier paiement.
- Les ajustements de conversion Google Ads permettent de corriger la valeur d'une conversion ou de la rétracter à zéro, et Google précise que les conversions en ligne ne peuvent être ajustées que si un ID de transaction a été envoyé avec elles.
- AdAttributionKit d'Apple prévoit trois fenêtres de conversion après le premier lancement, jours 0 à 2, 3 à 7 et 8 à 35, et la valeur de conversion détaillée n'apparaît que dans le premier postback.
- Le ROAS net correspond aux revenus attribués aux annonces moins les remboursements sur ces achats, divisés par les dépenses publicitaires. Une campagne au ROAS brut plus élevé peut passer derrière en ROAS net si ses acheteurs se font davantage rembourser.
- Les signaux de remboursement arrivent sur le serveur du développeur, pas sur le réseau publicitaire. Apple envoie une App Store Server Notification de type REFUND, et Google Play signale les annulations via les notifications en temps réel pour les développeurs et la Voided Purchases API, qui remonte sur 30 jours.
- Seuls deux circuits de remboursement permettent au développeur de fournir des preuves : le CONSUMPTION_REQUEST d'Apple, auquel il faut répondre sous 12 heures, et l'examen des rétrofacturations de Google Play via orders.reviewrefund, auquel il faut répondre sous 24 heures.
Les tableaux de bord publicitaires enregistrent un achat intégré au moment où il a lieu, et la plupart ne l'annulent jamais. Quand Apple ou Google remboursent ensuite cet achat, l'argent quitte votre versement mais reste dans les revenus de la campagne, et le ROAS continue de créditer l'annonce qui a fait la vente. Le ROAS net, revenus après remboursements divisés par les dépenses publicitaires, est le chiffre qui vous dit quelles campagnes ont vraiment rapporté. Vous devez le construire vous-même, car le signal de remboursement arrive sur votre serveur, pas sur le réseau publicitaire.
Pourquoi le ROAS surestime les revenus quand les remboursements sont ignorés
Le ROAS divise les revenus attribués par les dépenses publicitaires. Les revenus sont généralement enregistrés une seule fois, à l'achat, par un SDK sur l'appareil ou par un import de conversions depuis le store. Un remboursement est un événement ultérieur qui se produit hors de l'appareil, entre le client et Apple ou Google. Si rien ne le rattache à la même campagne, l'achat continue de compter.
Ce serait sans conséquence si les remboursements étaient rares et répartis uniformément. Ils le sont rarement. Une création qui promet plus que ce que l'app offre, une offre montrée à la mauvaise audience ou une source de trafic pleine de cartes volées concentrent les remboursements sur certaines campagnes. Le ROAS brut masque précisément cet écart.
Qu'est-ce que le ROAS net ?
Le ROAS net est le même ratio, avec les remboursements retirés de la ligne du haut : les revenus attribués à une campagne, moins les remboursements sur ces mêmes achats, divisés par le coût de la campagne. Certaines équipes retirent aussi la commission du store et les taxes. Quoi que vous retiriez d'autre, ce sont les remboursements qui changent la campagne gagnante.
Où les remboursements se perdent entre le store et votre tableau de bord publicitaire
Firebase enregistre les remboursements Google Play, pas ceux de l'App Store
La liste des événements collectés automatiquement par Google comprend in_app_purchase, qui se déclenche lorsqu'un utilisateur finalise un achat intégré, y compris un abonnement initial, traité par l'App Store d'Apple ou par Google Play. Son pendant pour les remboursements, app_store_refund, se déclenche lorsqu'un achat intégré est remboursé par Google Play, et Google l'indique comme réservé à Android. Ni app_store_refund ni les événements d'abonnement automatiques ne sont exportés vers BigQuery.
La même page indique qu'Analytics ne mesure pas automatiquement les revenus et les remboursements des apps payantes, et que les revenus affichés peuvent différer de ceux de la Google Play Developer Console. Sur iOS, rien ne déduit automatiquement un remboursement de l'App Store d'un achat déjà enregistré par Firebase.
Google Ads enregistre le montant de l'achat comme valeur de conversion
Pour les apps Android qui utilisent la facturation intégrée, Google Ads peut suivre les achats intégrés des personnes qui ont cliqué sur votre annonce, sans code dans l'app. Google précise que le montant de l'achat est automatiquement remonté comme valeur de conversion. Pour les abonnements, seul le premier achat est enregistré comme conversion, et seul le montant du premier paiement est enregistré. L'article d'aide ne mentionne pas les remboursements.
Google Ads dispose bien d'un outil de correction. Les ajustements de conversion permettent de corriger la valeur d'une conversion sans modifier leur nombre, ou de la rétracter, ce qui ramène sa valeur à 0.00 et alimente les stratégies d'enchères au CPA comme au ROAS. Google précise que les conversions en ligne ne peuvent être ajustées que si vous avez utilisé un ID de transaction, et qu'une conversion rétractée ne peut plus être ajustée. Cette page ne mentionne pas les conversions d'apps, alors vérifiez que votre configuration de conversions accepte les ajustements avant de vous appuyer dessus.
Les postbacks publicitaires d'Apple se ferment avant l'arrivée de nombreux remboursements
AdAttributionKit prévoit trois fenêtres de conversion qui commencent au premier lancement de l'app : jours 0 à 2, jours 3 à 7 et jours 8 à 35. L'app peut mettre à jour sa valeur de conversion jusqu'à la fin de chaque fenêtre. Apple envoie ensuite le postback après un délai aléatoire, de 24 à 48 heures pour le premier et de 24 à 144 heures pour le deuxième et le troisième. Si l'app verrouille une valeur trop tôt, le système ignore les mises à jour suivantes dans cette fenêtre.
La valeur de conversion détaillée n'apparaît que dans le premier postback. Les suivants contiennent au mieux une valeur approximative. Un achat effectué le jour 1 et remboursé par Apple le jour 10 a été déclaré dans un postback qui ne peut plus changer.
| Outil de mesure | Ce qu'il enregistre à l'achat | Ce qui se passe quand l'achat est remboursé |
|---|---|---|
| Firebase in_app_purchase, Android et iOS | ID produit, prix, valeur, devise, quantité | Android : app_store_refund se déclenche. iOS : aucun événement de remboursement automatique |
| Google Ads, conversions Google Play, Android | Le montant de l'achat comme valeur de conversion, premier paiement seulement pour les abonnements | Non décrit. Les ajustements peuvent corriger ou rétracter les conversions en ligne envoyées avec un ID de transaction |
| Postbacks AdAttributionKit, iOS | Une valeur de conversion par fenêtre, détaillée seulement dans le premier | Figée une fois le postback de la fenêtre préparé |
| Votre propre serveur | Chaque transaction, liée à votre ID utilisateur | Notification REFUND d'Apple, signaux d'achats annulés de Google Play |
Quand arrivent les remboursements d'apps, et qui les décide
Les remboursements ne suivent pas un calendrier unique. Certains arrivent quelques heures après l'achat, d'autres des mois plus tard, ce qui explique pourquoi le ROAS d'une cohorte continue de baisser alors que le rapport de campagne semblait définitif.
| Circuit de remboursement | Délai, selon les termes du store | Qui décide | Signal sur votre serveur |
|---|---|---|---|
| Demande de remboursement Google Play | Dans les 48 heures, le client s'adresse à Google. Ensuite, Google le renvoie vers le développeur | Google, puis vous | Achat annulé via RTDN et la Voided Purchases API |
| Remboursement par le développeur sur Google Play | Quand vous le décidez | Vous | Achat annulé, si vous révoquez l'accès |
| Signalement de débit non autorisé sur Google Play | Dans les 120 jours suivant la transaction | Achat annulé | |
| Remboursement Apple | Demandé sur reportaproblem.apple.com, réponse sous 24 à 48 heures | Apple | Notification REFUND avec revocationReason |
| Demande de consommation Apple | Vous répondez sous 12 heures | Apple, à partir de vos données | CONSUMPTION_REQUEST |
| Examen des rétrofacturations Google Play | Vous répondez sous 24 heures via orders.reviewrefund | La banque, après examen de vos preuves | Achat annulé si la rétrofacturation est maintenue |
Ce que coûte un ROAS aveugle aux remboursements
Prenez deux campagnes avec le même budget. Les chiffres ci-dessous sont une illustration, pas une référence du marché.
| Ligne | Campagne A | Campagne B |
|---|---|---|
| Dépenses publicitaires | $10,000 | $10,000 |
| Revenus des achats attribués | $14,000 | $12,500 |
| ROAS brut | 1.40 | 1.25 |
| Part remboursée de ces revenus | 18% | 4% |
| Revenus après remboursements | $11,480 | $12,000 |
| ROAS net | 1.15 | 1.20 |
Le ROAS brut vous dit de basculer le budget vers A. Le ROAS net montre que B a conservé davantage de chaque dollar. Si vos enchères reposent sur la valeur brute, l'algorithme continue de trouver davantage d'acheteurs comme ceux de A, car rien ne lui signale jamais qu'ils ont demandé à être remboursés.
Les dépenses publicitaires ne sont que la première facture. Un client remboursé laisse aussi derrière lui :
- Les commissions. Les accords avec les affiliés, créateurs et influenceurs rémunérés à l'achat paient généralement sur la vente, pas sur la vente moins les remboursements, sauf clause contraire du contrat.
- Le calcul, les appels d'API et le stockage. Un utilisateur remboursé a sollicité vos serveurs, vos API tierces payantes et votre stockage jusqu'à la révocation de son accès. Ces factures-là ne sont pas remboursées.
- Le coût des rétrofacturations. Depuis le 3 août 2026, Google reporte sur le développeur le prix de l'achat contesté ainsi que les frais bancaires, donc une source de trafic Android riche en litiges coûte plus que les revenus qu'elle fait perdre.
- Un ciblage dégradé. Des enchères basées sur la valeur, entraînées sur des achats remboursés, partent à la recherche de profils semblables à ceux qui ont été remboursés.

Un taux de remboursement élevé sur une campagne, fraude ou promesse non tenue ?
Souvent, c'est la promesse. Le revocationReason d'Apple vous indique de quel côté tombe un remboursement. Un 0 signifie que l'App Store a remboursé la transaction pour d'autres raisons, par exemple un achat accidentel. Un 1 signifie qu'il l'a remboursée en raison d'un problème réel ou perçu dans votre app. Une concentration de 1 sur une campagne pointe généralement vers la création publicitaire ou l'onboarding vers lequel elle mène. Une concentration de signalements de débits non autorisés sur Google Play pointe vers la source de trafic.
Comment construire le ROAS net d'une app
Pas besoin d'un nouvel outil pour commencer. Il vous faut quelques jointures que vos données ne font probablement pas encore.
- Rattachez la campagne à l'utilisateur. Stockez le résultat d'attribution à côté de votre propre ID utilisateur dès l'installation, afin que toute transaction ultérieure puisse être reliée à une campagne.
- Rattachez la transaction à l'utilisateur. Définissez un appAccountToken sur les achats iOS et un ID de compte obscurci sur les achats Google Play, afin que chaque événement du store corresponde à votre utilisateur sans approximation.
- Écoutez les remboursements côté serveur. Traitez la notification REFUND d'Apple issue des App Store Server Notifications V2 et les notifications d'achats annulés de Google Play. Interrogez la Voided Purchases API en filet de sécurité, car elle ne renvoie que les annulations des 30 derniers jours.
- Présentez le brut et le net côte à côte, par cohorte d'achat. Imputez chaque remboursement à la campagne et à la date d'achat qui l'ont généré, pas au jour où le remboursement est apparu.
- Envoyez des corrections là où la plateforme les accepte. Si vos conversions Google Ads portent un ID de transaction, corrigez ou rétractez celles qui ont été remboursées. Là où une plateforme n'accepte pas de corrections, déplacez son budget en fonction des chiffres nets.
- Répondez à temps aux deux demandes de preuves. RefundHalt répond au CONSUMPTION_REQUEST d'Apple dans la fenêtre de 12 heures et à l'examen des rétrofacturations de Google Play sous 24 heures, pour que les remboursements contestables reçoivent votre version des faits.
Faut-il compter les remboursements à la date d'achat ou à la date de remboursement ?
Pour les décisions de campagne, à la date d'achat. Un remboursement est un fait qui concerne un achat, et l'achat appartient à une campagne. La finance l'enregistre à la date du remboursement, c'est pourquoi votre rapport de ROAS et votre versement ne concorderont pas un jour donné. Gardez les deux vues et nommez-les clairement.
Quand le ROAS net d'une cohorte est-il définitif ?
Il se stabilise par étapes. La fenêtre de remboursement en libre-service de Google se ferme après 48 heures, Apple annonce aux clients une réponse à leur demande de remboursement sous 24 à 48 heures, et un signalement de débit non autorisé sur Google Play peut intervenir dans les 120 jours suivant la transaction. Considérez les premiers chiffres comme provisoires et revérifiez la même cohorte plus tard.
Questions fréquentes
- Firebase déduit-il les remboursements des revenus des achats intégrés ?
- Uniquement pour Google Play. L'événement app_store_refund, collecté automatiquement par Firebase, se déclenche lorsque Google Play rembourse un achat intégré, et Google l'indique comme réservé à Android. Il n'existe pas d'équivalent automatique pour les remboursements de l'App Store, et Google précise qu'Analytics ne mesure pas automatiquement les revenus et les remboursements des apps payantes.
- Google Ads retire-t-il des conversions les achats intégrés remboursés ?
- L'article de Google sur les conversions Google Play ne l'affirme pas. Il indique que le montant de l'achat est remonté comme valeur de conversion et ne mentionne pas les remboursements. Les ajustements de conversion Google Ads permettent de corriger ou de rétracter une conversion, et Google précise que les conversions en ligne ne peuvent être ajustées que si un ID de transaction a été envoyé avec elles.
- Les postbacks AdAttributionKit peuvent-ils refléter un remboursement ?
- Uniquement si le remboursement intervient avant que le postback de la fenêtre de conversion ne soit préparé. Les fenêtres couvrent les jours 0 à 2, 3 à 7 et 8 à 35 après le premier lancement, et dès qu'une fenêtre se termine ou que la valeur est verrouillée, Apple ignore les mises à jour suivantes dans cette fenêtre.
- Comment calculer le ROAS net d'une app ?
- Prenez les revenus attribués à une campagne, soustrayez les remboursements sur ces mêmes achats et divisez par les dépenses publicitaires de la campagne. Imputez chaque remboursement à la cohorte d'achat qui l'a généré, en vous appuyant sur la notification REFUND d'Apple et sur les signaux d'achats annulés de Google Play comme registre des remboursements.
- Puis-je contester les remboursements qui font baisser mon ROAS ?
- Seulement deux types. Le CONSUMPTION_REQUEST d'Apple vous permet d'envoyer des données de consommation sous 12 heures, et l'examen des rétrofacturations de Google Play via orders.reviewrefund vous laisse 24 heures. Les remboursements Google Play sous 48 heures, les remboursements accordés par le support et les achats annulés sont décidés sans vous, et les rétrofacturations bancaires sont définitives.
Sources et lectures complémentaires
- Firebase Help: [GA4] Automatically collected events
- Google Ads Help: Measure app conversions with Google Play
- Google Ads Help: About conversion adjustments
- Apple Developer Documentation: Receiving postbacks in multiple conversion windows
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: revocationReason
- Google Play Developer API: Voided Purchases API
- Google Play Help: Apps, games, and in-app purchases refund policies
- Google Play Help: Learn about Google Play refund policies
- Apple Support: Request a refund for apps or content that you bought from Apple
RefundHalt
Le pilote automatique des remboursements pour l'App Store et Google Play
Poursuivre la 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.
Les remboursements du paiement web sur iOS vous reviennent à la place d'Apple, tout comme les litiges bancaires
Les apps iPhone aux États-Unis peuvent désormais renvoyer les acheteurs vers un paiement web. Apple dit ne pas pouvoir aider pour les remboursements de ces ventes, donc le service des remboursements, les rétrofacturations et les frais de litige de $15 passent chez vous. Voici ce qui change, ce que cela coûte et comment limiter les litiges.