Alle artikelen
Deep dive9 min leestijd

Lees de redencode van de terugbetaling die je server al ontvangt, en hij vertelt je of je je app moet repareren of de klant moet aanvechten

Elke terugbetaling die Apple en Google naar je server sturen draagt een redencode. Google Play stempelt op elke void een van negen redenen en een bron, Apple markeert of de terugbetaling je app de schuld geeft. Dit is wat elke code betekent, hoe je ze sorteert in repareren, aanvechten of accepteren, en wat ze waard zijn in geld.

Een met een stempel afgedrukt codeteken op een papieren label naast een vergrootglas, als beeld voor de redencode van de terugbetaling die je server bij elke terugbetaling ontvangt

Belangrijkste inzichten

  • Elke terugbetaling die Apple of Google naar je server stuurt draagt een redencode, en het is het ene deel van een terugbetaling dat je kunt lezen nadat het geld al is verplaatst. Hij vertelt je waarom de terugbetaling plaatsvond, wat je vertelt wat je hierna moet doen.
  • De Voided Purchases API van Google Play stempelt twee getallen op elke void: een voidedReason van 0 tot 8 (other, remorse, not received, defective, accidental purchase, fraud, friendly fraud, chargeback, unacknowledged purchase) en een voidedSource van 0 gebruiker, 1 ontwikkelaar of 2 Google.
  • Apple geeft je een smaller maar scherp signaal. Op een terugbetaalde transactie is revocationReason 1 wanneer de App Store terugbetaalde vanwege een werkelijk of vermeend probleem binnen je app, en 0 wanneer hij terugbetaalde om een andere reden zoals een onbedoelde aankoop.
  • De codes vallen uiteen in drie stapels. Defective, not received, unacknowledged en Apple's probleem-in-app-code wijzen naar je product, dus die repareer je. Fraud, friendly fraud en chargeback zijn geschillen die je aanvecht of voorkomt. Remorse en onbedoelde aankoop waren nooit aan jou om tegen te houden.
  • voidedReason 8, unacknowledged purchase, is een terugbetaling die je jezelf hebt gefactureerd. Google betaalt automatisch terug en trekt elke aankoop in die je app niet binnen drie dagen bevestigt, en deze code is hoe je die bug in je eigen integratie vindt.
  • voidedReason 7, chargeback, is de dure. Voor Google Play-bestellingen geplaatst op of na 3 augustus 2026 kost een verloren chargeback de ontwikkelaar de aankoopprijs minus de servicekosten van Play plus de chargeback-kosten van de bank, dus het tellen van je als chargeback gecodeerde voids is het tellen van echte extra kosten.
  • De Voided Purchases API kijkt maar 30 dagen terug, en hij filtert op wanneer Google de void ziet, niet wanneer de aankoop plaatsvond, dus een redencode die je niet binnen dat venster vastlegt is een redencode die je voorgoed verliest.

Wanneer Apple of Google een van je klanten terugbetaalt, is het geld meestal weg voordat je een stem hebt. Wat daarna op je server landt ziet eruit als een bon, en de meeste teams behandelen het zo. Het is meer dan dat. Elke terugbetaling draagt een redencode, en het is het enige deel van een terugbetaling dat je nog mag lezen nadat de beslissing is genomen. Google Play vertelt je dat de terugbetaling een chargeback was, of een remorse-verzoek, of een aankoop die je eigen app nooit bevestigde. Apple vertelt je of de terugbetaling iets binnen je app de schuld gaf. Lees die code en een terugbetaling houdt op een regel in een rapport te zijn en wordt een instructie: repareer dit, vecht dit aan, of laat deze gaan. Dit is wat elke code betekent, hoe je ze triageert en wat elke kost.

Wat een redencode van een terugbetaling eigenlijk is

Een redencode is het eigen label van de store voor waarom een aankoop is teruggedraaid. Je stelt hem niet in en je kunt er niet mee in discussie. Hij komt achteraf aan een terugbetaling gehecht, en de twee stores tonen hem in verschillende vormen en met een heel verschillende resolutie.

