Your refund reports never match across Apple, Google, and your server, here's how to reconcile them
Apple shows refunds in two reports, Google shows them in two more, and your server sees a fourth. None of the counts match, and the gaps are by design. Here is why each surface attributes refunds differently, and how to reconcile refund reports against your own records by transaction.

Key takeaways
- Apple splits refund reporting across two tools that never agree by design. Sales and Trends estimates refunds fast in USD, and Payments and Financial Reports settles them later on Apple's fiscal calendar. Your server's REFUND notification is a third, real-time view of the same event.
- In Apple's Summary Sales Report a refund is its own line with negative Units and a negative Customer Price, and the report is not net of refunds. If you sum a column by eye you will miscount, because refund rows sit alongside sale rows rather than cancelling them.
- Apple's financial reports run on a 4-4-5 fiscal calendar, not calendar months, and the report for a fiscal month is available by the first Friday of the next fiscal month. Any refund total you compare against a plain calendar month will be off before you start.
- Google Play separates refunds the same way. The earnings report lists Charge refund and Google fee refund as their own transaction types, each marked Full or Partial, while the estimated sales report is low-latency analytics that Google states is not for accounting.
- A refund is attributed to the date it settles, not the date of the original sale, so a refund of a March purchase lands in your April numbers on both stores. Reconcile refunds by transaction id, never by lining up monthly totals.
- Developers routinely find more REFUND notifications than refund rows in the Summary Sales Report for the same window, because the two count different moments. Apple's App Store Server API Get Refund History endpoint is the reconciliation source of truth, one transaction id at a time.
- Only two of these surfaces are built for accounting: Apple's financial report and Google's earnings report. Reconcile money against those, reconcile access against your server notifications, and never ask one number to do the other's job.
Pull the refund count from App Store Connect, then pull it from your server, and the two numbers will not match. Pull a third from your financial report and it will not match either one. This is not a bug in anyone's system. Apple and Google each report refunds through more than one surface, every surface counts a different moment in the refund's life, and your server sees a fourth. If you have ever tried to reconcile refund reports and given up because the totals drift apart, here is why they drift, which number to trust for which job, and how to line them up by transaction instead of by month.
Why one refund shows up as three different numbers
A single refund passes through several systems before it settles, and each system writes it down at a different instant. Your server hears about it first, as an event. A fast analytics report estimates it next. The accounting report records it last, once the money has actually moved. Same refund, three timestamps, three totals. The mistake is treating any two of them as if they should be equal on the same day.
Apple gives you two report families, plus your webhook
Apple reports refunds in two places that are not the same tool and are not meant to tie out on a given day. Sales and Trends is the fast, estimated view: daily reports land the next day, weekly reports on Mondays, monthly reports about five days after the month ends, generally by 8 a.m. Pacific. It estimates sales and proceeds in USD using a rolling average of the previous month's exchange rates, which makes it good for spotting a trend and wrong for tying out a payout. Payments and Financial Reports is the settled view: generated once a month on Apple's fiscal calendar, available by the first Friday of the current fiscal month for the prior fiscal month, and generated only if there were purchases or refunds in that period. It uses the finalized exchange rate applied to your payout. That report is the accounting record. Alongside both, your server receives the App Store Server Notification REFUND the moment Apple grants a refund, keyed to a single transaction id.
Google splits the same way
Google Play mirrors the split. The earnings report is the accounting record, generated monthly and typically available by the 5th of the following month, and it lists refunds as their own transaction types: Charge refund for the money returned to the buyer and Google fee refund for the service fee Google hands back, each tagged Full or Partial. The estimated sales report is the low-latency analytics view that shows what buyers paid before taxes and fees, and Google says plainly it is suitable for analytics and not recommended for accounting. On the server side you get the real-time Real-time Developer Notification and can read a refund back from the Voided Purchases API.
How Apple shows a refund inside the report, and the negative-line trap
Open the Summary Sales Report and a refund does not quietly subtract itself from a sale. It appears as its own row. The Units and the Customer Price on that row are negative, which is how you spot a refund at all, and the Developer Proceeds figure does not behave the way the price does. The report is not inherently net of refunds. It lists refund lines next to sale lines, and it is your job to bucket them. Sum the Units column by eye and you will either double count or miss the refunds entirely, because a minus one refund line sits in the same column as your positive sales.
The practical rule is simple: find refunds by the negative Units, add those rows up on their own, and never assume the report already netted them out for you. A featured snippet count of your refunds is the count of negative-Unit rows, not the arithmetic sum of a column.
| Apple surface | What it is for | When it updates | How a refund appears |
|---|---|---|---|
| Sales and Trends | Fast trend estimate, not accounting | Daily next day, monthly about 5 days after month end | Negative units in the trend, estimated in USD |
| Summary Sales Report | The downloadable detail behind Sales and Trends | Same cadence as Sales and Trends | Its own row, negative Units and negative Customer Price |
| Payments and Financial Reports | The accounting and payout record | Monthly on Apple's fiscal calendar, by the first Friday | Settled deduction from that fiscal month's proceeds |
| REFUND server notification | Real-time access control | The moment Apple grants the refund | One event, one transaction id |
The fiscal calendar is why your monthly totals never line up
Here is the single biggest reason a careful spreadsheet still refuses to balance. Apple's financial reports do not run on calendar months. They run on a 4-4-5 fiscal calendar, where most fiscal months are four weeks and every third one is five weeks. A developer comparing a Financial Report against a plain January-to-January window is comparing two different spans of days, so the refund totals cannot match even when every underlying number is correct. Developers on Apple's own forums have watched Sales figures and Financial Report figures diverge by thousands of dollars for exactly this reason, with the gap widening every month they let it accrue.
Google's earnings report is monthly, but it carries its own timing and its own timezone, and neither is your server's UTC clock. The deeper trap is shared across both stores: a refund is attributed to the date it settles, not the date of the original sale. Refund a March purchase in early April and it reduces your April numbers, not your March ones. Line up two months by their labels and the refund appears to have vanished from one and materialized in the other.

