All articles
Playbook7 min read

The App Store order ID on a customer's receipt tells you what they bought and whether Apple already refunded it

Apple's Look Up Order ID endpoint turns the order ID from a customer's App Store receipt into signed transactions, including refund dates and reasons. Here's how to use it for refund emails, what it can't do, and how Google Play's order ID compares.

A support desk with a laptop inbox and an iPhone showing a purchase receipt, where an App Store order ID starts a refund conversation

Key takeaways

  • Apple emails a receipt with an order ID each time a customer makes in-app purchases, and customers can also find their order IDs in their App Store purchase history.
  • Apple's App Store Server API endpoint Look Up Order ID (GET /inApps/v1/lookup/{orderId}) returns one or more signed transactions for a valid order ID, so support can see the productId and purchaseDate without guessing.
  • A decoded App Store transaction carries revocationDate and revocationReason, so an order ID lookup shows whether Apple already refunded the purchase. Reason 1 means Apple refunded it over an actual or perceived issue within the app.
  • Look Up Order ID returns OrderLookupStatus 1 and no signedTransactions array when the order ID isn't valid for your app, which flags a wrong receipt or a purchase from a different app.
  • Look Up Order ID isn't available in Apple's sandbox environment, and its production rate limit is 10 requests per second per app, enforced on an hourly basis.
  • Developers can't issue App Store refunds. Apple decides them at reportaproblem.apple.com, and the developer's only evidence step is answering a CONSUMPTION_REQUEST within 12 hours.
  • Google Play emails an order ID for every one-time purchase and every subscription renewal, and the developer can search that order ID in Play Console and refund it directly. Play Console says a refund can't be reversed.

Before you answer an iPhone customer's refund email, ask for the App Store order ID on their Apple receipt. That one string, run through Apple's Look Up Order ID endpoint, tells you which product they bought, when, and whether Apple has already refunded it. Without it you're matching a screenshot and an email address against your database and hoping. With it, you know in seconds whether you're talking to a paying customer, a customer Apple already paid back, or someone holding a receipt from a different app.

Where the App Store order ID comes from

Apple's documentation is specific. When customers make one or more in-app purchases in your app, the App Store emails them a receipt, and that receipt contains an order ID. Customers can also find their order IDs in their purchase history on the App Store. Apple's purchase history page lives at reportaproblem.apple.com and in the App Store app under Apps & Purchase History, and it shows the last 90 days by default, with filters for older purchases.

So the customer already holds the key. Your support form just has to ask for it.

Why an email address isn't enough

Apple doesn't share the customer's Apple Account email with you. The address that writes to your support inbox may have nothing to do with the account that paid. If you set an appAccountToken at purchase, you can tie a transaction to your own user ID, but only from your side. The order ID works from the customer's side, from a receipt they can forward in one tap.

What Look Up Order ID returns

Look Up Order ID is part of the App Store Server API, available from version 1.1.0. You call GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} with your signed JWT. Apple says the response is based on the customer's in-app purchase history regardless of whether they installed, removed, or reinstalled the app.

Field or behaviorWhat Apple's documentation saysWhat support does with it
OrderLookupStatus 0Valid order ID. The response contains an array of one or more signed transactionsDecode each one and read the purchase
OrderLookupStatus 1The response doesn't contain a signedTransactions arrayTreat the order ID as not valid for your app. Ask for the right receipt
productId and purchaseDateApple names these as the fields to use for customer supportConfirm what was bought and when
revocationDateThe time the App Store refunded the transaction or revoked it from Family SharingIf present, Apple already paid the customer back
revocationReason0: refunded for other reasons, such as an accidental purchase. 1: refunded due to an actual or perceived issue within your appA 1 is a product signal, not just a support ticket
appAccountTokenThe UUID you set at purchase, if you set oneMatch the order to your own user record
price and currencyApple says not to use them for revenue reconciliationUse App Store Connect reports for the money
SandboxThe endpoint isn't available in the sandbox environmentTest against production order IDs only
Rate limit10 requests per second per app, enforced hourly. Excess gets HTTP 429 with a Retry-After headerPlenty for a support desk, not for bulk scans

Is it a valid receipt for my app?

That's the question OrderLookupStatus answers first. A 1 means the order ID didn't resolve to purchases in your app. The common cases are a typo, a receipt for a different app, or a receipt that isn't from the App Store at all. Don't refund, credit, or restore anything on a 1. Ask the customer to check the receipt again.

Did Apple already refund this purchase?

Check revocationDate on each decoded transaction. If it's set, Apple has already refunded that purchase or revoked it from Family Sharing, and the customer has their money. Your App Store Server Notifications should have sent a REFUND for the same transaction, so this is also a cheap way to confirm your server actually revoked access.

A developer comparing a printed App Store receipt with transaction rows on a laptop, checking an App Store order ID before replying to a refund request

What the order ID can't do on the App Store

