Alle artikelen
Handleiding8 min leestijd

Apple en Google betalen per store terug, dus je cross-platform abonnement moet overal elders de toegang beëindigen

Als Apple of Google een cross-platform abonnement terugbetaalt, merken je Android-app, je iPhone-app en je website dat niet vanzelf. Zo koppel je elke store-aankoop aan één account, trek je het juiste recht in en betaal je niet langer voor gebruikers die hun geld al terug hebben.

Een iPhone, een Android-telefoon en een laptop naast elkaar op een bureau, elk ingelogd op hetzelfde account van een cross-platform abonnement

Belangrijkste inzichten

  • Apples App Review Guideline 3.1.3(b) staat apps die op meerdere platforms werken toe om gebruikers toegang te geven tot content en abonnementen die op andere platforms of op de website van de ontwikkelaar zijn gekocht, zolang die ook als in-app-aankoop in de app beschikbaar zijn.
  • Apple en Google betalen alleen aankopen uit hun eigen store terug, dus een terugbetaling door Apple op een cross-platform abonnement bereikt de Google Play- of webfacturering van de klant niet. De server van de ontwikkelaar moet de verleende toegang op elk platform intrekken.
  • Apple stuurt via App Store Server Notifications V2 een REFUND-melding wanneer het een verbruiksartikel, een niet-verbruiksartikel, een niet-verlengend abonnement of een automatisch verlengend abonnement terugbetaalt, en stelt dat de ontwikkelaar verantwoordelijk is voor het opslaan, bewaken en afhandelen van elke terugbetaalde transactie.
  • Apples appAccountToken is een UUID die een ontwikkelaar aan een in-app-aankoop koppelt. Het Set App Account Token-endpoint van de App Store Server API kan er achteraf een toevoegen aan aankopen buiten de app, zoals een ingewisselde aanbiedingscode.
  • setObfuscatedAccountId van Google Play koppelt een aankoop aan een account in de app van de ontwikkelaar, is beperkt tot 64 tekens en zorgt ervoor dat aankopen worden geblokkeerd als het leesbare persoonsgegevens bevat, zoals een e-mailadres.
  • De Voided Purchases API van Google Play meldt terugbetaalde en teruggeboekte aankopen met een orderId en een voidedSource van 0 voor de gebruiker, 1 voor de ontwikkelaar of 2 voor Google.
  • Voor Google Play-bestellingen vanaf 3 augustus 2026 betaalt de ontwikkelaar bij een geslaagde chargeback de aankoopprijs, min de servicekosten van Play, plus de chargebackkosten van de bank.

Je abonnee betaalde via Apple, opende dezelfde middag je Android-app en gebruikt nu op het werk je website. Dan betaalt Apple het terug. Google Play weet het niet. Je webfacturering weet het niet. Tenzij je eigen server de toegang beëindigt, blijft een terugbetaald cross-platform abonnement werken op elk scherm dat je accountdatabase uitleest. De stores betalen per storefront terug, en je accountsysteem is de enige plek waar het hele abonnement bestaat. Daarmee is het ook de enige plek die het kan beëindigen.

Waarom de terugbetaling van één store een cross-platform abonnement niet beëindigt

Apple staat deze opzet uitdrukkelijk toe. App Review Guideline 3.1.3(b), Multiplatform Services, zegt dat apps die op meerdere platforms werken gebruikers toegang mogen geven tot content, abonnementen of functies die ze in je app op andere platforms of op je website hebben gekocht, mits die ook als in-app-aankoop in de app beschikbaar zijn.

Apples handleiding voor het aanbieden van één abonnement in meerdere apps beschrijft hoe dit in de praktijk werkt. Je server verleent de toegang via een centrale accountdatabase, en elke app leest daaruit. Dezelfde handleiding waarschuwt dat als een aankoop niet naar de andere apps wordt doorgegeven, de gebruiker meer dan eens voor dezelfde dienst kan gaan betalen.

Dat ontwerp heeft een gevolg dat vaak over het hoofd wordt gezien. Het recht staat in jouw database, maar elke store kent alleen zijn eigen bonnen. Apple kan de iPhone-aankoop terugbetalen en je server inlichten. Je Android-app of je website kan Apple niets vertellen. Als de handler voor terugbetalingen alleen de iOS-client bijwerkt, krijgt de klant zijn geld terug en houdt hij het abonnement overal elders.

Waar ze betaaldenWie over de terugbetaling beslistHoe je server het hoortWie verlengingen kan stoppen
App StoreAppleREFUND-melding in App Store Server Notifications V2De klant, in de abonnementsinstellingen van de App Store of in een beheerscherm dat je app opent
Google PlayGoogle in de eerste 48 uur, daarna jij of GoogleVoided Purchases API en realtime ontwikkelaarsmeldingenDe klant, of jij via purchases.subscriptionsv2.cancel
Je websiteJijWebhooks van je betaalproviderJij

Zo trek je na een terugbetaling de toegang op elk platform in

Koppel elke store-aankoop aan één account