What a refund costs, and which report to read it in
Reconciliation is really an accounting question, so follow the money. On a refund the store returns its own commission, which means the amount that actually leaves your account is your share of the sale, not the full price the customer sees returned. On Google Play that return is a visible line: the Google fee refund transaction type on your earnings report is the service fee coming back to you, sitting next to the Charge refund that went to the buyer. On the App Store, Apple deducts your post-commission proceeds and gives its commission back in the same motion, so the financial report shows the deduction net of Apple's cut.
The cash-flow timing is where developers get surprised. On Google Play, if you refund an order before Google has paid you for it, you simply never receive that amount. If you refund after the payout, Google deducts it from a future payout. And if a wave of refunds pushes your balance negative and it stays negative for at least 48 hours, Google will debit the bank account that normally receives your payouts for the shortfall. A chargeback is the sharper version of the same event: on Google Play, for orders placed on or after August 3, 2026, the chargeback moves the purchase price plus the bank's fees onto the developer, and it lands on a later month's report than the sale did.
| On a refund | App Store | Google Play |
|---|---|---|
| What leaves your account | Your post-commission proceeds | Purchase price less Play's service fee |
| What the store returns | Apple's commission | The service fee, as a Google fee refund line |
| Which report to reconcile against | Payments and Financial Reports | Earnings report |
| When it settles | The fiscal month it processed, by the first Friday after | Deducted from the payout for that period or the next |
| Chargeback twist | Apple absorbs the card-dispute machinery | From Aug 3 2026, price plus bank fees shift to you |
How to reconcile your refund reports, step by step
The job gets simple once you stop trying to make every number equal and instead assign each number to the question it answers. There are only two questions: how much money moved, and who still has access.
- Decide the question before you open a report. For money, the answer lives in Apple's financial report and Google's earnings report, full stop. For access, the answer lives in your server notifications. Never reconcile one against the other.
- Pick the transaction id as your join key across all four surfaces. It is the one field that a sale, its refund, the reports, and your webhook all share.
- For Apple, when the Summary Sales Report and your webhook disagree, call the App Store Server API Get Refund History endpoint at
/inApps/v2/refund/lookup/{transactionId}. It returns the signed refunded transactions for a customer, with revocationDate and revocationReason, one transaction id at a time, and pages through their history. That endpoint is the tiebreaker. - For Google, cross-check the Charge refund lines on the earnings report against what the Voided Purchases API reports for the same orders, and remember a partial refund is tagged Partial and will not zero out the original charge.
- Align on the report's clock, not yours. Apple's is a fiscal month in Pacific time. Google's earnings report has its own month and timezone. Your logs are almost certainly UTC. Convert to the report's calendar before you compare, or the day boundaries alone will create phantom mismatches.
- Expect the estimate to move. Sales and Trends is an estimate and will keep shifting as transactions settle. Reconcile against the financial report, never against the estimate, and never against yesterday's snapshot of the estimate.
When your server shows more refunds than the report
The most common panic is finding more REFUND notifications on your server than refund rows in the sales report for the same window. It is usually not lost money. The two surfaces count different moments, a notification can precede the report row by days, and a partial refund or a resubmitted request can produce more than one event. Developers have reported exactly this shape, thousands of REFUND notifications against a smaller count of negative-Unit rows for the same month. Resolve it the same way every time: take the transaction ids your server saw, run them through Get Refund History, and let Apple's own record settle which ones actually refunded and for how much.
The short version
You cannot make Apple's estimate, Apple's financial report, Google's earnings report, and your webhook all show the same refund total on the same day, and you should stop trying. Read each one for what it is built to tell you. Trust the financial report and the earnings report for money, trust your server notifications for access, and when two surfaces fight, join them on the transaction id and let the Get Refund History or Voided Purchases lookup break the tie. Reconciled refunds are not matched totals. They are matched transactions.
Frequently asked questions
- Why don't my App Store sales and financial report match?
- They measure different things on different clocks. Sales and Trends is a fast estimate in USD using a rolling average exchange rate, while Payments and Financial Reports is the settled accounting record on Apple's 4-4-5 fiscal calendar, using the finalized exchange rate. Because fiscal months are not calendar months and refunds settle later than the sale, the two totals diverge by design. Reconcile against the financial report for anything involving money.
- How are refunds shown in the App Store Summary Sales Report?
- A refund appears as its own row with negative Units and a negative Customer Price. The report is not net of refunds, so refund rows sit next to sale rows rather than cancelling them. Identify refunds by the negative Units and total those rows separately, because summing the column by eye will miscount your refunds.
- When do refunds appear in Google Play's earnings report?
- The earnings report is generated monthly and typically available by the 5th of the following month. A refund shows up as two transaction types, Charge refund for the money returned to the buyer and Google fee refund for the service fee Google returns to you, each marked Full or Partial. If you refunded before Google paid you, you never receive that amount; if after, it is deducted from a future payout.
- Why does my server show more REFUND notifications than my sales report?
- Because the two count different moments. Your server hears the refund event in real time, while the sales report records the settled row later, and partial or resubmitted refunds can generate more than one notification. To settle the difference, take the transaction ids your server saw and run them through the App Store Server API Get Refund History endpoint, which returns Apple's own record of what actually refunded.
- Which refund number should I use for accounting?
- Apple's Payments and Financial Reports and Google Play's earnings report. Those are the settled, accounting-grade records. Apple's Sales and Trends and Google's estimated sales report are fast analytics that both stores tell you not to use for accounting, and your server notifications are for controlling access, not for booking revenue.
- Does a refund show up in the same month as the original sale?
- Usually not. A refund is attributed to the date it settles, not the date of the original purchase, on both stores. A March sale refunded in April reduces your April totals, so matching two months by their labels will make the refund look like it disappeared from one month and appeared in another. Match by transaction id instead.
Sources and further reading
- Apple: Differences between Sales and Trends and Financial Reports
- Apple: Summary Sales Report reference (refunds as negative units)
- Apple: Download financial reports (fiscal calendar, first Friday)
- Apple: Get Refund History (App Store Server API)
- Google Play Help: Understand your earnings report
- Google Play Help: Manage your app's orders and issue refunds
- Apple Developer Forums: Reconciling finance reports with App Store service state
RefundHalt
The refund autopilot for the App Store and Google Play
Keep reading
Google Play lets you issue a partial refund yourself, and the App Store leaves every refund to Apple
On Google Play you can refund part of an order from the Console, by percentage or by amount, and share the loss with Google's fee. On the App Store you can issue no refund at all. Here is how a partial refund works on each store, and what one costs you.
A healthy app refund rate sits between 2 and 5 percent, here's where to find yours and what it really costs
Most mobile apps refund 2 to 5 percent of paid transactions, but Apple and Google keep the number in different dashboards. Here is where to find your app refund rate, what counts as normal by plan and category, and what each refund really costs you after fees.