Google Play stempelt een reden en een bron op elke void

De Voided Purchases API van Google Play geeft één record per teruggedraaide aankoop terug, en elk record draagt twee gehele getallen die ertoe doen. De voidedReason zegt waarom de aankoop is teruggedraaid. De voidedSource zegt wie het in gang zette. Samen maken ze van een kale terugbetaling een zin: deze bestelling is teruggedraaid vanwege een chargeback, geïnitieerd door Google, of teruggedraaid als remorse, geïnitieerd door de gebruiker. Je leest ze door de API te pollen of door je te abonneren op de realtime ontwikkelaarsmelding die afgaat wanneer een void landt. Hoe dan ook, de twee getallen zijn de payload die het bewaren waard is.

Apple geeft je een smaller signaal, maar een scherp

Apple overhandigt je geen reden met negen richtingen. Op een terugbetaalde transactie zet Apple revocationReason op een van twee waarden. Een 1 betekent dat de App Store de transactie terugbetaalde vanwege een werkelijk of vermeend probleem binnen je app. Een 0 betekent dat hij terugbetaalde om een andere reden, bijvoorbeeld een onbedoelde aankoop. Het veld verschijnt alleen op transacties die zijn terugbetaald of ingetrokken, naast een revocationDate, binnen de signed transaction info van de REFUND App Store Server Notification. Twee waarden is niet veel, maar degene die ertoe doet, een 1, is Apple dat je vertelt dat de terugbetaling over je product ging, niet over de twijfel van de klant.

De negen redenen die Google Play je geeft

De voidedReason van Google is de rijkste van de twee, en elke waarde is het waard om op het eerste gezicht te kennen omdat elke ergens anders naar wijst. Hier is de volledige set, rechtstreeks uit de VoidedPurchase-resource, met wat elke code je eigenlijk opdraagt te doen.

voidedReasonLabel van GoogleWat de code je vertelt
0OverigGeen specifieke reden vastgelegd. Stop het in een emmer en volg het volume, niet het losse geval.
1Remorse (van gedachten veranderd)De klant veranderde van gedachten. Er was niets mis met je app.
2Niet ontvangenDe klant zegt nooit gekregen te hebben waarvoor hij betaalde. Een bezorgprobleem om te controleren.
3DefectDe aankoop werkte niet. Een productbug, en de meest actiegerichte code op deze lijst.
4Onbedoelde aankoopEen misklik of een ongewilde aankoop. Overweeg een duidelijkere bevestigingsstap.
5FraudeGoogle markeerde de transactie als frauduleus. Niet je klant, en geen omzet om te houden.
6Friendly fraudDe koper betwistte een afschrijving die hij deed en ontving. Bewijs kan deze nog raken.
7ChargebackDe bank draaide de afschrijving terug. Het duurste pad, nu met een kostenpost erbij.
8Niet-bevestigde aankoopJe app bevestigde de aankoop nooit, dus Google betaalde automatisch terug. Een bug in je code.

voidedSource vertelt je wie de trekker overhaalde

Naast de reden zit voidedSource, en het beantwoordt een andere vraag: wie draaide dit terug. Een 0 betekent dat de gebruiker het deed, via zelfbediening of een bank. Een 1 betekent dat de ontwikkelaar het deed, dat ben jij of je eigen tooling die een terugbetaling uitgeeft. Een 2 betekent dat Google het deed, naar eigen oordeel, inclusief de automatische terugbetaling voor een niet-bevestigde aankoop. Wanneer je een piek in voids ziet, is de bron de eerste snede. Een muur van source 2 is Google dat op je account handelt, en dat is meestal een signaal dat terugwijst naar je integratie in plaats van naar je klanten.

Sorteer elke terugbetaling in repareren, aanvechten of accepteren

De reden dat een code nuttig is, is dat hij je vertelt welke van drie reacties een terugbetaling verdient. De meeste teams behandelen alle terugbetalingen hetzelfde en verspillen moeite aan degene die ze nooit kunnen winnen. De codes splitsen netjes.

