All articles
Deep dive9 min read

Every subscription upgrade refund is the store's decision, not yours, and it comes straight out of your proceeds

When a customer moves to a higher tier, the store issues a subscription upgrade refund for the unused days on the old plan, and it reduces your proceeds automatically. Here is how upgrade refunds work on the App Store and Google Play, and why Apple keeps the amount off your server.

A brass lever pushed up to a higher setting while coins slide off the desk edge into shadow, illustrating a subscription upgrade refund leaving your proceeds

Key takeaways

  • A subscription upgrade refund is automatic. When a customer moves to a higher tier mid-cycle, the store credits or refunds the unused days on the old plan without asking you, and the money comes out of the proceeds you already booked.
  • On the App Store an upgrade takes effect immediately and Apple refunds the prorated amount of the original subscription. A downgrade waits until the next renewal date and refunds nothing.
  • Apple does not send the upgrade refund amount to your server. The upgraded transaction is flagged isUpgraded, but the price field still shows the full price of the new tier, so revenue you compute from App Store Server Notifications runs high.
  • App Store Connect financial reports are the only place a prorated upgrade refund is accounted for. Apple staff say the amount is not available through the App Store Server API, Notifications, or StoreKit.
  • Google Play does not return money to the card on an upgrade. It credits the unused time or charges the price difference, and which one happens depends on the replacement mode you set. The default is WITH_TIME_PRORATION.
  • An upgrade refund is not a customer refund request. There is no CONSUMPTION_REQUEST and no chargeback review, so there is no 12-hour or 24-hour window and nothing to contest. You reconcile it, you do not fight it.
  • The replacement mode is a revenue decision. WITH_TIME_PRORATION hands the customer extra paid time you deliver at the higher tier's cost, while CHARGE_PRORATED_PRICE bills the difference now, so the wrong default leaks margin one upgrade at a time.

A customer taps upgrade, moves from your five dollar tier to your ten dollar tier, and you book a bigger sale. The store does something else at the same moment, and you never see it. It hands that customer a subscription upgrade refund for the days they already paid for on the old plan, and that money comes out of your proceeds. Nobody asked you. On the App Store you will not even find the amount in the events your server receives.

This is not the refund you can fight. It is not an Apple CONSUMPTION_REQUEST and it is not a Google Play chargeback review. It is proration, built into how both stores let people change plans, and it runs on its own every time a subscriber moves up a tier. Here is what an upgrade refund actually is on each store, why Apple keeps the amount off your server, and what the wrong Google Play setting costs you.

What a subscription upgrade refund actually is

An upgrade refund is the store settling up for time the customer paid for but will not use. It has nothing to do with a complaint, a dispute, or your refund policy. It fires on the mechanics of the plan change alone.

It is proration, not a customer complaint

When a subscriber moves to a higher tier in the middle of a billing period, they have already paid through the end of that period at the old price. The store makes them whole for the unused part. Apple issues a prorated refund of the original subscription. Google Play credits the unused value toward the new plan. Neither one passes through a flow you can respond to, and neither one waits for your approval.

Only an upgrade triggers it

The direction of the change decides the money. On the App Store an upgrade is a move to a product ranked higher in the same subscription group, and only that move is immediate and refunded. A downgrade is a move to a lower rank, and it takes effect at the next renewal with no refund. A crossgrade is a move between products at the same rank, and its timing depends on the durations involved. Rank the products wrong in App Store Connect and a change you think is an upgrade will behave like something else.

App Store changeWhen it takes effectWhat happens to the money
Upgrade to a higher tierImmediatelyApple refunds the prorated amount of the original subscription
Downgrade to a lower tierAt the next renewal dateNo refund, renews at the lower price
Crossgrade, same duration paid up frontImmediatelyNew subscription begins, paid service continues
Crossgrade, different durationsAt the next renewal dateNo mid-cycle refund

Why the App Store hides the upgrade refund from your server

Here is the part that breaks revenue reporting. Apple issues the upgrade refund, but it never tells your server how much it refunded.

isUpgraded is the only signal, and the price is wrong

The new transaction arrives with isUpgraded set to true, which tells you a plan change happened. The price field on that transaction still shows the full display price of the new tier, not the amount Apple clawed back from the old one. No App Store Server Notification carries the refund figure. In Apple's own words on the developer forums, the prorated refund amount is not available through the App Store Server API, Notifications, or StoreKit, and App Store Connect reporting is your source for all financial accounting purposes.

The financial report is the only honest record

App Store Connect financial and sales reports account for the prorated upgrade refund, because those reports drive what Apple actually pays you. That makes them the source of truth for any subscriber who has ever traded up. Build your accounting from the reports, and treat the server events as entitlement signals, not revenue.

Two subscription tier cards on a desk with a hand moving a marker up to the higher card while coins are lifted from the old card, illustrating a subscription upgrade refund leaving your proceeds

What it costs you, in money

The upgrade refund is not a rounding error. It is real proceeds, and on Google Play you also choose how much of the unused time you give away.

The refund is proceeds you already booked