Een terugbetaling aan een persoon koppelen is het lastige deel, omdat elke store de koper op zijn eigen manier identificeert. Beide bieden je een veld voor je eigen account-ID. Gebruik het bij elke aankoop.

  • Stel bij Apple een appAccountToken in, een UUID die je zelf genereert, wanneer de aankoop start. De App Store geeft dezelfde UUID terug in de transactie- en verlengingsinformatie. Volgens Apple kun je één waarde hergebruiken voor alle transacties van dezelfde klant.
  • Kocht de klant buiten je app, bijvoorbeeld door een aanbiedingscode in de App Store in te wisselen, dan heeft de transactie geen token. Het Set App Account Token-endpoint voegt er een toe. Bij een automatisch verlengend abonnement geldt het voor de huidige verlenging en latere verlengingen, niet voor eerdere transacties, en het werkt niet voor aankopen die via Delen met gezin worden gedeeld.
  • Geef bij Google Play een versleutelde account-ID mee met setObfuscatedAccountId wanneer je de betaalflow start. Die is beperkt tot 64 tekens. Volgens Google worden aankopen geblokkeerd als er leesbare persoonsgegevens zoals een e-mailadres in staan, en Google raadt versleuteling of een eenrichtingshash aan.

Luister naar beide stores en schrijf één recht weg

Apple stuurt REFUND wanneer het een willekeurig producttype terugbetaalt, automatisch verlengende abonnementen inbegrepen. Het stuurt REFUND_REVERSED wanneer het een al toegekende terugbetaling terugdraait vanwege een geschil dat de klant heeft aangespannen. Bij Google Play somt de Voided Purchases API terugbetaalde en teruggeboekte aankopen op, elk met een orderId die de exacte aankoop of verlenging aanduidt. Je webbetaalprovider stuurt zijn eigen terugbetalingsevent. Alle drie moeten in dezelfde handler binnenkomen en hetzelfde record wijzigen.

Trek het recht in, niet het account

Een terugbetaling annuleert een aankoop, geen persoon. Verwijder de toegang die uit de terugbetaalde aankoop voortkwam en bereken daarna opnieuw wat het account nog heeft. Heeft de klant ook een actief abonnement uit een andere store, dan houdt hij via dat abonnement toegang. Zo niet, dan verliest elke client de premiumfuncties zodra hij de volgende keer bij je server controleert.

Als dezelfde persoon in twee stores een abonnement neemt

Dubbele abonnementen zijn de andere helft van het probleem. Iemand neemt een abonnement op Android, krijgt een nieuwe iPhone, logt niet in en neemt opnieuw een abonnement. Nu betaalt hij twee keer voor één dienst, en een van die afschrijvingen wordt meestal een verzoek om terugbetaling. Apples commerceteam zei het, in antwoord op een ontwikkelaar op de Apple Developer Forums, eenvoudig: een accountsysteem van een app moet logica bevatten die de dubbele aankoop op een ander platform voorkomt.

Controleer elke store voordat je de paywall toont

Laat de gebruiker inloggen vóór de paywall, zoek op je server al zijn actieve aankopen op en sla het aanbod over als een daarvan dit platform dekt. Die ene controle voorkomt de meeste dubbele afschrijvingen voordat ze gebeuren.

Welke aankoop moet ik terugbetalen als het al is gebeurd?

Betaal de aankoop terug waar jij over beslist. Bij Google Play kun je de terugbetaling zelf uitvoeren in Play Console, en purchases.subscriptionsv2.cancel met DEVELOPER_REQUESTED_STOP_PAYMENTS stopt de volgende betaling. Je webabonnement kun je gewoon zelf terugbetalen. Over App Store-terugbetalingen beslist Apple, dus als het duplicaat op de iPhone staat, vraagt de klant de terugbetaling bij Apple aan, en je app kan dat verzoek openen met de refund request-API van StoreKit.

Wat een terugbetaling kost die een platform mist

De terugbetaalde prijs is pas het eerste verlies. Een klant van wie de Apple-terugbetaling nooit je Android-app of website heeft bereikt, blijft gebruiken waarvoor jij de rekening betaalt. Elke sessie kost nog steeds rekenkracht. Elke AI-functie doet nog steeds API-aanroepen bij derden die aan jou worden gefactureerd. Zijn bestanden nemen nog steeds opslag in, en als je app makers per weergave of per gebruik betaalt, blijven die uitbetalingen doorlopen. Bij een jaarabonnement kan dat een volledig jaar aan kosten betekenen voor een account dat niets meer betaalt.

De route via de bank maakt het erger. Voor Google Play-bestellingen vanaf 3 augustus 2026 zegt Google dat bij een geslaagde chargeback de ontwikkelaar verantwoordelijk is voor de aankoopprijs, min de servicekosten van Play, plus de chargebackkosten die de financiële instelling rekent. Een chargeback is bij de bank definitief. Een klant die een chargeback heeft gedaan en nog toegang heeft, kost je in één keer de prijs, de kosten en de serverkosten.

