Een aankoop in behandeling lijkt op een verkoop, maar het geld is nog niet binnen, en wie hem te vroeg vrijgeeft, geeft het product weg
Zowel de App Store als Google Play kennen een status voor aankopen in behandeling, een bestelling die de store heeft geaccepteerd maar nog niet heeft afgeschreven. Geef hem vrij voordat de betaling binnen is en elke aankoop die alsnog afketst, is pure kostenpost. Hier lees je hoe aankopen in behandeling in elke store werken, wat een onterecht verleende aankoop kost en hoe je ermee omgaat zonder te lekken.

Belangrijkste inzichten
- Een aankoop in behandeling is een echte bestelling die de store heeft geaccepteerd maar nog niet heeft afgeschreven. Je code ziet een nieuwe aankoop, maar het geld is niet binnengekomen, en het komt misschien nooit binnen.
- Verleen alleen toegang wanneer de status PURCHASED is op Google Play, of wanneer de transactie is voltooid op Apple. Ontgrendel nooit bij een PENDING-status of bij Apple's lopende resultaat.
- Op Google Play worden contante betalingen in een winkel, bankoverschrijvingen en sommige vormen van betaling via de telefoonrekening buiten de reguliere stroom afgehandeld, dus komt de aankoop terug als PENDING, niet PURCHASED, totdat de klant daadwerkelijk betaalt.
- Bij Apple is een aankoop in behandeling meestal Ask to Buy, waarbij een gezinsorganisator hem moet goedkeuren. De goedkeuring kan uren of dagen duren, en de voltooide transactie komt later binnen via Transaction.updates.
- Ontgrendel je bij een bestelling in behandeling die vervolgens wordt geannuleerd, dan heb je rekenkracht, API-aanroepen, opslag of de uitbetaling van een verbruiksartikel besteed aan een afschrijving die nooit is binnengekomen. Anders dan bij een terugbetaling is er geen geld terug te vorderen, omdat er nooit iets is geïnd.
- De store laat je weten wanneer een bestelling in behandeling afketst. Google stuurt ONE_TIME_PRODUCT_CANCELED, type 2, of SUBSCRIPTION_PENDING_PURCHASE_CANCELED, type 20. Apple levert simpelweg nooit een voltooide transactie.
- Een bestelling in behandeling kan in een echte verkoop veranderen terwijl je app gesloten is, controleer dus opnieuw bij terugkeer: roep queryPurchasesAsync() aan in onResume() op Google Play, en blijf luisteren naar Transaction.updates bij Apple.
Iemand tikt in je app op kopen. Je logs tonen een nieuwe bestelling, je billing-listener wordt geactiveerd, en je overhandigt de goederen. Bij de meeste aankopen is dat precies goed. Bij een aankoop in behandeling is het een fout, want de bestelling bestaat maar het geld niet. De klant koos een betaalmethode die later wordt afgehandeld, de store wacht nog op zijn geld, en jij hebt zojuist een betaalde functie geleverd voor een afschrijving die misschien nooit binnenkomt. Dit is de stille neef van een terugbetaling. Hier wordt niets teruggedraaid, omdat er nooit iets is geïnd. Je hebt het product gewoon weggegeven.
Een aankoop in behandeling is een echte bestelling in een nog-niet-betaalde status, en zowel de App Store als Google Play kennen die. Beide stores zeggen je onomwonden te wachten. De valstrik is dat een bestelling in behandeling er in je code vrijwel identiek uitziet als een voltooide, zodat een integratie die elke nieuwe aankoop als verkoop behandelt goederen levert op bestellingen die de store nog probeert te innen. Doe het goed en je verliest niets. Doe het fout en elke trage betaling die afketst is pure kostenpost, geleverd op jouw rekening.
Wat een aankoop in behandeling eigenlijk is
Een aankoop in behandeling is een bestelling die de store heeft vastgelegd maar nog niet heeft afgeschreven. De koper startte de stroom, de store accepteerde hem, en de afhandeling gebeurt ergens waar je app niets kan zien. Google Play noemt dit de PENDING-status. Apple noemt het een lopende, of uitgestelde, transactie. Verschillende namen, hetzelfde feit: de store houdt een bestelling open terwijl hij wacht op betaling, en heeft je verteld die bestelling niet als geld te behandelen.
Google Play: de betaling gebeurt ergens anders
Sommige betaalmethoden worden buiten de reguliere stroom afgehandeld. Contant geld in een fysieke winkel, bankoverschrijvingen en sommige vormen van betaling via de telefoonrekening vergen allemaal extra stappen tussen de tik en de afschrijving. Wanneer een klant er een kiest, geeft Google de aankoop terug in de PENDING-status in plaats van PURCHASED. Bij een contante betaling ontvangt de klant een code per melding en per e-mail, brengt die naar een deelnemende winkel en betaalt bij de kassa. Tot dat gebeurt heeft Google niets geïnd, en jij evenmin. Google's regel is één zin: gebruik getPurchaseState() en verleen alleen toegang wanneer de status PURCHASED is. Google zegt je ook een aankoop niet te bevestigen zolang die PENDING is, want bevestiging hoort bij een betaalde bestelling, niet bij een beloofde.
Apple: de aankoop wacht op de tik van iemand anders
Apple's lopende status betekent dat de transactie een externe actie nodig heeft voordat ze kan worden voltooid. De meest voorkomende is Ask to Buy, waarbij een kind een aankoop start en een gezinsorganisator hem moet goedkeuren. In StoreKit 2 geeft de aankoopaanroep Product.PurchaseResult.pending terug. In het oudere StoreKit wordt de transactie als uitgesteld gemeld. Hoe dan ook heeft Apple niemand belast, en de voltooide transactie komt, als ze komt, asynchroon binnen via Transaction.updates. Toon de klant een wachtstatus en ontgrendel niets tot de voltooide transactie binnenkomt.
Waarom het vrijgeven van een aankoop in behandeling je echt geld kost
Het verlies hier is niet het terugbetalingssoort, waarbij geld dat je hebt geboekt wordt teruggetrokken. Het is op één specifieke manier erger: er is geen geld terug te trekken, omdat er nooit iets is geïnd.
Jij levert, en de store int nooit iets
Wanneer je ontgrendelt bij een bestelling in behandeling die later wordt geannuleerd, heb je al besteed om die te bedienen. De rekenkracht die de functie draaide, de API-aanroepen van derden waarvoor je betaalde, de opslag die je toewees, en bij een verbruiksartikel de daadwerkelijke uitbetaling van wat je verkocht. Dat gaat allemaal de deur uit op een bestelling die geen omzet opleverde. Een terugbetaling begint tenminste vanuit een afschrijving die plaatsvond. Een onterecht verleende aankoop in behandeling had helemaal nooit een afschrijving, dus verschijnt hij niet eens als geld dat naar buiten gaat. Hij verschijnt als niets, en dat is precies waarom hij makkelijk over het hoofd te zien en makkelijk te herhalen is.
Het annuleersignaal, en wat het betekent
De store laat je wel degelijk weten wanneer een bestelling in behandeling sterft. Op Google Play stuurt een eenmalig product dat afketst een ONE_TIME_PRODUCT_CANCELED-melding, type 2, en een abonnement dat in behandeling was stuurt SUBSCRIPTION_PENDING_PURCHASE_CANCELED, type 20. Wanneer diezelfde bestellingen wél doorgaan, krijg je ONE_TIME_PRODUCT_PURCHASED, type 1, of SUBSCRIPTION_PURCHASED, type 4. Bij Apple is er geen annuleergebeurtenis om op te vangen, want een uitgestelde transactie die wordt geweigerd wordt simpelweg nooit een voltooide transactie. Als je te vroeg hebt ontgrendeld, is die stilte de rekening.
| Vraag | Google Play | Apple |
|---|---|---|
| Wat het activeert | Contant, bankoverschrijving, sommige betaling via telefoonrekening | Ask to Buy-goedkeuring, of andere vereiste actie |
| Status die je ziet | PurchaseState PENDING | lopend resultaat, of een uitgestelde transactie |
| Toegang verlenen wanneer | Status is PURCHASED | Transactie is voltooid |
| Het ging door | ONE_TIME_PRODUCT_PURCHASED (1), SUBSCRIPTION_PURCHASED (4) | Voltooide transactie via Transaction.updates |
| Het ketste af | ONE_TIME_PRODUCT_CANCELED (2), SUBSCRIPTION_PENDING_PURCHASE_CANCELED (20) | Er komt nooit een voltooide transactie |
| Werd er geld geïnd | Nee, pas bij PURCHASED | Nee, pas als de transactie voltooid is |
Het venster, en wie op wie wacht
Een aankoop in behandeling is geen klok waartegen je racet. Het is een klok die, vanaf jouw kant, nog niet is gestart.
Google Play geeft de klant dagen, geen minuten
Een contante of bankoverschrijvingsbetaling wordt afgehandeld op het schema van de klant, niet het jouwe. De bestelling blijft in PENDING totdat de klant betaalt of het venster verstrijkt en Google hem annuleert. Je eigen bevestigingsvenster van drie dagen, dat een aankoop automatisch terugbetaalt die je niet bevestigt, begint niet eens voordat de aankoop overgaat van PENDING naar PURCHASED. Er is dus geen haast om een bestelling in behandeling te bedienen. Er is alleen de discipline om te wachten tot de status verandert.
Apple's goedkeuring staat op de telefoon van de gezinsorganisator
Een Ask to Buy-verzoek belandt op het apparaat van de organisator als een melding die hij goedkeurt of weigert wanneer hij eraan toekomt. Dat kan minuten, uren of een dag later zijn, en je app kan het niet versnellen. Het enige juiste gedrag is de wachtstatus weergeven en StoreKit de voltooide transactie laten overhandigen als en wanneer de goedkeuring komt.