Repareren: de terugbetalingen die je product veroorzaakte

Sommige codes zijn bugrapporten in de kleren van een terugbetaling. Defect (3) en niet ontvangen (2) bij Google, en een revocationReason van 1 bij Apple, zeggen allemaal hetzelfde: de klant betaalde en je app leverde niet. Niet-bevestigde aankoop (8) is de scherpste hiervan omdat de fout volledig in je facturatiecode zit. Dit zijn de goedkoopste terugbetalingen om te elimineren, omdat je ze elimineert door iets te repareren dat van jou is, niet door iemand te overtuigen. Een stijgend aantal in deze stapel is een productdefect met een bedrag in dollars eraan vast.

Aanvechten: de terugbetalingen die iemand bewerkt

Fraude (5), friendly fraud (6) en chargeback (7) zijn de geschillen. Pure fraude (5) is niet je klant en geen omzet die je ooit zou houden. Friendly fraud (6), waarbij de koper precies kreeg waarvoor hij betaalde en het toen betwistte, is het ene geschil dat je bewijs nog kan bewegen, en chargeback (7) is waar dat bewijs wordt ingediend. Wanneer een van deze landt trek je de toegang in als je dat nog niet deed, en waar een beoordelingsvenster open staat beantwoord je het met wat je over het account weet.

Accepteren: de terugbetalingen die nooit aan jou waren om tegen te houden

Remorse (1) en onbedoelde aankoop (4) zijn de eigen gedachtenwisseling van de klant. Apple's revocationReason van 0 hoort hier ook. Geen functie faalde en geen fraude vond plaats. Je kunt de emmer met onbedoelde aankopen verzachten met een duidelijkere aankoopbevestiging, maar je kunt een remorse-terugbetaling niet wegredeneren, en tijd besteed aan proberen is tijd weggenomen van de repareerstapel waar het geld werkelijk zit.

EmmerGoogle-codesApple-signaalJouw zet
Repareren2 niet ontvangen, 3 defect, 8 niet-bevestigdrevocationReason 1Zoek de grondoorzaak van de product- of facturatiebug erachter
Aanvechten5 fraude, 6 friendly fraud, 7 chargeback(verschijnt via REFUND, niet via de reden)Trek toegang in, beantwoord het beoordelingsvenster met bewijs
Accepteren1 remorse, 4 onbedoelde aankooprevocationReason 0Log het, verfijn de aankoopflow, ga verder
Drie gelabelde sorteerbakken op een werkbank vangen gesorteerde metalen fiches op, één bak feller verlicht, als beeld voor het triageren van terugbetalingen per redencode in repareren, aanvechten en accepteren

De valkuil van 30 dagen waardoor redencodes makkelijk verloren gaan

Er is een harde limiet aan Google's kant die dit van een rapportagefunctie in een deadline verandert. Als je de codes niet continu vastlegt, verlies je ze.

De Voided Purchases API kijkt maar 30 dagen terug

Google is expliciet dat de API alleen teruggedraaide aankopen van de afgelopen 30 dagen kan tonen. Oudere voids worden niet teruggegeven, wat voor startTime je ook meegeeft, en de startTime-waarde zelf kan niet eerder dan 30 dagen geleden worden gezet. Erger voor een naïeve integratie: het venster van 30 dagen wordt gemeten aan de hand van wanneer Google's systemen een aankoop als teruggedraaid zien, niet aan de hand van wanneer de aankoop is gedaan of zelfs aan de hand van de voidedTimeMillis in het record. Dus een redencode die je niet binnen dat venster ophaalt is weg, en een maandelijkse exporttaak met welk gat dan ook laat stilletjes voids vallen die het te langzaam was om te vangen.

Wat de redencodes waard zijn in geld

Twee codes dragen een specifieke prijs, en ze lezen is hoe je een getal plakt op problemen die anders verborgen blijven binnen een geaggregeerd terugbetalingspercentage.

Eén code is een rekening die je jezelf schreef

