Een terugbetaling via de Advanced Commerce API is de enige manier waarop een iOS-ontwikkelaar een terugbetaling kan starten, en Apple beslist nog steeds
De meeste iOS-ontwikkelaars kunnen een klant geen geld terugbetalen. Apps op Apples Advanced Commerce API kunnen een terugbetaling aanvragen, een abonnement intrekken of een eigen bedrag terugsturen. Zo werkt elk endpoint, dit kan Apple nog weigeren, en hier gaat het met het geld mis.

Belangrijkste inzichten
- Een Apple-engineer zei in juni 2026 dat een ontwikkelaar voor een gewone App Store-aankoop niet zelf een terugbetaling kan uitvoeren. De enige inbreng van de ontwikkelaar is de verbruiksdata en refundPreference die hij stuurt als antwoord op een CONSUMPTION_REQUEST.
- Apps die zijn goedgekeurd voor Apples Advanced Commerce API krijgen een endpoint Request Transaction Refund, dat de App Store vraagt een eenmalige betaling of abonnementstransactie terug te betalen, plus de endpoints Revoke Subscription en Cancel a Subscription.
- Om de endpoints van de Advanced Commerce API voor terugbetalen, intrekken en opzeggen aan te roepen, moet de Account Holder van de ontwikkelaar het Advanced Commerce API Addendum ondertekenen. Volgens Apple geeft de aanroep een fout als de nieuwste versie niet is geaccepteerd.
- Het endpoint Request Transaction Refund accepteert een refundType van FULL, PRORATED of CUSTOM. Een refundAmount in duizendsten van de valuta-eenheid mag alleen met CUSTOM. Volgens Apple moet het bedrag in elke regio behalve Canada en de Verenigde Staten inclusief belasting zijn.
- Apples veld refundRiskingPreference staat standaard op true. Daardoor kan de App Store een CONSUMPTION_REQUEST sturen over het eigen terugbetalingsverzoek van de ontwikkelaar. Apple vraagt om een antwoord binnen 12 uur.
- De endpoints van de Advanced Commerce API voor terugbetalen, intrekken en opzeggen zijn in productie beperkt tot 5 verzoeken per seconde per app, en de sandbox krijgt 10 procent daarvan.
- Na een geslaagde aanroep van Revoke Subscription stuurt Apple een REFUND-melding en zegt ontwikkelaars de dienst te beëindigen per de revocationDate, niet voordat de melding binnenkomt.
Gewone iOS-ontwikkelaars kunnen een klant geen geld terugbetalen. In juni 2026 beantwoordde een App Store Commerce Engineer een vraag op het ontwikkelaarsforum met één zin: op dit moment is het voor een ontwikkelaar niet mogelijk om zelf een terugbetaling uit te voeren. Er is één uitzondering, en die zit in de Advanced Commerce API. Apps die Apple daarvoor goedkeurt, kunnen een terugbetalingsverzoek via de Advanced Commerce API sturen, een abonnement intrekken met geld terug, of een eigen bedrag aanvragen. Apple beslist nog steeds of het geld wordt overgemaakt.
Wat de Advanced Commerce API is en wie hem krijgt
Apple bracht de Advanced Commerce API uit op 23 januari 2025. Hij verwerkt Apple In-App Purchases voor uitzonderlijk grote catalogi van eigen eenmalige aankopen, abonnementen en abonnementen met optionele add-ons. Je maakt niet elk product aan in App Store Connect. Je definieert SKU's op je eigen server en stuurt ze bij de aankoop naar Apple.
Toegang wordt per app verleend. Je vult een aanvraagformulier in, en Apples pagina over geschiktheid noemt drie bedrijfsmodellen die de kern van de app moeten vormen:
- Uitzonderlijk grote catalogi van eenmalige aankopen, zoals luisterboeken, lessen, cursussen of mini-apps.
- Uitzonderlijk grote catalogi van abonnementscontent, waarbij het aanbod van elke maker een eigen abonnement is.
- Een abonnement met optionele add-ons die samen als één aankoop verlengen, zoals premiumkanalen of sport.
Apple laat apps ook aanvragen als een ander programma de API vereist. Het Mini Apps Partner Program, dat leden 85% uitbetaalt van de kwalificerende In-App Purchase-omzet in gehoste mini-apps, vereist hem.
De terugbetalingsendpoints kwamen later, en ze vragen een handtekening
Versie 1.1, gedateerd 24 maart 2025, voegde Request Transaction Refund en Revoke Subscription toe. Volgens Apples programmapagina kunnen apps met abonnementscontent ook in aanmerking komen voor de Cancel-, Revoke- en Refund-API's, om opzeggingen af te handelen, content na aankoop te valideren en hun catalogi te beheren. Elke endpointpagina stelt dezelfde voorwaarde: je Account Holder moet het Advanced Commerce API Addendum ondertekenen, en als de nieuwste versie niet is geaccepteerd, geeft de aanroep een fout. Het Addendum, niet de documentatie, noemt de toepassingen waarvoor elk endpoint bedoeld is.
De drie endpoints naast elkaar
| Cancel a Subscription | Revoke Subscription | Request Transaction Refund | |
|---|---|---|---|
| Pad | advancedCommerce/v1/subscription/cancel/{transactionId} | advancedCommerce/v1/subscription/revoke/{transactionId} | advancedCommerce/v1/transaction/requestRefund/{transactionId} |
| Dekt | Automatisch verlengbare abonnementen | Een abonnement en al zijn items | Eenmalige betalingen en abonnementstransacties |
| Geld terug | Geen | FULL of PRORATED | FULL, PRORATED of CUSTOM, per SKU |
| Toegang | Loopt door tot het einde van de periode | Eindigt op revocationDate | Per item ingesteld met de revoke-vlag |
| Rate limit in productie | 5 per seconde | 5 per seconde | 5 per seconde |
Cancel a Subscription stopt de volgende afschrijving
Cancel zet automatisch verlengen uit. Volgens Apple houdt de klant toegang tot het einde van de lopende periode. Er wordt niets terugbetaald. Dit is de juiste aanroep als een klant wil stoppen en de betaalde tijd al heeft gebruikt.
Revoke Subscription beëindigt alles meteen
Revoke zet automatisch verlengen op false en trekt het abonnement in met een volledige of naar rato berekende terugbetaling. De body bevat refundReason, refundRiskingPreference, refundType en requestInfo. Apple stuurt daarna een REFUND-melding naar je endpoint voor App Store Server Notifications V2. Apples instructie is precies: zet de dienst uit per de revocationDate in die melding, en zet hem niet uit voordat de melding binnenkomt.
Request Transaction Refund werkt per item
Dit is het precieze gereedschap. Je stuurt een lijst met items, en elk item noemt een SKU, een refundReason, een refundType en een revoke-vlag. Met CUSTOM stuur je ook refundAmount in duizendsten van de valuta-eenheid, dus 4990 betekent 4,99. Stuur je een bedrag mee met FULL of PRORATED, dan weigert Apple het met fout 4000155. Het antwoord bevat een ondertekende transactie en, bij abonnementen, ondertekende verlengingsinformatie.
Apple accepteert deze refundReason-waarden: UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER en MODIFY_ITEMS_REFUND. Een zevende, SIMULATE_REFUND_DECLINE, is alleen voor testen in sandbox en TestFlight, en bestaat omdat de App Store nee kan zeggen.
Apple kan ook je eigen terugbetalingsverzoek weigeren
De naam van het endpoint is eerlijk. Het is een verzoek. Twee velden laten zien waar de beslissing echt ligt.
refundRiskingPreference nodigt uit tot een verbruikscontrole
Apple beschrijft refundRiskingPreference als de keuze of de App Store je om verbruiksdata vraagt voor de beslissing over de terugbetaling. De standaardwaarde is true. Staat hij op true, dan krijg je een CONSUMPTION_REQUEST voor je eigen terugbetalingsverzoek en antwoord je via Send Consumption Information. Apple vraagt ontwikkelaars binnen 12 uur te reageren na ontvangst van een CONSUMPTION_REQUEST. Zet hem op false en die melding komt niet.
De fouten die nee zeggen
| Fout | Code | Wat Apple zegt |
|---|---|---|
| AlreadyRefundedError | 4030021 | De transactie is al terugbetaald |
| PendingRefundError | 4000181 | Voor de transactie lopen terugbetalingen |
| TransactionNotRefundableError | 4030024 | De transactie kan niet worden terugbetaald |
| TransactionCannotBeRefundedContactSupportError | 4030025 | De klant kan contact opnemen met Apple Support |
| RefundAmountWithoutCustomError | 4000155 | Er is een bedrag gestuurd zonder CUSTOM |
Op PendingRefundError moet je voorbereid zijn. Een waarschijnlijke oorzaak is een klant die Apple al via Report a Problem vroeg voordat je supportteam iets deed. Apples geschiktheidsregels verplichten deze apps sowieso tot een weg naar terugbetaling in de app, een Report a Problem-link of de API beginRefundRequest, dus beide deuren staan tegelijk open.