Hoe je aankopen in behandeling afhandelt zonder te lekken
De hele klus komt neer op vier gewoontes. Geen ervan is moeilijk, en het overslaan van ook maar één ervan is waar het geld heen gaat.
Verleen bij de betaalde status, nooit bij de behandelde
Op Google Play controleer je getPurchaseState() en verleen je alleen bij PURCHASED, en bevestig je een aankoop niet zolang die PENDING is. Bij Apple ontgrendel je alleen bij een voltooide transactie en nooit bij het lopende resultaat. Deze ene regel sluit het hele lek af. Al het andere gaat erover ervoor te zorgen dat je daadwerkelijk merkt wanneer de betaalde status binnenkomt.
Controleer opnieuw wanneer de app terugkomt
De overgang van behandeling naar betaald gebeurt vaak terwijl je app niet draait. Op Google Play roep je queryPurchasesAsync() aan in je onResume()-handler om bestellingen op te pikken die op de achtergrond PURCHASED werden, en houd je je Real-time Developer Notifications-listener als de serverzijdige bron van waarheid. Bij Apple luister je gedurende de hele levensduur van de app naar Transaction.updates, want een goedgekeurde transactie kan lang nadat de oorspronkelijke aankoopaanroep terugkeerde binnenkomen.
Schakel ondersteuning voor aankopen in behandeling in en test beide uitkomsten
Google vereist dat je enablePendingPurchases() aanroept wanneer je de BillingClient bouwt, en het ondersteunen van transacties in behandeling voor eenmalige producten is verplicht, niet optioneel. Test het voordat je uitlevert. Licentietesters krijgen twee extra testinstrumenten voor uitgestelde betaalvormen, waarbij de betaling na een paar minuten automatisch wordt voltooid of automatisch geannuleerd, zodat je zowel het betaalpad als het afketspad van begin tot eind kunt bekijken.
Vertel de klant dat de bestelling niet klaar is
Een koper in behandeling is een echte klant midden in een aankoop, geen mislukking. Laat hem zien dat de bestelling wacht op zijn betaling of op een goedkeuring, en geef hem een duidelijke weg terug om die af te ronden. Een stille status in behandeling verliest verkopen die een goed gelabelde terugwint, want de meeste van deze kopers willen het ding nog steeds en hebben slechts één stap te gaan.
Dezelfde feeds van Real-time Developer Notifications en App Store Server Notifications die RefundHalt al leest voor terugbetalingen en terugboekingen dragen ook deze signalen. De purchased-melding die zegt dat een bestelling in behandeling eindelijk is binnengekomen, en de canceled-melding die zegt dat dat niet zo is, belanden in je dashboard naast de rest van je omzetgebeurtenissen, zodat een bestelling in behandeling die afketste iets is dat je kunt zien in plaats van iets waarvoor je per ongeluk hebt betaald.
De korte versie
Een aankoop in behandeling is een bestelling zonder betaling, en beide stores zijn expliciet dat je moet wachten. Google Play geeft contante, bankoverschrijvings- en sommige betalingen via telefoonrekening terug in een PENDING-status en zegt je alleen bij PURCHASED toegang te verlenen. Apple geeft een lopende of uitgestelde transactie terug voor Ask to Buy en andere vereiste acties en levert de voltooide transactie later via Transaction.updates. Ontgrendel bij de betaalde status, controleer opnieuw wanneer je app hervat, schakel ondersteuning voor behandeling in en test die, en label de wachtende bestelling voor de klant. Doe dat en een aankoop in behandeling kost je niets. Sla het over en je levert een betaald product voor een afschrijving die nooit kwam, wat het enige verlies is zonder bonnetje om naar te wijzen.
Veelgestelde vragen
- Wat is een aankoop in behandeling?
- Een aankoop in behandeling is een bestelling die de store heeft geaccepteerd maar nog niet heeft afgeschreven. Op Google Play is het de PENDING-aankoopstatus, gebruikt voor betaalmethoden die later worden afgehandeld zoals contant geld, bankoverschrijving en sommige betaling via de telefoonrekening. Bij Apple is het een lopende of uitgestelde transactie, meestal een Ask to Buy-aankoop die wacht op de goedkeuring van een gezinsorganisator. In beide gevallen is er nog geen geld geïnd, dus zou je geen toegang moeten verlenen.
- Moet ik toegang verlenen terwijl een aankoop in behandeling is?
- Nee. Verleen alleen toegang wanneer de status PURCHASED is op Google Play, of wanneer de transactie is voltooid op Apple. Als je een functie ontgrendelt terwijl de bestelling nog in behandeling is en de betaling nooit binnenkomt, heb je het product gratis geleverd, en er is geen afschrijving terug te draaien omdat er nooit een is gedaan.
- Welke betaalmethoden veroorzaken een aankoop in behandeling op Google Play?
- Betaalmethoden die buiten de reguliere stroom worden afgehandeld. Contante betalingen in een fysieke winkel, bankoverschrijvingen en sommige opties voor betaling via de telefoonrekening vergen extra stappen tussen de tik en de afschrijving, dus geeft Google de aankoop terug in de PENDING-status in plaats van PURCHASED. Bij een contante betaling krijgt de klant een code per melding en e-mail en betaalt dan in een deelnemende winkel.
- Wat is Ask to Buy, en hoe verhoudt het zich tot aankopen in behandeling?
- Ask to Buy is Apple's Family Sharing-functie waarmee een kind een aankoop kan aanvragen die een gezinsorganisator moet goedkeuren. Terwijl het verzoek wacht, is de aankoop in Apple's lopende status, teruggegeven als Product.PurchaseResult.pending in StoreKit 2 of als een uitgestelde transactie in het oudere StoreKit. De voltooide transactie komt alleen binnen, via Transaction.updates, als en wanneer de organisator hem goedkeurt.
- Wat gebeurt er als een aankoop in behandeling nooit wordt betaald?
- De bestelling wordt geannuleerd en er wisselt geen geld van eigenaar. Op Google Play ontvang je een ONE_TIME_PRODUCT_CANCELED-melding, type 2, voor een eenmalig product, of SUBSCRIPTION_PENDING_PURCHASE_CANCELED, type 20, voor een abonnement. Bij Apple wordt de uitgestelde transactie simpelweg nooit een voltooide transactie. Als je al toegang had verleend, is dat het moment waarop het verlies echt wordt.
- Is een aankoop in behandeling hetzelfde als een terugbetaling?
- Nee. Een terugbetaling draait een betaling terug die daadwerkelijk is geïnd. Een aankoop in behandeling die afketst is nooit belast, dus er is niets terug te draaien en er verschijnt niets in een terugbetalingsrapport. Als je hem te vroeg hebt ontgrendeld, zijn de kosten de rekenkracht, API-aanroepen, opslag of het verbruiksartikel dat je hebt besteed aan een bestelling die geen omzet opleverde.
Bronnen en verder lezen
- Android Developers: Integrate the Google Play Billing Library (PENDING purchase state, grant entitlement only on PURCHASED, enablePendingPurchases, queryPurchasesAsync, cash payment code flow, three-day acknowledgement window begins on transition to PURCHASED)
- Android Developers: Real-time developer notifications reference (OneTimeProductNotification ONE_TIME_PRODUCT_PURCHASED=1 and ONE_TIME_PRODUCT_CANCELED=2; SubscriptionNotification SUBSCRIPTION_PURCHASED=4 and SUBSCRIPTION_PENDING_PURCHASE_CANCELED=20)
- Android Developers: Test Google Play Billing (license testers get delayed-payment test instruments that auto-complete or auto-cancel for testing pending transactions)
- Apple Developer: Product.PurchaseResult (the pending case, returned when a purchase needs action such as Ask to Buy approval before it completes)
- Apple Developer: SKPaymentTransactionState.deferred (a transaction whose final status is pending an external action such as Ask to Buy)
- Apple Developer: Transaction.updates (StoreKit delivers transaction updates, including ones approved later, asynchronously)
RefundHalt
De terugbetalingsautopiloot voor de App Store en Google Play
Lees verder
Verlengingen mislukken vaker dan klanten opzeggen, en dat onvrijwillige verloop is omzet die je nog kunt terugwinnen
Een geweigerde kaart, geen tik op opzeggen, beeindigt een groot deel van de abonnementen, en de store blijft weken proberen te incasseren. Zo werken de betalingsrespijtperiode, de betalingsherhaling en de accountblokkering in de App Store en Google Play, en wat onvrijwillig verloop je echt kost.
Ongeautoriseerde in-app-aankopen door kinderen worden bijna altijd aan de ouder terugbetaald, en jij draagt de kosten
Wanneer een kind een muntpakket koopt op de telefoon van een ouder, betalen zowel Apple als Google het terug en geen van beide vraagt het jou eerst. Toezichthouders hebben het zo ontworpen. Zo werken deze terugbetalingen voor ongeautoriseerde in-app-aankopen in elke store, het venster van 15 minuten waarin het geld verdwijnt, en wat er eentje echt kost.