Take a subscriber on your 9.99 per month tier who upgrades to 19.99 on day 20 of a 30 day cycle. Roughly a third of the month is unused, so Apple refunds about 3.33 of the original 9.99. You do not lose the whole sale. You give back the part the customer prepaid and will not use. What matters is that the give-back is automatic and it lands on the old sale, so the proceeds you already counted shrink after the fact. Multiply that by every subscriber who trades up mid-cycle and it is a line you should be able to see, not a gap you find in the payout.

On Google Play the replacement mode is the real cost lever

Google Play does not refund money to the card on an upgrade. It settles the unused time in one of several ways, and you pick which by passing a replacement mode when you launch the purchase flow. The choice decides whether you hand the customer paid time or bill them the difference. Google recommends CHARGE_PRORATED_PRICE for upgrades and DEFERRED for downgrades, but the library default is WITH_TIME_PRORATION, so a flow you never configured is quietly crediting time.

Google Play replacement modeWhen it takes effectWhat happens to the unused time
WITH_TIME_PRORATION (default)ImmediatelyCredited as extra time on the new plan, next billing date pushed out
CHARGE_PRORATED_PRICE (upgrade only)ImmediatelyPrice difference for the remaining period is charged now, billing date unchanged
WITHOUT_PRORATIONImmediatelyNothing settled now, the new price starts at the next renewal
CHARGE_FULL_PRICEImmediatelyFull price of the new plan is charged now, remaining value carried over or prorated
DEFERREDAt the next renewalCurrent plan runs until it expires, then the new plan starts

How to keep upgrade refunds from surprising your books

You cannot turn off proration, and you would not want to, because it is what makes a plan change fair to the customer. What you can do is see it, price it, and keep it apart from the refunds you can actually contest.

Reconcile Apple upgrades to the financial report

Because the refund amount never reaches your server, the App Store Connect financial and sales reports are the only place a prorated upgrade refund shows up. Reconcile subscriber revenue against those reports every period, and do not compute revenue from a running total of Server Notifications. The isUpgraded flag tells you a change happened. The report tells you what it cost.

Choose the Google Play replacement mode on purpose

Pass a replacement mode for every plan change deliberately. Use CHARGE_PRORATED_PRICE when you want the price difference collected now on an upgrade. Leave WITH_TIME_PRORATION in place only when you mean to give the customer the leftover time. Use DEFERRED for downgrades so you keep the current revenue until the term ends. The default is a decision, and the wrong default gives away margin one upgrade at a time.

Keep upgrade refunds separate from refunds you can contest

An upgrade refund is automatic and final by design. It is not a customer asking for their money back. The refunds you can actually influence are the customer-initiated ones, where Apple sends a CONSUMPTION_REQUEST and gives you 12 hours to respond, and where Google Play opens a chargeback review through orders.reviewrefund with a 24 hour window. Tag your data so the two never blur together. One line you reconcile. The other line you answer, on the clock.

The short version

When a customer upgrades a subscription, the store settles the unused time for them automatically. Apple refunds the prorated amount of the old plan immediately and never sends your server the figure, so App Store Connect financial reports are the only accurate record. Google Play credits the time or charges the difference depending on the replacement mode you set, and the default hands the customer paid time you deliver at cost. None of it runs through a CONSUMPTION_REQUEST or a chargeback review, so there is nothing to contest. Reconcile the upgrade refund, set your Google Play mode on purpose, and keep it apart from the refunds you can still fight.

Frequently asked questions

Does a subscription upgrade refund ask for my approval?
No. A subscription upgrade refund is automatic. When a customer moves to a higher tier mid-cycle, the store settles the unused time on the old plan on its own, with no request to you and no window to respond. Apple refunds the prorated amount of the original subscription, and Google Play credits the unused time or charges the price difference depending on the replacement mode you set.
Why does my App Store revenue not match my payout after upgrades?
Because Apple does not send the upgrade refund amount to your server. The upgraded transaction carries isUpgraded set to true, but the price field still shows the full price of the new tier, and no App Store Server Notification includes the refund. Revenue computed from server events counts the new sale and misses the refund on the old plan, so it runs high until you reconcile against App Store Connect financial reports.
Does Google Play refund money to the card when a customer upgrades?
No. Google Play treats the unused time as a credit, not a cash refund. Depending on the replacement mode, it either credits the remaining time toward the new plan and pushes out the next billing date, or charges the price difference for the remaining period. The default mode is WITH_TIME_PRORATION, which credits the time.
Can I contest a subscription upgrade refund?
No. An upgrade refund is not a customer refund request. There is no CONSUMPTION_REQUEST from Apple and no chargeback review from Google Play, so there is no 12-hour or 24-hour window and nothing to send. You reconcile an upgrade refund. You only contest customer-initiated refunds and chargebacks.
Does a downgrade give the customer a refund?
No. On the App Store a downgrade takes effect at the next renewal date and refunds nothing, since the customer keeps the higher level until the paid period ends. On Google Play the recommended way to handle a downgrade is the DEFERRED replacement mode, which keeps the current plan until it expires and then starts the lower one.
Which Google Play replacement mode should I use for an upgrade?
Google recommends CHARGE_PRORATED_PRICE for upgrades, which charges the price difference for the remaining period immediately and leaves the billing date unchanged. The default WITH_TIME_PRORATION instead credits the unused time as extra service on the higher tier, so use it only when you intend to give that time away.

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.