Apple kan een reeds verleende terugbetaling terugdraaien, en een teruggedraaide terugbetaling die je server negeert sluit een klant buiten die heeft betaald
Wanneer de App Store een reeds verleende terugbetaling terugdraait, verwacht het dat je server de toegang die je hebt ingetrokken weer herstelt. Zo werken de meldingen voor terugbetaling, geweigerde terugbetaling en teruggedraaide terugbetaling op de App Store en Google Play, en wat elke melding je kost wanneer je ze negeert.

Belangrijkste inzichten
- De App Store stuurt een REFUND_REVERSED-melding wanneer het een eerder verleende terugbetaling terugdraait omdat de klant die heeft aangevochten, en Apples instructie is expliciet: als je app content of diensten heeft ingetrokken, moet je die herstellen.
- Een REFUND-melding betekent dat de App Store de transactie al heeft terugbetaald, dus je server moet het recht intrekken. Een REFUND_DECLINED-melding betekent dat Apple het verzoek heeft afgewezen, en de klant houdt zowel de toegang als de kosten.
- Als je bij een terugbetaling intrekt maar de terugdraaiing nooit afhandelt, blijft een klant wiens kosten worden hersteld buitengesloten. Dat is een supportticket, een recensie van een ster, en op Google Play een frustratie die kan uitmonden in een chargeback die je nu geld kost.
- Apples revocationReason vertelt je waarom de terugbetaling plaatsvond: value 1 betekent dat Apple heeft terugbetaald vanwege een daadwerkelijk of vermeend probleem in je app, value 0 betekent een andere reden, zoals een onbedoelde aankoop.
- Google Play heeft geen terugdraai-melding. Het stuurt een VoidedPurchaseNotification wanneer een aankoop wordt geannuleerd en een aparte PendingRefundReviewNotification voor chargebacks, en de rest verzoen je met het pull-model van de Voided Purchases API.
- Google Play geeft je 24 uur om te reageren op een PendingRefundReviewNotification door orders.reviewrefund aan te roepen, en het registreert alleen je eerste aanroep. Vanaf 3 augustus 2026 kost een verloren chargeback de ontwikkelaar de prijs minus Googles servicekosten plus de kosten van de bank.
- Handel de terugbetalingsmeldingen van de App Store idempotent af. Dubbele leveringen zijn normaal, dus koppel elke intrekking en herstelling aan het transaction id en maak van een herhaalde melding een no-op.
Een terugbetaling is niet altijd het laatste woord. De App Store kan een reeds verleende terugbetaling terugdraaien nadat de klant die aanvecht, en wanneer die teruggedraaide terugbetaling op je server aankomt draagt ze een instructie: geef de toegang terug. De meeste teams richten de gewone REFUND-melding in, sluiten de klant af, en stoppen daar. Ze bouwen de andere helft nooit. Dus wanneer de terugdraaiing binnenkomt, draait er niets, en een klant die opnieuw betaalt zit buitengesloten van wat hij heeft gekocht. Zo werkt de volledige set terugbetalingsmeldingen op de App Store en Google Play, en wat elke melding je kost wanneer je ze negeert.
De App Store stuurt drie terugbetalingsmeldingen, niet een
De meeste terugbetalingsafhandeling is gebouwd voor een gebeurtenis: het geld ging terug, sluit de klant af. De App Store Server Notifications V2-feed draagt eigenlijk drie afzonderlijke terugbetalingsuitkomsten, en ze vragen om drie verschillende dingen. Twee ervan veranderen waartoe een klant toegang heeft. Een ervan maakt de eerste ongedaan. Hier is de volledige set, in Apples eigen woorden.
| Melding | Wat het betekent | Wat je server doet |
|---|---|---|
| CONSUMPTION_REQUEST | De klant heeft om een terugbetaling gevraagd en Apple wil consumptiegegevens | Stuur de consumptie-payload binnen 12 hours |
| REFUND | De App Store heeft de transactie terugbetaald | Trek het recht voor die transactie in |
| REFUND_DECLINED | De App Store heeft het terugbetalingsverzoek afgewezen | Niets; de klant houdt de toegang en de kosten |
| REFUND_REVERSED | De App Store heeft een verleende terugbetaling teruggedraaid | Herstel de content of dienst die je hebt ingetrokken |
REFUND, degene die elk team afhandelt
Wanneer de App Store een terugbetaling verwerkt, stuurt het een REFUND-melding naar de URL die je configureert, en Apples definitie is helder: het 'geeft aan dat de App Store een transactie voor een verbruikbare In-App Purchase, een niet-verbruikbare In-App Purchase, een automatisch verlengend abonnement of een niet-verlengend abonnement met succes heeft terugbetaald.' Je slaat de terugbetaalde transactie op, trekt in wat ze heeft gekocht, en Apple vraagt je om de klant met contextuele berichten in de app te vertellen wat er is veranderd. Dit is de melding die iedereen als eerste inricht, en vaak de enige.
REFUND_DECLINED, degene die niets van je vraagt
REFUND_DECLINED betekent precies wat het zegt: 'de App Store heeft een terugbetalingsverzoek afgewezen.' De klant vroeg erom, Apple zei nee, en de transactie blijft staan. Er verandert niets aan de toegang van de klant, dus je rechtenlogica doet hier niets. De waarde van deze melding is administratie. Het sluit de lus rond een terugbetalingsverzoek dat je mogelijk met een CONSUMPTION_REQUEST hebt beantwoord, en het bevestigt dat de klant nog steeds heeft waarvoor hij heeft betaald. Behandel het als een registratie, niet als een actie.
REFUND_REVERSED, degene die teams verrast
Dit is de melding die de meeste terugbetalingspijplijnen nooit afhandelen. Apples definitie is ondubbelzinnig: REFUND_REVERSED 'geeft aan dat de App Store een eerder verleende terugbetaling heeft teruggedraaid vanwege een geschil dat de klant heeft aangespannen. Als je app content of diensten heeft ingetrokken als gevolg van de gerelateerde terugbetaling, moet je die herstellen.' Lees dat twee keer. Apple gaf de klant een terugbetaling, jij trok de toegang in, en toen besloot Apple dat de terugbetaling niet mocht standhouden en trok die terug. De kosten zijn weer actief. De klant heeft betaald, en als je server alleen weet hoe hij moet intrekken, blijft die klant buitengesloten. Een teruggedraaide terugbetaling is de enige terugbetalingsgebeurtenis die toegang teruggeeft, en het is degene waarvoor bijna niemand bouwt.
Wat een teruggedraaide terugbetaling je werkelijk kost
Een gemiste terugdraaiing is geen afrondingsfout. Volg het geld in beide richtingen, want elke helft verkeerd doen heeft een prijs.
Mis de terugdraaiing en je houdt een betalende klant buitengesloten. Apple heeft de kosten hersteld, dus de klant is opnieuw uit de portemonnee, en je app weigert hem het ding dat hij heeft gekocht. De directe kosten zijn supporttijd en een coulance-terugbetaling die je nu misschien zelf uitgeeft, deze keer zonder winkelcommissie die terugkomt om het te verzachten. De tragere kosten zijn de recensie en het verloop, en op Google Play is precies diezelfde buitengesloten frustratie wat uitmondt in een chargeback.
Mis de oorspronkelijke terugbetaling en je blijft een klant bedienen die niets heeft betaald. De spiegelfout is helemaal nooit intrekken. Een terugbetaalde klant die nog steeds afbeeldingen genereert, je APIs aanroept en je opslag vult, maakt echte kosten tegenover een verkoop die is teruggedraaid. De rekenkracht, de externe aanroepen en de opslag zijn geld dat je al hebt uitgegeven, en niets ervan komt terug met de terugbetaling.
- Supportkosten: een mens die een ticket beantwoordt over toegang die je eigen code heeft verwijderd en nooit heeft hersteld.
- Coulance-terugbetalingen: geld opnieuw uitgeven aan een klant die je ten onrechte hebt buitengesloten, zonder winkelcommissie die terugkomt op een handmatig gebaar.
- Verspilde uitgaven: rekenkracht, API-aanroepen en opslag verbruikt door een terugbetaald account dat je nooit hebt afgesloten.
- Chargeback-risico: op Google Play kan een klant die zich dubbel belast voelt een geschil aanspannen, en een verloren geschil komt nu bij jou terecht.
De teruggedraaide terugbetaling en de gewone terugbetaling zijn dezelfde webhook-feed die in tegengestelde richtingen wijst. Handel de ene af en sla de andere over en je betaalt aan beide kanten.