It can't issue a refund. Developers have no App Store refund button. Apple decides refunds, and its support article sends customers to reportaproblem.apple.com, where they choose "I'd like to", then "Request a refund", pick a reason, and select the item. Apple also says a pending charge can't be refunded until the customer has the email receipt.

The only place you get a say is Apple's CONSUMPTION_REQUEST. When a customer asks Apple for a refund, Apple can send that notification, and you have 12 hours to answer with Send Consumption Information. The order ID lookup is a support tool. It doesn't open that window or extend it.

What a refund email costs when you skip the lookup

Support without the order ID is where money leaks quietly. Three patterns show up again and again.

  • Goodwill on top of a refund. Apple refunds the purchase, the customer also writes to you, and support grants free credits or an extra month. Every credit you hand out runs on compute, API calls and storage you pay for, on an account that's already been paid back.
  • Access that never got revoked. If your REFUND handling failed, the refunded customer keeps generating usage. A lookup that shows a revocationDate while your database still says active is a bug report with a price tag.
  • Wrong account, wrong fix. Restoring or crediting the account behind a forwarded email, when the order ID belongs to someone else, gives paid service to a person who never bought it.

None of these needs a dispute or a deadline to hurt. They're just support replies made without facts. One API call per ticket removes the guessing.

Does revocationReason 1 mean I did something wrong?

Not necessarily. Apple says reason 1 means it refunded the purchase due to an actual or perceived issue within your app. Perceived is doing a lot of work there. But a cluster of reason 1 refunds on one product, after one release, is the clearest product feedback Apple gives you. Count them.

How Google Play's order ID compares

Google Play works the other way round. Google's billing documentation says users receive an email with a unique order ID for each one-time product purchase, for the initial subscription purchase, and for each recurring renewal, and that you can use the order ID to manage refunds in Play Console. You search Order management by order ID or the user's full email address, then refund it yourself.

QuestionApp Store order IDGoogle Play order ID
Where the customer finds itEmail receipt and App Store purchase historyEmail receipt for each purchase and each renewal
How you look it upLook Up Order ID in the App Store Server APISearch Order management in Play Console
Can you refund from itNo. Apple decidesYes. Full refunds, and partial refunds on in-app purchases and subscriptions
Evidence window for the refundCONSUMPTION_REQUEST, 12 hours, Apple decidesChargeback review through orders.reviewrefund, 24 hours
Can a refund be undoneNot by youNo. Play Console says a refund can't be reversed

On Google Play, the order ID matters more because you're the one pressing the button. Play Console says refunding the most recent subscription order removes the subscription immediately and cancels future renewals, while refunding an older order is refund only and leaves the subscription active. Partial refunds are only supported for orders placed after March 2018, and you can't partially refund a paid app.

Put the order ID at the front of your refund support flow

  • Ask for the order ID in your support form, with a one-line hint: it's in the Apple or Google Play receipt email.
  • On iOS, call Look Up Order ID, decode every transaction, and show support the productId, purchaseDate, revocationDate and revocationReason on one screen.
  • If OrderLookupStatus is 1, stop and ask for the right receipt. Grant nothing.
  • If revocationDate is set, confirm access is already revoked on your server, then close the ticket. No goodwill on top.
  • If it isn't set and the customer wants their money back, send them to reportaproblem.apple.com and keep your CONSUMPTION_REQUEST handler ready for the 12-hour window. RefundHalt answers that request with the consumption data Apple asks for.
  • On Android, find the exact order in Play Console before you refund, and decide between refund only and refund and revoke on purpose.

Frequently asked questions

How do I look up an App Store order ID as a developer?
Call the App Store Server API endpoint Look Up Order ID, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, with your signed JWT. A valid order ID returns OrderLookupStatus 0 and one or more signed transactions you decode to read the productId, purchaseDate and any refund details. The endpoint isn't available in the sandbox.
Where does a customer find their App Store order ID?
In the email receipt Apple sends each time they make in-app purchases, and in their App Store purchase history at reportaproblem.apple.com or under Apps & Purchase History in the App Store app. Purchase history shows the last 90 days by default, with filters for older purchases.
Can I refund an App Store purchase with the order ID?
No. Developers can't issue App Store refunds. Apple decides them when the customer requests one at reportaproblem.apple.com. Your input is answering Apple's CONSUMPTION_REQUEST within 12 hours with Send Consumption Information.
How can I tell if Apple already refunded a purchase?
Look up the order ID and check revocationDate in each decoded transaction. If it's set, Apple refunded the purchase or revoked it from Family Sharing. revocationReason 0 means other reasons such as an accidental purchase, and 1 means an actual or perceived issue within your app.
What does OrderLookupStatus 1 mean?
It means the order ID isn't valid for your app, and the response has no signedTransactions array. Usually the customer sent a receipt from another app, mistyped the ID, or sent a receipt that isn't from the App Store. Ask for the correct receipt before granting anything.

Sources and further reading

RefundHalt

The refund autopilot for the App Store and Google Play

Keep reading

The next refund request is already on its way.

Set up RefundHalt in the time it takes to read another support email about a refund you didn't get to contest.