Alle artikelen
Handleiding7 min leestijd

De App Store order-ID op het bonnetje van een klant vertelt je wat die kocht en of Apple het al heeft terugbetaald

Apples endpoint Look Up Order ID zet de order-ID van een App Store bon om in ondertekende transacties, inclusief terugbetalingsdatum en reden. Zo gebruik je het bij terugbetalingsmails, dit kan het niet, en zo verhoudt de order-ID van Google Play zich ertoe.

Een supportbureau met een inbox op de laptop en een iPhone met een aankoopbewijs, waar een App Store order-ID een gesprek over terugbetaling opent

Belangrijkste inzichten

  • Apple mailt bij elke in-app-aankoop een bon met een order-ID, en klanten vinden hun order-ID's ook in hun aankoopgeschiedenis in de App Store.
  • Apples App Store Server API endpoint Look Up Order ID (GET /inApps/v1/lookup/{orderId}) geeft bij een geldige order-ID een of meer ondertekende transacties terug, zodat support de productId en purchaseDate ziet zonder te gokken.
  • Een gedecodeerde App Store transactie bevat revocationDate en revocationReason, dus een opzoeking van de order-ID laat zien of Apple de aankoop al heeft terugbetaald. Reden 1 betekent dat Apple heeft terugbetaald vanwege een werkelijk of vermeend probleem in de app.
  • Look Up Order ID geeft OrderLookupStatus 1 en geen signedTransactions array terug als de order-ID niet geldig is voor jouw app. Dat wijst op een verkeerde bon of een aankoop uit een andere app.
  • Look Up Order ID is niet beschikbaar in Apples sandbox-omgeving, en de rate limit in productie is 10 verzoeken per seconde per app, gehandhaafd per uur.
  • Ontwikkelaars kunnen geen App Store terugbetalingen doen. Apple beslist erover op reportaproblem.apple.com, en de enige bewijsstap van de ontwikkelaar is binnen 12 uur een CONSUMPTION_REQUEST beantwoorden.
  • Google Play mailt een order-ID voor elke eenmalige aankoop en elke abonnementsverlenging, en de ontwikkelaar kan die order-ID in Play Console opzoeken en direct terugbetalen. Volgens Play Console kan een terugbetaling niet worden teruggedraaid.

Voordat je de terugbetalingsmail van een iPhone-klant beantwoordt, vraag je om de App Store order-ID op het Apple-bonnetje. Die ene reeks tekens, door Apples endpoint Look Up Order ID gehaald, vertelt je welk product de klant kocht, wanneer, en of Apple het al heeft terugbetaald. Zonder die ID vergelijk je een screenshot en een e-mailadres met je database en hoop je er het beste van. Met die ID weet je binnen seconden of je praat met een betalende klant, met een klant die Apple al heeft terugbetaald, of met iemand die een bon van een andere app in handen heeft.

Waar de App Store order-ID vandaan komt

Apples documentatie is duidelijk. Als klanten een of meer in-app-aankopen in je app doen, mailt de App Store ze een bon, en die bon bevat een order-ID. Klanten vinden hun order-ID's ook in hun aankoopgeschiedenis in de App Store. Apples aankoopgeschiedenis staat op reportaproblem.apple.com en in de App Store app onder Apps en aankoopgeschiedenis, en toont standaard de laatste 90 dagen, met filters voor oudere aankopen.

De klant heeft de sleutel dus al. Je supportformulier hoeft er alleen om te vragen.

Waarom een e-mailadres niet genoeg is

Apple deelt het e-mailadres van het Apple Account van de klant niet met jou. Het adres dat naar je support mailt, heeft misschien niets te maken met het account dat betaalde. Als je bij de aankoop een appAccountToken instelt, kun je een transactie aan je eigen gebruikers-ID koppelen, maar alleen vanaf jouw kant. De order-ID werkt vanaf de kant van de klant, via een bon die met één tik door te sturen is.

Wat Look Up Order ID teruggeeft

Look Up Order ID hoort bij de App Store Server API en is beschikbaar vanaf versie 1.1.0. Je roept GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} aan met je ondertekende JWT. Volgens Apple is het antwoord gebaseerd op de in-app-aankoopgeschiedenis van de klant, ongeacht of die de app installeerde, verwijderde of opnieuw installeerde.

