Opzegredenen van abonnementen bereiken je meestal vóór het terugbetalingsverzoek, en Google Play geeft er veel meer van door dan Apple
Google Play legt opzegredenen vast via een opzegenquête, Apple stuurt alleen een verloopcode. Wat elke store je vertelt, welke signalen wijzen op een komende terugbetaling of chargeback, en wat elk signaal je kost.

Belangrijkste inzichten
- Google Play vraagt abonnees bij het opzeggen waarom ze vertrekken. Het antwoord bereikt de ontwikkelaar via canceledStateContext.userInitiatedCancellation.cancelSurveyResult in purchases.subscriptionsv2.
- De opzegenquête van Google Play heeft vijf antwoorden die een ontwikkelaar kan lezen: te weinig gebruik, technische problemen, kosten, betere app gevonden en anders. Vrije tekst in reasonUserInput is er alleen als de gebruiker anders kiest.
- Een SUBSCRIPTION_CANCELED-melding van Google Play bevat alleen het aankooptoken. De opzegreden moet je ophalen met purchases.subscriptionsv2.get, en Google wist alle opzegvelden als de gebruiker het abonnement herstelt.
- De App Store Server API van Apple heeft geen opzegenquête. Het veld expirationIntent geeft een van vijf codes: klant heeft opgezegd, factureringsfout, geen toestemming voor een prijsverhoging of aanbiedingsomzetting, product niet beschikbaar of anders.
- De Apple-melding DID_CHANGE_RENEWAL_STATUS met subtype AUTO_RENEW_DISABLED kan betekenen dat de App Store automatische verlenging heeft uitgezet nadat de klant om terugbetaling vroeg, niet alleen dat de klant het zelf uitzette.
- Een opzegreden geeft een ontwikkelaar nooit inspraak in een terugbetaling. Alleen de CONSUMPTION_REQUEST van Apple, te beantwoorden binnen 12 uur, en de chargebackbeoordeling van Google Play via orders.reviewrefund, te beantwoorden binnen 24 uur, vragen om bewijs.
- Een Google Play-abonnee die opzegt vanwege technische problemen wil het vaakst zijn geld terug. Voor bestellingen na 3 augustus 2026 kost een gewonnen chargeback de ontwikkelaar de aankoopprijs min de servicekosten van Play, plus de kosten van de bank.
De meeste abonnees die uiteindelijk geld terugkrijgen, zeggen eerst op. Die opzegging heeft een reden, en de twee stores geven je daar heel verschillende hoeveelheden van. Google Play houdt een korte enquête en stuurt het antwoord naar je server, inclusief vrije tekst. Apple stuurt een numerieke code die zegt hoe het abonnement eindigde, niet waarom de klant weg wilde. Lees beide goed en je ziet terugbetalingsverzoeken aankomen terwijl je er nog iets aan kunt doen.
Wat Google Play je vertelt over opzegredenen
Als een gebruiker opzegt in het Play-abonnementencentrum, vraagt Google waarom. Het antwoord komt terecht in de abonnementsresource die je krijgt van purchases.subscriptionsv2.get, onder canceledStateContext. Dat object bestaat alleen zolang het abonnement opgezegd of verlopen is, en het zegt wie het abonnement beëindigde: de gebruiker, het systeem van Google, jij, of een vervanging zoals een planwijziging.
Als de gebruiker het deed, bevat het object userInitiatedCancellation twee velden. cancelTime zegt wanneer er werd opgezegd. cancelSurveyResult bevat het enquêteantwoord.
| Enquêtereden | Omschrijving van Google | Wat het vaak aangeeft |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | Te weinig gebruik van het abonnement | Weinig gebruik, dus weinig kosten in het account |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | Technische problemen tijdens het gebruik van de app | Het sterkste signaal voor terugbetaling en chargeback |
| CANCEL_SURVEY_REASON_COST_RELATED | Kostengerelateerde redenen | Prijsgevoeligheid, soms een onverwachte verlenging |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | De gebruiker vond een betere app | Een concurrent won, zelden een geschil |
| CANCEL_SURVEY_REASON_OTHERS | Andere redenen | Lees reasonUserInput, de eigen woorden van de gebruiker |
| CANCEL_SURVEY_REASON_UNSPECIFIED | Niet-gespecificeerde enquêtereden | Geen antwoord om mee te werken |
De rechterkolom is onze interpretatie, niet die van Google. De eerste twee kolommen komen rechtstreeks uit de API-referentie.
De melding bevat de reden niet
Een opgezegd abonnement activeert een realtime ontwikkelaarsmelding SUBSCRIPTION_CANCELED, type 3. Google zegt duidelijk dat deze meldingen alleen aangeven dat de aankoopstatus is veranderd. De payload geeft je een aankooptoken en verder niets bruikbaars, dus je handler moet purchases.subscriptionsv2.get aanroepen om het enquêteantwoord te lezen.
De weergave in Play Console
Voor de totalen heb je geen code nodig. De abonnementsrapporten in Play Console bevatten een kaart Opzeggingen die churn opsplitst in vrijwillig, onvrijwillig en overig, en een kaart met antwoorden op de opzegenquête voor gebruikers die wilden antwoorden. Vrije-tekstantwoorden van gebruikers die anders kozen, download je als CSV via de kaart Overige antwoorden. Die download vereist de machtiging View financial data, dezelfde die je zou geven aan een tool die je bestellingen leest.
Wat Apple je vertelt, en wat het weglaat
Apple houdt geen opzegenquête die terugkoppelt naar ontwikkelaars. Het dichtstbijzijnde veld is expirationIntent in de ondertekende verlengingsinfo, en dat beschrijft hoe een abonnement eindigde, niet wat de klant dacht.
| expirationIntent | Betekenis volgens Apple | Bijbehorend EXPIRED-subtype |
|---|---|---|
| 1 | De klant heeft het abonnement opgezegd | VOLUNTARY |
| 2 | Factureringsfout, zoals ongeldige betaalgegevens | BILLING_RETRY |
| 3 | Geen toestemming voor een vereiste prijsverhoging of aanbiedingsomzetting | PRICE_INCREASE |
| 4 | Het product was bij verlenging niet te koop | PRODUCT_NOT_FOR_SALE |
| 5 | Een andere reden | Geen subtype |
Code 1 is de enige die een keuze van de klant beschrijft, en die zegt niets over het motief. Een klant die vertrok omdat de app steeds crashte en een die gewoon een project afrondde, zien er hetzelfde uit.
Het signaal in AUTO_RENEW_DISABLED
Eén Apple-melding verdient een nadere blik. DID_CHANGE_RENEWAL_STATUS met subtype AUTO_RENEW_DISABLED betekent meestal dat de klant automatische verlenging uitzette. De documentatie van Apple noemt een tweede geval: de App Store zet automatische verlenging ook uit nadat de klant om terugbetaling heeft gevraagd.
Op iOS kan een verlenging-uit-gebeurtenis dus het eerste spoor van een terugbetalingsverzoek zijn. Is de aankoop een verbruiksartikel of een automatisch verlengbaar abonnement, dan kan er een CONSUMPTION_REQUEST volgen, en vanaf dat moment heb je 12 uur om verbruiksgegevens te sturen. Komt zo'n gebeurtenis binnen zonder zichtbare actie in je app, zie het dan als een waarschuwing en zet de gebruiksgegevens van dat account klaar.
Apple en Google naast elkaar
| Google Play | Apple App Store | |
|---|---|---|
| Vraagt de gebruiker waarom | Ja, een opzegenquête | Geen enquête zichtbaar voor ontwikkelaars |
| Waar de reden staat | canceledStateContext in purchases.subscriptionsv2 | expirationIntent in verlengingsinfo |
| Vrije tekst | reasonUserInput, alleen bij anders | Geen |
| Wie opzegde | Gebruiker, systeem, ontwikkelaar of vervanging | Afgeleid uit code en subtype |
| Melding | SUBSCRIPTION_CANCELED, daarna get aanroepen | DID_CHANGE_RENEWAL_STATUS, EXPIRED |
| Weg als de gebruiker opnieuw abonneert | Ja, gewist bij herstel | Verlengingsinfo toont de huidige status |
| Dashboard | Kaart met antwoorden op de opzegenquête | Geen voor redenen |