Wat blijft draaien na een gemiste intrekkingWie het betaalt
Serverrekenkracht voor elke sessie op Android of webJij
API-aanroepen bij derden door je functiesJij
Opslag voor de bestanden en geschiedenis van de gebruikerJij
Uitbetalingen aan makers per gebruik of per weergaveJij
Chargebackkosten op een Google Play-bestelling na 3 augustus 2026Jij, bovenop de aankoopprijs min de servicekosten van Play
Een hand met een smartphone naast een opengeklapte laptop, met een tweede telefoon die ondersteboven ligt, de alledaagse opstelling van iemand met een cross-platform abonnement

Gebruik op meerdere platforms blijft bewijs

Eén account over alle platforms helpt ook wanneer een store om jouw kant van het verhaal vraagt. Apples verbruiksinformatie vraagt welk deel van een verbruiksartikel, niet-verbruiksartikel of niet-verlengend abonnement de klant heeft verbruikt. Voor automatisch verlengende abonnementen stuur je geen percentage, omdat Apple dat berekent op basis van de verstreken tijd. De chargebackbeoordeling van Google Play accepteert tot 1.000 gebruiksevents, die elk de versleutelde account-ID kunnen bevatten. Gebruik dat onder één account-ID is vastgelegd, ongeacht het apparaat, is gebruik dat je kunt aantonen.

Bij welke terugbetalingen je nooit om jouw kant wordt gevraagd

De meeste terugbetalingen worden zonder jou beslist. Google Play kan een aankoop binnen 48 uur via zijn eigen terugbetalingsproces terugbetalen. Terugbetalingen door storesupport, geannuleerde aankopen en Googles automatische terugbetaling van aankopen die je nooit bevestigt, na ongeveer 72 uur, gebeuren allemaal eerst en worden pas daarna gemeld. Daarvoor is de intrekkingslogica hierboven het hele werk.

Slechts twee processen vragen om bewijs. Apples CONSUMPTION_REQUEST geeft je 12 uur om verbruiksinformatie te sturen. De chargebackbeoordeling van Google Play geeft je 24 uur vanaf de PendingRefundReviewNotification om te antwoorden via orders.reviewrefund, en Google registreert alleen je eerste aanroep. RefundHalt beantwoordt beide binnen de termijn, met de gebruiksgegevens die je al verzamelt, gekoppeld aan hetzelfde account in al je apps.

Een korte checklist voor cross-platform terugbetalingen

  • Stel appAccountToken in bij Apple-aankopen en een versleutelde account-ID bij Google Play-aankopen.
  • Vul ontbrekende Apple-tokens aan met Set App Account Token bij ingewisselde aanbiedingscodes.
  • Stuur Apples REFUND en REFUND_REVERSED, geannuleerde Google Play-aankopen en webterugbetalingen naar één handler.
  • Sla elke aankoop op met zijn bron en bereken de toegang uit alle actieve aankopen.
  • Controleer de aankopen in elke store voordat je op welk platform dan ook een paywall toont.

Veelgestelde vragen

Mag ik iPhone-gebruikers toegang geven tot een abonnement dat ze op Android of op mijn website hebben gekocht?
Ja. Apples App Review Guideline 3.1.3(b) staat apps die op meerdere platforms werken toe om gebruikers toegang te geven tot content, abonnementen of functies die op andere platforms of op je website zijn gekocht, zolang die ook als in-app-aankoop in de iPhone-app beschikbaar zijn.
Als Apple een abonnee terugbetaalt, merken Google Play of mijn webfacturering dat dan?
Nee. Apple informeert je server via een REFUND-melding in App Store Server Notifications V2, en verder niemand. Je server moet de toegang intrekken die die aankoop verleende op Android, op het web en overal waar het account verder inlogt.
Hoe koppel ik een App Store-terugbetaling aan een gebruikersaccount?
Gebruik appAccountToken, een UUID die je app aan de aankoop koppelt en die de App Store teruggeeft in de transactie-informatie. Voor aankopen buiten je app, zoals een ingewisselde aanbiedingscode, voegt Apples Set App Account Token-endpoint de token toe of vervangt het die. Transacties via Delen met gezin worden niet ondersteund.
Een klant heeft een abonnement in zowel de App Store als Google Play. Welke moet ik terugbetalen?
Betaal de aankoop terug waar jij over beslist. Een Google Play-bestelling kun je terugbetalen in Play Console, en de volgende betaling stop je met purchases.subscriptionsv2.cancel. Over App Store-terugbetalingen beslist Apple, dus een duplicaat op de iPhone loopt via Apples terugbetalingsverzoek, dat je app met StoreKit kan openen.
Telt gebruik op mijn website of in mijn Android-app als bewijs bij een beoordeling van een terugbetaling?
Gebruik dat onder één account is vastgelegd, kan je antwoord onderbouwen. Apples verbruiksinformatie vraagt welk deel van een verbruiksartikel, niet-verbruiksartikel of niet-verlengend abonnement is verbruikt, en de chargebackbeoordeling van Google Play accepteert tot 1.000 gebruiksevents die de versleutelde account-ID kunnen bevatten.

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.