Veld of gedragWat Apples documentatie zegtWat support ermee doet
OrderLookupStatus 0Geldige order-ID. Het antwoord bevat een array met een of meer ondertekende transactiesDecodeer ze allemaal en lees de aankoop
OrderLookupStatus 1Het antwoord bevat geen signedTransactions arrayBehandel de order-ID als ongeldig voor je app. Vraag om de juiste bon
productId en purchaseDateApple noemt deze velden voor klantenondersteuningBevestig wat er gekocht is en wanneer
revocationDateHet moment waarop de App Store de transactie terugbetaalde of uit Delen met gezin haaldeAls het is ingevuld, heeft Apple de klant al terugbetaald
revocationReason0: terugbetaald om andere redenen, zoals een onbedoelde aankoop. 1: terugbetaald vanwege een werkelijk of vermeend probleem in je appEen 1 is een productsignaal, niet alleen een supportticket
appAccountTokenDe UUID die je bij de aankoop instelde, als je er een insteldeKoppel de bestelling aan je eigen gebruikersrecord
price en currencyApple zegt ze niet te gebruiken voor omzetafstemmingGebruik de rapporten in App Store Connect voor het geld
SandboxDe endpoint is niet beschikbaar in de sandbox-omgevingTest alleen met order-ID's uit productie
Rate limit10 verzoeken per seconde per app, per uur gehandhaafd. Daarboven volgt HTTP 429 met een Retry-After headerRuim genoeg voor een supportdesk, niet voor bulkscans

Is de bon geldig voor mijn app?

Dat is de vraag die OrderLookupStatus als eerste beantwoordt. Een 1 betekent dat de order-ID niet bij aankopen in je app hoort. De gewone gevallen zijn een typfout, een bon voor een andere app, of een bon die helemaal niet uit de App Store komt. Betaal niets terug, geef geen tegoed en herstel niets bij een 1. Vraag de klant de bon nog eens te controleren.

Heeft Apple deze aankoop al terugbetaald?

Controleer revocationDate in elke gedecodeerde transactie. Als het is ingevuld, heeft Apple de aankoop al terugbetaald of uit Delen met gezin gehaald, en heeft de klant zijn geld. Je App Store Server Notifications hadden voor dezelfde transactie een REFUND moeten sturen, dus dit is ook een goedkope manier om te bevestigen dat je server de toegang echt heeft ingetrokken.

Een ontwikkelaar vergelijkt een geprinte App Store bon met transactieregels op een laptop en controleert een App Store order-ID voordat hij een terugbetalingsverzoek beantwoordt

Wat de order-ID in de App Store niet kan

Hij kan geen terugbetaling doen. Ontwikkelaars hebben geen terugbetaalknop in de App Store. Apple beslist over terugbetalingen, en Apples supportartikel stuurt klanten naar reportaproblem.apple.com, waar ze kiezen voor 'Ik wil graag', dan 'Om terugbetaling vragen', een reden opgeven en het item selecteren. Apple zegt ook dat een openstaande afschrijving pas kan worden terugbetaald als de klant de bon per e-mail heeft.

De enige plek waar je iets te zeggen hebt, is Apples CONSUMPTION_REQUEST. Als een klant Apple om terugbetaling vraagt, kan Apple die melding sturen, en heb je 12 uur om te antwoorden met Send Consumption Information. De opzoeking van de order-ID is een supporthulpmiddel. Ze opent dat venster niet en verlengt het niet.

Wat een terugbetalingsmail kost als je de opzoeking overslaat

Support zonder order-ID is waar geld stilletjes weglekt. Drie patronen komen steeds terug.

  • Coulance bovenop een terugbetaling. Apple betaalt de aankoop terug, de klant mailt ook jou, en support geeft gratis credits of een extra maand. Elke credit die je weggeeft draait op rekenkracht, API-aanroepen en opslag die jij betaalt, op een account dat zijn geld al terug heeft.
  • Toegang die nooit is ingetrokken. Als je REFUND-afhandeling faalde, blijft de terugbetaalde klant gebruik maken van je dienst. Een opzoeking die een revocationDate toont terwijl je database nog actief zegt, is een bugmelding met een prijskaartje.
  • Verkeerd account, verkeerde oplossing. Als je het account achter een doorgestuurde mail herstelt of tegoed geeft terwijl de order-ID van iemand anders is, krijgt iemand betaalde dienstverlening die nooit iets kocht.

Geen van deze patronen heeft een chargeback of deadline nodig om pijn te doen. Het zijn gewoon supportantwoorden zonder feiten. Eén API-aanroep per ticket haalt het gokwerk weg.

Betekent revocationReason 1 dat ik iets fout heb gedaan?

Niet per se. Volgens Apple betekent reden 1 dat Apple de aankoop heeft terugbetaald vanwege een werkelijk of vermeend probleem in je app. Het woord vermeend doet daar veel werk. Maar een cluster van terugbetalingen met reden 1 op één product, na één release, is de duidelijkste productfeedback die Apple je geeft. Tel ze.

Hoe de order-ID van Google Play zich verhoudt