voidedReason 8, unacknowledged purchase, is het schoonste voorbeeld van een terugbetaling die je zelf veroorzaakte. Google Play vereist dat je app een aankoop bevestigt binnen drie dagen na het verlenen van het recht, en als je dat niet doet betaalt Google de bestelling automatisch terug en trekt het item in. Elke void gestempeld met 8 is een echte verkoop, van een klant die het product wilde, teruggegeven omdat een aanroep om de aankoop te bevestigen nooit afging. Het verloren bedrag is de volledige verkoopprijs plus de rekenkracht, API-aanroepen en opslag die je al uitgaf om het te leveren. Dit is geen terugbetaling die je onderhandelt. Het is een bug die je dicht, en de code is hoe je hem vindt.

De chargeback-code draagt nu een kostenpost

voidedReason 7, chargeback, veranderde van kosten op 3 augustus 2026. Voor Google Play-bestellingen geplaatst op of na die datum kost een verloren chargeback de ontwikkelaar de aankoopprijs minus de servicekosten van Play, plus de chargeback-kosten van de bank, terwijl Google alleen zijn eigen servicekosten dekt. Omdat chargeback-kosten vast zijn en productprijzen niet, kan bij een goedkope in-app-aankoop de kostenpost alleen al meer bedragen dan wat de klant betaalde. Je code 7-voids tellen is nu een kostenpost tellen, niet slechts een verloren verkoop, en precies daarom verdient de chargeback-emmer een eigen rij in elk terugbetalingsrapport dat je bouwt.

RedencodeWat het je kostWaarom de code ertoe doet
8 Niet-bevestigde aankoopVolledige verkoopprijs plus leverkosten, op een verkoop die de klant wildeHet is zelf toegebracht, dus de code is een bugtracker
7 Chargeback (bestelling op of na 3 augustus 2026)Verkoopprijs minus de servicekosten van Play, plus de chargeback-kosten van de bankDe enige code die een kostenpost bovenop de verloren verkoop legt
3 DefectVerkoopprijs plus de leverkosten, herhaald voor elke klant die de bug raaktVolume in deze code beziffert een productdefect in dollars
1 RemorseVerkoopprijs, en de leverkosten die je al uitgafEchte kosten, maar niet die een codewijziging kan terugwinnen

Hoe Apple en Google zich verhouden

De twee stores beantwoorden dezelfde vraag op verschillende resoluties, dus een store-overschrijdend terugbetalingsrapport moet ze normaliseren in plaats van te verwachten dat ze overeenkomen.

VraagApp StoreGoogle Play
Waar de code woontrevocationReason in de signed transaction van de REFUND-meldingvoidedReason in de Voided Purchases API en zijn melding
Hoeveel redenenTwee: 1 probleem in je app, 0 overigNegen, van 0 overig tot 8 niet-bevestigde aankoop
Wie het deedNiet uitgesplitstvoidedSource: 0 gebruiker, 1 ontwikkelaar, 2 Google
Hoe ver terug je kunt lezenBeschikbaar op de transactie wanneer je hem ook opvraagtAlleen de afgelopen 30 dagen aan voids
Het scherpste signaalEen 1 betekent dat de terugbetaling over je product gaatCodes 3, 8 en 7 wijzen elk op een aparte, repareerbare kostenpost

De stores zullen je nooit dezelfde code geven voor dezelfde terugbetaling, en dat is prima. Wat telt is dat beide je een machine-leesbare reden overhandigen, en beide een team belonen dat hem leest. Apple's enkele bit vertelt je wanneer een terugbetaling de schuld van je product is. Google's negen redenen en zijn bronvlag vertellen je welke productbug, welk geschil en welk zelf toegebracht facturatiegat je voor je hebt. Geen enkele code houdt een terugbetaling tegen. Beide vertellen je wat te doen zodat de volgende niet gebeurt.