Waar een opzegging een terugbetaling wordt
Een opzegging stopt de volgende afschrijving. De laatste geeft ze niet terug. Of er geld teruggaat, hangt af van welke terugbetalingsroute de klant daarna neemt, en de meeste routes lopen zonder jou.
- Op Google Play kan een koper binnen 48 uur na aankoop zelf een terugbetaling krijgen, en Google beslist.
- Over terugbetalingen via de support van Google of Apple beslist de store.
- De CONSUMPTION_REQUEST van Apple vraagt om je verbruiksgegevens, met een termijn van 12 uur.
- De chargebackbeoordeling van Google Play vraagt om bewijs via orders.reviewrefund, met een termijn van 24 uur. Het besluit van de bank over een chargeback is definitief.
Een opzegreden verandert geen van die regels. Wat hij verandert, is hoe vroeg je weet welke klant ontevreden is, en of je bewijs klaarligt wanneer een van de twee routes die erom vragen langskomt.
Wat elke reden je kost
Het enquêteantwoord is ook een ruwe indicatie van wat een account al heeft gekost om te bedienen. Dat is precies het geld waar je bij een terugbetaling mee blijft zitten.
Technische problemen
Dit is de dure. De klant gebruikte het product genoeg om op problemen te stuiten. Je hebt dus betaald voor de rekenkracht achter zijn sessies, de model-API-aanroepen van zijn verzoeken, de opslag voor alles wat hij maakte, en eventuele uitbetalingen aan makers van wie hij content gebruikte. Krijgt hij daarna een terugbetaling, dan gaat de prijs terug en blijven die kosten bij jou. Stapt hij op Google Play naar zijn bank, dan kost een bestelling na 3 augustus 2026 je de aankoopprijs min de servicekosten van Play, plus de kosten van de bank.
Kosten
Een klacht over de prijs kost je minder dan het lijkt, tenzij er een onverwachte verlenging achter zit. Dat is het klassieke chargebackverhaal, dus controleer of de opzegging direct na een verlengingsafschrijving kwam en of je verlengingsherinneringen zijn verstuurd.
Te weinig gebruik
Weinig gebruik betekent lage kosten, dus een terugbetaling geeft hier vooral geld terug waar je weinig voor hebt uitgegeven. Bij deze reden laten eerlijke verbruiksgegevens, als Apple erom vraagt, precies zien wat de klant wel en niet gebruikte.
Betere app gevonden
Deze klanten maken zelden bezwaar. Ze vertrokken naar een concurrent. De reden is nuttig voor productbeslissingen en bijna nooit voor het verdedigen tegen terugbetalingen.
Een routine voor het lezen van opzegredenen
- Roep bij elke SUBSCRIPTION_CANCELED van Google Play purchases.subscriptionsv2.get aan en sla canceledStateContext op met het aankooptoken en cancelTime.
- Sla reasonUserInput letterlijk op als de reden anders is. Het is de enige vrije tekst die een van beide stores je geeft.
- Log bij elke DID_CHANGE_RENEWAL_STATUS van Apple met AUTO_RENEW_DISABLED de gebeurtenis en haal het gebruik van dat account op, voor het geval er een CONSUMPTION_REQUEST volgt.
- Leg bij elke EXPIRED-melding van Apple het subtype en expirationIntent vast, zodat vrijwillige churn en betalingsfouten niet door elkaar lopen.
- Controleer bij opzeggingen op Google Play vanwege technische problemen de foutlogs van dat account en neem contact op voordat de klant naar zijn bank stapt.
- Houd gebruikslogs per account bij, zodat een CONSUMPTION_REQUEST binnen 12 uur een antwoord krijgt en een chargebackbeoordeling binnen 24 uur.
Veelgestelde vragen
- Hoe zie ik waarom een Google Play-abonnee heeft opgezegd?
- Roep purchases.subscriptionsv2.get aan en lees canceledStateContext.userInitiatedCancellation.cancelSurveyResult. Het veld reason bevat het enquêteantwoord, en reasonUserInput bevat vrije tekst als de gebruiker anders koos. Play Console toont de totalen ook op de kaart met antwoorden op de opzegenquête.
- Vertelt Apple ontwikkelaars waarom een klant een abonnement opzegde?
- Nee. Apple heeft geen opzegenquête die zichtbaar is voor ontwikkelaars. Het veld expirationIntent zegt hoe het abonnement eindigde, met codes voor klant heeft opgezegd, factureringsfout, geen toestemming voor een prijsverhoging, product niet beschikbaar of anders, maar niet het motief van de klant.
- Bevat de SUBSCRIPTION_CANCELED-melding de opzegreden?
- Nee. De realtime ontwikkelaarsmeldingen van Google Play zeggen alleen dat de aankoopstatus is veranderd. Haal het abonnement op met purchases.subscriptionsv2.get om de reden te lezen, en sla die meteen op, want Google wist de opzegvelden als de gebruiker het abonnement herstelt.
- Kan een AUTO_RENEW_DISABLED-melding van Apple een terugbetalingsverzoek betekenen?
- Ja. Volgens de documentatie van Apple dekt het subtype AUTO_RENEW_DISABLED zowel een klant die automatische verlenging uitzet als de App Store die het uitzet nadat de klant om terugbetaling vroeg.
- Mag ik de toegang intrekken als een abonnee opzegt?
- Niet op Google Play zolang de abonnee er nog recht op heeft. Volgens Google houdt een opgezegde abonnee toegang tot het einde van de factureringsperiode, en vroegtijdig intrekken is in strijd met het abonnementsbeleid van Google Play. Gebruik expiryTime om te bepalen wanneer de toegang eindigt.
Bronnen en verder lezen
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
De terugbetalingsautopiloot voor de App Store en Google Play
Lees verder
Buitensporige terugbetalingsverzoeken kunnen je meer kosten dan de terugbetalingen zelf, want beide app stores zien ze als kwaliteitssignaal
Apple's richtlijn 5.6.4 noemt buitensporige terugbetalingsverzoeken een teken dat een app niet aan de kwaliteitsnormen voldoet, en Google's distributieovereenkomst laat Google apps van nieuwe ontwikkelaars verwijderen op basis van het terugbetalingspercentage. Dit zegt elke store, dit kost een verwijdering en zo blijf je buiten schot.
Verifieer App Store server notifications voordat je op een terugbetaling reageert, want iedereen kan naar je webhook-URL posten
Een terugbetalingsmelding is gewoon een HTTPS-verzoek totdat je de handtekening controleert. Zo verifieer je App Store server notifications en Google Play RTDN-berichten, lees je wat elke store ondertekent en wat een vervalste of ten onrechte geweigerde terugbetaling je kost.