Google Play werkt precies andersom. Volgens Googles billing-documentatie krijgen gebruikers een mail met een unieke order-ID voor elke eenmalige productaankoop, voor de eerste abonnementsaankoop en voor elke terugkerende verlenging, en kun je de order-ID gebruiken om terugbetalingen te beheren in Play Console. Je zoekt in Orderbeheer op order-ID of op het volledige e-mailadres van de gebruiker, en betaalt dan zelf terug.

VraagApp Store order-IDGoogle Play order-ID
Waar de klant hem vindtBon per e-mail en aankoopgeschiedenis in de App StoreBon per e-mail voor elke aankoop en elke verlenging
Hoe je hem opzoektLook Up Order ID in de App Store Server APIZoeken in Orderbeheer in Play Console
Kun je ermee terugbetalenNee. Apple beslistJa. Volledige terugbetalingen, en gedeeltelijke bij in-app-aankopen en abonnementen
Bewijsvenster voor de terugbetalingCONSUMPTION_REQUEST, 12 uur, Apple beslistChargeback-beoordeling via orders.reviewrefund, 24 uur
Kan een terugbetaling worden teruggedraaidNiet door jouNee. Volgens Play Console kan een terugbetaling niet worden teruggedraaid

Op Google Play telt de order-ID zwaarder, omdat jij op de knop drukt. Volgens Play Console verwijdert het terugbetalen van de meest recente abonnementsbestelling het abonnement direct en annuleert het toekomstige verlengingen, terwijl het terugbetalen van een oudere bestelling alleen een terugbetaling is en het abonnement actief laat. Gedeeltelijke terugbetalingen worden alleen ondersteund voor bestellingen vanaf maart 2018, en een betaalde app kun je niet gedeeltelijk terugbetalen.

Zet de order-ID vooraan in je terugbetalingssupport

  • Vraag in je supportformulier om de order-ID, met een hint van één regel: die staat in de bonmail van Apple of Google Play.
  • Roep op iOS Look Up Order ID aan, decodeer elke transactie en toon support de productId, purchaseDate, revocationDate en revocationReason op één scherm.
  • Is OrderLookupStatus 1, stop dan en vraag om de juiste bon. Geef niets.
  • Is revocationDate ingevuld, bevestig dan dat de toegang op je server al is ingetrokken en sluit het ticket. Geen coulance erbovenop.
  • Is het niet ingevuld en wil de klant zijn geld terug, stuur hem dan naar reportaproblem.apple.com en houd je CONSUMPTION_REQUEST handler klaar voor het venster van 12 uur. RefundHalt beantwoordt dat verzoek met de verbruiksgegevens waar Apple om vraagt.
  • Zoek op Android de exacte bestelling op in Play Console voordat je terugbetaalt, en kies bewust tussen alleen terugbetalen en terugbetalen en intrekken.

Veelgestelde vragen

Hoe zoek ik als ontwikkelaar een App Store order-ID op?
Roep de App Store Server API endpoint Look Up Order ID aan, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, met je ondertekende JWT. Een geldige order-ID geeft OrderLookupStatus 0 en een of meer ondertekende transacties die je decodeert om de productId, purchaseDate en eventuele terugbetalingsdetails te lezen. De endpoint is niet beschikbaar in de sandbox.
Waar vindt een klant zijn App Store order-ID?
In de bon die Apple mailt bij elke in-app-aankoop, en in de aankoopgeschiedenis in de App Store op reportaproblem.apple.com of onder Apps en aankoopgeschiedenis in de App Store app. De aankoopgeschiedenis toont standaard de laatste 90 dagen, met filters voor oudere aankopen.
Kan ik een App Store aankoop terugbetalen met de order-ID?
Nee. Ontwikkelaars kunnen geen App Store terugbetalingen doen. Apple beslist als de klant op reportaproblem.apple.com om terugbetaling vraagt. Jouw inbreng is binnen 12 uur Apples CONSUMPTION_REQUEST beantwoorden met Send Consumption Information.
Hoe zie ik of Apple een aankoop al heeft terugbetaald?
Zoek de order-ID op en controleer revocationDate in elke gedecodeerde transactie. Als het is ingevuld, heeft Apple de aankoop terugbetaald of uit Delen met gezin gehaald. revocationReason 0 betekent andere redenen, zoals een onbedoelde aankoop, en 1 betekent een werkelijk of vermeend probleem in je app.
Wat betekent OrderLookupStatus 1?
Het betekent dat de order-ID niet geldig is voor je app, en het antwoord heeft geen signedTransactions array. Meestal stuurde de klant een bon van een andere app, typte de ID verkeerd, of stuurde een bon die niet uit de App Store komt. Vraag om de juiste bon voordat je iets toekent.

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.