Wat een terugbetaling via de Advanced Commerce API je aan geld kost
Op eigen initiatief terugbetalen voelt goedkoper dan een geschil uitvechten. Het blijft geld dat de deur uitgaat, en de API maakt sommige fouten makkelijk op grote schaal te herhalen.
Belasting in het eigen bedrag
Volgens Apple moet een gevraagde refundAmount inclusief belasting zijn in alle regio's behalve Canada en de Verenigde Staten. Een team dat een CUSTOM-terugbetaling berekent op basis van de SKU-prijs zonder belasting, betaalt klanten in elke andere storefront te weinig terug en betaalt daarna met supporttijd om elk geval recht te zetten.
Kosten die niet terugkomen
- Uitbetalingen: in een makerscatalogus of bij een host van mini-apps wordt het aandeel van de maker vaak bij de verkoop uitbetaald. Een terugbetaling aan de klant haalt dat niet terug.
- Contentlicenties: vergoedingen per titel aan een rechthebbende voor een luisterboek of cursus kunnen, afhankelijk van je contract, al door toegang ontstaan, en een terugbetaling draait ze niet terug.
- Rekenkracht: streaming, transcoding en al het serverwerk voor de aankoop staan al op je rekening.
- API-aanroepen: diensten van derden die per verzoek factureren, van spraak tot modelinferentie, blijven gefactureerd na de terugbetaling.
Alles terug terwijl je één item bedoelde
Revoke Subscription betaalt terug en beëindigt het hele abonnement, inclusief add-ons. Betwist de klant maar één add-on, dan kun je met Request Transaction Refund alleen die SKU terugbetalen, met revoke alleen voor dat item. Wie Revoke Subscription aanroept bij een klacht over één item, geeft ook de omzet van het basisabonnement terug.
Een bouwchecklist voordat je dit aanzet
- Controleer dat je Account Holder het huidige Advanced Commerce API Addendum heeft geaccepteerd, en stel een alert in op de fout die terugkomt als het verloopt.
- Genereer voor elk verzoek een nieuwe requestReferenceId als UUID, en hergebruik dezelfde alleen om een verlopen aanroep opnieuw te proberen.
- Zet terugbetalingsaanroepen in een wachtrij. De limiet is 5 per seconde per app, en een 429 bevat een Retry-After-header in UNIX-milliseconden.
- Test weigeringen in de sandbox met SIMULATE_REFUND_DECLINE, en onthoud dat de sandboxlimieten 10 procent van productie zijn.
- Bepaal refundRiskingPreference per geval, en houd een responder voor verbruiksdata klaar voor het venster van 12 uur als hij op true blijft.
- Beëindig toegang pas als de REFUND-melding binnenkomt, per de revocationDate daarin.
- Log reden, bedrag en SKU van elk verzoek, zodat je eigen terugbetalingspercentage zichtbaar is voordat Apple het ziet.
Veelgestelde vragen
- Kan een iOS-ontwikkelaar een klant zelf geld terugbetalen?
- Niet bij een gewone App Store-aankoop. Een Apple-engineer zei in juni 2026 dat het voor een ontwikkelaar niet mogelijk is om zelf een terugbetaling uit te voeren. Apps die zijn goedgekeurd voor de Advanced Commerce API en het Addendum hebben ondertekend, kunnen er een aanvragen via het endpoint Request Transaction Refund. Apple beslist nog steeds.
- Wat is het verschil tussen Cancel en Revoke in de Advanced Commerce API?
- Cancel zet automatisch verlengen uit en de klant houdt toegang tot het einde van de periode, zonder terugbetaling. Revoke beëindigt het abonnement en al zijn items meteen en betaalt het volledige of naar rato berekende bedrag terug. Apple stuurt na een revoke een REFUND-melding.
- Kan ik met de Advanced Commerce API een eigen bedrag terugbetalen?
- Ja. Zet refundType op CUSTOM en geef refundAmount door in duizendsten van de valuta-eenheid. Volgens Apple moet het bedrag inclusief belasting zijn in alle regio's behalve Canada en de Verenigde Staten, en een bedrag met FULL of PRORATED geeft fout 4000155.
- Krijg ik een CONSUMPTION_REQUEST voor een terugbetaling die ik zelf heb aangevraagd?
- Dat kan. refundRiskingPreference staat standaard op true, waardoor de App Store je via een CONSUMPTION_REQUEST om verbruiksdata kan vragen, en Apple vraagt om een antwoord binnen 12 uur. Zet hem op false en volgens Apple wordt die melding niet gestuurd.
- Waarom is mijn terugbetalingsverzoek via de Advanced Commerce API mislukt?
- Kijk naar de foutcode. 4030021 betekent dat de transactie al is terugbetaald, 4000181 dat er al een terugbetaling loopt, 4030024 dat hij niet terug te betalen is, en 4030025 dat de klant contact moet opnemen met Apple Support. Een niet-ondertekend of verouderd Addendum geeft ook een fout.
Bronnen en verder lezen
- Apple Developer: Advanced Commerce API eligibility and requirements
- Advanced Commerce API: Request Transaction Refund
- Advanced Commerce API: RequestRefundItem
- Advanced Commerce API: refundRiskingPreference
- Advanced Commerce API: Revoke Subscription
- Advanced Commerce API: Rate limits
- Advanced Commerce API changelog
- App Store Server API: Send Consumption Information
- Apple Developer Forums: Refund option in App Store Server API
- Apple Developer: Mini Apps Partner Program
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.