Waarom Apple een terugbetaling terugdraait, en hoe je revocationReason leest
Een terugdraaiing is niet willekeurig. Apple koppelt het aan 'een geschil dat de klant heeft aangespannen', wat de klant is die de terugbetalingsbeslissing achteraf aanvecht. Toen de terugbetaling voor het eerst werd verleend, droeg de transactie een revocationDate en een revocationReason, en die reden is het waard om te lezen voordat iets verderop erop reageert.
- revocationReason 1: de App Store heeft terugbetaald 'vanwege een daadwerkelijk of vermeend probleem in je app.' Dat is een signaal over je product, niet alleen over deze klant.
- revocationReason 0: de App Store heeft terugbetaald 'om andere redenen, bijvoorbeeld een onbedoelde aankoop.' Geen signaal over app-kwaliteit eraan verbonden.
Wanneer er een REFUND_REVERSED binnenkomt voor die transactie, wordt de intrekking ongedaan gemaakt. Je herstellogica moet het oorspronkelijke transaction id opzoeken, bevestigen dat je het hebt ingetrokken, en het recht exact terugzetten zoals het was.
Google Play stuurt geen terugdraaiing, dus je verzoent in plaats daarvan
Het model van Google Play is anders, en het verschil is belangrijk als je beide winkels via een webhook-handler afhandelt. Er is geen Google-equivalent van REFUND_REVERSED. Googles Real-time developer notifications splitsen terugbetalingsgebeurtenissen op in twee berichten, en terugdraaiingen worden afgehandeld via reconciliatie, niet via een push.
De melding voor geannuleerde aankoop
Wanneer een aankoop in Google Play wordt geannuleerd, ontvangt je server een VoidedPurchaseNotification. Het noemt de purchaseToken en orderId, een productType van subscription of one-time, en een refundType dat ofwel een volledige annulering is ofwel een op hoeveelheid gebaseerde gedeeltelijke terugbetaling bij aankopen van meerdere eenheden. Google zegt dat die gegevens genoeg zijn om de juiste aankoop te vinden en het recht aan te passen. Voor meer verwijst het je naar de Voided Purchases API, een pull-model dat geannuleerde orders opsomt binnen een tijdstempelbereik dat je bevraagt.
De chargeback-beoordeling en de klok van 24 uur
Chargebacks komen via een ander bericht, de PendingRefundReviewNotification. Wanneer een klant een afschrijving bij zijn bank aanvecht, stuurt Google Play deze melding en start een klok. Je hebt 24 uur om orders.reviewrefund aan te roepen met een terugbetalingsvoorkeur en eventueel gebruiksbewijs, zodat Google namens jou een onterechte chargeback kan aanvechten. Google registreert je eerste aanroep en negeert de rest. Dit is Googles tegenhanger van Apples CONSUMPTION_REQUEST, het ene venster waarin jouw kant van een geschil meetelt.
Omdat er geen terugdraai-push is, komt een chargeback die Google aanvecht en wint niet binnen als een keurige herstelgebeurtenis. Je verzoent het aan de hand van de Voided Purchases API en je eigen administratie. De les is dezelfde als op de App Store: een geannuleerde order is niet altijd definitief, en je rechtenstatus moet terug kunnen bewegen, niet alleen vooruit.
| Terugbetalingsgebeurtenis | App Store | Google Play |
|---|---|---|
| Terugbetaling verleend | REFUND notification | VoidedPurchaseNotification |
| Terugbetaling afgewezen | REFUND_DECLINED notification | Geen apart bericht |
| Terugbetaling teruggedraaid | REFUND_REVERSED notification | Geen push; verzoen via Voided Purchases API |
| Venster voor geschilbewijs | CONSUMPTION_REQUEST, 12 hours | PendingRefundReviewNotification, 24 hours |
| Wie kan de terugbetaling uitgeven | Alleen Apple | Google, of jij via het tabblad Orders |
Hoe je elke terugbetalingsmelding afhandelt zonder iemand buiten te sluiten
Je hebt geen aparte pijplijnen per winkel nodig. Je hebt een handler nodig die een recht in beide richtingen kan verplaatsen en elk bericht behandelt als mogelijk gedupliceerd.
- Bouw herstellen, niet alleen intrekken. Schrijf voor elk pad dat toegang verwijdert bij een REFUND het omgekeerde dat het herstelt bij een REFUND_REVERSED, gekoppeld aan hetzelfde transaction id.
- Maak het idempotent. Beide winkels kunnen dezelfde melding meer dan eens leveren, dus koppel elke intrekking en herstelling aan het transaction- of order id en maak van een herhaling een no-op.
- Lees de reden voordat je handelt. Gebruik revocationReason om een terugbetaling om app-kwaliteit te onderscheiden van een onbedoelde, en stuur de app-kwaliteitsgevallen naar wie verantwoordelijk is voor productkwaliteit.
- Beantwoord de bewijsvensters op tijd. Stuur Apples consumptiegegevens binnen 12 hours na een CONSUMPTION_REQUEST, en roep orders.reviewrefund aan binnen 24 hours na een PendingRefundReviewNotification.
- Bewaar elke gebeurtenis. Bewaar REFUND_DECLINED en de ruwe meldingen, zodat een terugdraaiing die later binnenkomt kan worden gekoppeld aan de terugbetaling die ze ongedaan maakt.
Niets hiervan verandert of een terugbetaling plaatsvindt. Het verandert of de klant aan de andere kant van een teruggedraaide terugbetaling ooit merkt dat je server het verkeerd deed.
Veelgestelde vragen
- Wat is een REFUND_REVERSED-melding op de App Store?
- Het is de App Store die je server vertelt dat het een eerder verleende terugbetaling heeft teruggedraaid, omdat de klant die heeft aangevochten. Apples instructie is expliciet: als je app content of diensten heeft ingetrokken als gevolg van die terugbetaling, moet je die herstellen. De kosten zijn weer actief, dus de klant hoort zijn toegang terug te krijgen.
- Wat moet ik doen wanneer ik een REFUND_DECLINED-melding krijg?
- Niets aan de toegang van de klant. REFUND_DECLINED betekent dat de App Store het terugbetalingsverzoek heeft afgewezen, dus de transactie blijft staan en de klant houdt waarvoor hij heeft betaald. Behandel het als een registratie die het terugbetalingsverzoek afsluit, vaak een verzoek dat je met een CONSUMPTION_REQUEST hebt beantwoord.
- Stuurt Google Play een melding wanneer een terugbetaling of chargeback wordt teruggedraaid?
- Nee. Google Play heeft geen equivalent van Apples REFUND_REVERSED. Het stuurt een VoidedPurchaseNotification wanneer een aankoop wordt geannuleerd en een PendingRefundReviewNotification voor chargebacks, maar een aangevochten chargeback die Google wint wordt niet naar je teruggepusht. Je verzoent het met de Voided Purchases API en je eigen administratie.
- Hoe lang heb ik om te reageren op een Google Play-chargeback?
- 24 uur. Wanneer Google Play een PendingRefundReviewNotification stuurt, heb je 24 uur om orders.reviewrefund aan te roepen met een terugbetalingsvoorkeur en gebruiksbewijs. Google registreert alleen je eerste aanroep. Vanaf 3 augustus 2026 kost een verloren chargeback de ontwikkelaar de prijs minus Googles servicekosten plus de kosten van de bank.
- Wat vertelt revocationReason me over een terugbetaalde App Store-transactie?
- Het vertelt je waarom Apple heeft terugbetaald. Value 1 betekent dat Apple heeft terugbetaald vanwege een daadwerkelijk of vermeend probleem in je app, wat een productsignaal is. Value 0 betekent een andere reden, zoals een onbedoelde aankoop. Door het te lezen kun je terugbetalingen die op een bug wijzen scheiden van routinegevallen.
Bronnen en verder lezen
- Apple Developer: App Store Server Notifications V2 notificationType
- Apple Developer: Handling refund notifications
- Apple Developer: revocationReason (App Store Server API)
- Android Developers: Real-time developer notifications reference
- Google Play Developer API: Method orders.reviewrefund
- Play Console Help: Updates to refund protection and chargeback cost responsibility
- Google Play Developer: Voided Purchases API
RefundHalt
De terugbetalingsautopiloot voor de App Store en Google Play
Lees verder
Wie voor een terugbetaling in je app betaalt, ben meestal jij, maar niet voor de commissie die je denkt te verliezen
Wanneer een klant een terugbetaling krijgt, geven zowel Apple als Google hun commissie terug, dus het deel van de store is niet wat je verliest. Hier lees je wie voor een terugbetaling in je app betaalt, wat er daadwerkelijk van je uitbetaling afgaat en waarom een chargeback meer kost dan een gewone terugbetaling.
Een abonnement opzeggen en geld terugkrijgen zijn twee verschillende dingen, en maar een ervan geeft je klant geld terug
Zeg je een abonnement op, dan stopt de store alleen de volgende afschrijving, houdt de klant toegang tot het einde van de periode en beweegt er geen geld. Een terugbetaling draait een betaling terug die al is verwerkt en trekt de toegang mee. Hier lopen de twee uiteen, dit kost elk je, en daarom bereikt alleen een terugbetaling je server.