RefundHalt legt de redencode bij elke terugbetaling vast op het moment dat hij aankomt, op beide stores, en houdt hem ruim binnen Google's venster van 30 dagen zodat er niets wegglipt. Het sorteert elke void in repareren, aanvechten of accepteren, zodat een piek in code 3 defect je bereikt als een productalarm en een piek in code 8 niet-bevestigd je bereikt als een integratiebug, niet als een vage daling in omzet. Het beantwoordt Apple's CONSUMPTION_REQUEST binnen 12 uur en Google Play's chargeback-beoordeling binnen 24, en het trekt de toegang in op het moment dat een terugbetaling of chargeback landt. Je kunt de code die een store op een terugbetaling stempelt niet veranderen. Je kunt er wel voor zorgen dat je elke code leest, en handelt op degene die werkelijk aan jou zijn om te repareren.

Veelgestelde vragen

Wat is een redencode van een terugbetaling in de App Store en Google Play?
Het is het eigen label van de store voor waarom een aankoop is teruggedraaid, met de terugbetaling aan je server geleverd. De Voided Purchases API van Google Play geeft een voidedReason van 0 tot 8 terug en een voidedSource van 0 gebruiker, 1 ontwikkelaar of 2 Google. Apple zet revocationReason op 1 wanneer de terugbetaling kwam door een probleem binnen je app of op 0 om een andere reden zoals een onbedoelde aankoop. Je stelt de code niet in en kunt hem niet veranderen, maar hem lezen vertelt je of de terugbetaling naar je product, een geschil of een gedachtenwisseling van de klant wijst.
Wat zijn de voidedReason-waarden van Google Play?
Er zijn er negen: 0 overig, 1 remorse, 2 niet ontvangen, 3 defect, 4 onbedoelde aankoop, 5 fraude, 6 friendly fraud, 7 chargeback en 8 niet-bevestigde aankoop. Elke wordt per teruggedraaide aankoop teruggegeven door de Voided Purchases API, naast een voidedSource die zegt wie de void initieerde. Codes 2, 3 en 8 wijzen op problemen in je eigen app, codes 5, 6 en 7 zijn geschillen, en codes 1 en 4 zijn de eigen beslissing van de klant.
Wat betekent een Apple revocationReason van 1?
Het betekent dat de App Store de transactie terugbetaalde vanwege een werkelijk of vermeend probleem binnen je app, in tegenstelling tot een waarde van 0, die betekent dat de terugbetaling om een andere reden gebeurde zoals een onbedoelde aankoop. Het veld verschijnt alleen op terugbetaalde of ingetrokken transacties, samen met een revocationDate, binnen de signed transaction info van de REFUND App Store Server Notification. Een 1 is Apple dat je vertelt dat de terugbetaling over je product ging.
Waarom betaalde Google een aankoop terug met de reden niet-bevestigd?
Omdat je app de aankoop niet op tijd bevestigde. Google Play vereist dat je een aankoop binnen drie dagen na het verlenen van het recht bevestigt, en als je dat niet doet betaalt Google de bestelling automatisch terug en trekt het item in, met een void gestempeld met voidedReason 8. Het is een terugbetaling die je zelf veroorzaakte met een facturatiebug, geen verzoek van de klant, dus de oplossing zit in je aankoopverwerkingscode en niet in enige onderhandeling.
Hoe ver terug kan ik redencodes van terugbetalingen lezen?
Op Google Play maar 30 dagen. De Voided Purchases API geeft voids van de afgelopen 30 dagen terug en negeert elke startTime ouder dan dat, en meet het venster aan de hand van wanneer Google de void ziet, niet wanneer de aankoop is gedaan. Een code die je niet binnen 30 dagen vastlegt is verloren, dus je zou je moeten abonneren op de realtime melding voor teruggedraaide aankopen of pollen op een schema ruim binnen het venster. Apple's revocationReason blijft op de transactie wanneer je hem ook opvraagt.

Bronnen en verder lezen

RefundHalt

De terugbetalingsautopiloot voor de App Store en Google Play

Lees verder

Het volgende terugbetalingsverzoek is al onderweg.

Stel RefundHalt in binnen de tijd die het kost om nog een supportmail te lezen over een terugbetaling die je niet kon betwisten.