All articles
Playbook7 min read

Customers charged twice for the same subscription usually paid on two platforms, and only one of those refunds is yours to give

When a customer is charged twice for the same subscription, it's usually one plan bought through the App Store and another through Google Play or your website. Here's who can refund each side, what it costs you, and how to stop the second charge.

An iPhone and an Android phone side by side on a desk next to a bank statement with two matching charges, showing a customer charged twice for the same subscription

Key takeaways

  • A customer charged twice for the same subscription has usually bought it through two separate stores, such as the App Store and Google Play, and each store bills and refunds its own purchase independently.
  • Developers can't refund App Store purchases. Apple decides, either through reportaproblem.apple.com or through the refund sheet an app can open with StoreKit's beginRefundRequest, and Apple says it takes up to 48 hours to approve or deny.
  • On Google Play, a developer can refund an order from Order management in Play Console or through the orders.refund API, which can't refund orders older than 3 years.
  • Refunding the most recent order of a Google Play subscription removes the subscription immediately and cancels future recurrences, while refunding an older order leaves the subscription active.
  • Apple sends a CONSUMPTION_REQUEST for refund requests on any product type, including auto-renewable subscriptions, and the developer has 12 hours to respond with Send Consumption Information if the customer consented.
  • For Google Play orders placed after August 3, 2026, a chargeback costs the developer the purchase price, less Play's service fee, plus the bank's chargeback fee.
  • Setting an appAccountToken on Apple purchases and an obfuscated account ID on Google Play purchases lets your server see one customer behind two store subscriptions before a second charge happens.

Nothing in Apple's or Google's billing systems stops one person from paying both of them for your subscription in the same month. When a customer is charged twice for the same subscription, that's almost always what happened. They subscribed on an iPhone, then again on an Android tablet or on your website, and your app didn't recognize the first plan. The customer sees two charges and writes to you. The catch is that you can refund only one of them yourself, and only if it wasn't bought through Apple. Here's how each side works, what the duplicate costs you, and how to make sure it doesn't happen again.

Why customers get charged twice for the same subscription

Each store owns its own purchase. Apple bills the App Store subscription, Google bills the Google Play one, and your payment processor bills the web plan. None of them knows the others exist. Your server is the only place where the two purchases can meet, and only if both carry an ID that ties them to the same account.

The usual paths to a double charge look like this:

  • The customer switches phones, from iOS to Android or back, and subscribes again because the new app shows a paywall.
  • The customer subscribes on your website, installs the app, and isn't signed in, so the app sells them a store subscription on top.
  • The customer uninstalls the app and assumes that ended the plan. Google's help says uninstalling an app doesn't cancel its Google Play subscription, and an App Store plan keeps renewing until it's canceled in the Apple account.

"Your app and website clearly aren't talking to each other"

That's the complaint you'll read in the support email, and from the customer's side it's fair. They paid for one product. Being asked to pay again for it feels like a trap, even when it was an accident on both sides. The quickest way to cool that down is to say plainly which purchase you can refund and which one they need to take to Apple.

Who can refund each charge

This is where most support replies go wrong. You can only promise what you control.

Where the duplicate was boughtWho decides the refundHow the plan stops renewingYour input
App StoreApple only, through reportaproblem.apple.com or your in-app refund sheetThe customer cancels in their Apple accountCONSUMPTION_REQUEST, answer within 12 hours if the customer consented
Google Play, within 48 hours of purchaseThe customer can request it from Google, or you can refund itRefunding the latest order cancels future recurrencesNone for Google's self-service refund
Google Play, after 48 hoursYou, from Play Console or orders.refundRefunding the latest order cancels future recurrencesYou decide
Your websiteYou, through your payment processorYou cancel it on your sideYou decide

Can a developer refund an App Store subscription?

No. Apple handles every App Store refund. What you can do is shorten the trip. StoreKit's beginRefundRequest opens Apple's refund sheet inside your app, with the purchase details and a list of reasons already filled in. Apple's documentation says the App Store takes up to 48 hours to approve or deny the request. Outside the app, the customer signs in at reportaproblem.apple.com, picks "Request a refund", chooses a reason and selects the subscription.

Refunding the Google Play side yourself

On Google Play you're in control. In Play Console, open Order management, select the order and refund it. Play Console help is specific about subscriptions: refund the most recent order and the subscription is removed immediately, with future recurrences canceled. Refund an older order and the subscription stays active. If you automate this, the orders.refund API does the same job, takes a revoke flag to end access at once, and refuses orders older than 3 years.

What a duplicate subscription costs you

The duplicate was never revenue you got to keep. The money question is how much more it costs on top of the refund.

The clean case

Say a customer paid $9.99 a month on both the App Store and Google Play for three months before noticing. That's $29.97 of duplicate charges. If you refund the three Google Play orders yourself, you give back $29.97 and the problem ends that day. If the customer instead takes the App Store side to Apple, Apple decides how much to refund and you only find out through your server notifications. Either way, one platform's revenue for those three months goes back.

The expensive case

The real loss comes when the customer gives up on support and calls their bank. A chargeback is final once the bank decides. Google Play gives you one chance to argue, a chargeback review that you answer within 24 hours through orders.reviewrefund. For Google Play orders placed after August 3, 2026, a lost chargeback costs you the purchase price, less Play's service fee, plus the bank's chargeback fee. A $29.97 refund you could have issued in a minute turns into $29.97 plus a fee you don't control.

The cost you keep paying meanwhile

While both plans are active, your backend serves one person but sees two subscriptions. If you count seats, sync data or call paid third-party APIs per subscription, you may be paying twice for compute, storage and API calls on a single customer. Merging the two records ends that.

A developer reading a customer support inbox on a laptop beside a smartphone, working through a duplicate subscription refund

How to handle a double charge in support

Answer fast and in one message. Every extra round trip raises the odds of a bank dispute.

  • Look up both purchases by the customer's account, not by the email address they wrote from.
  • Ask which plan they want to keep. Usually it's the one on the device they use now.
  • If the duplicate is on Google Play or your website, refund it yourself and tell them it's done.
  • If the duplicate is on the App Store, send them to reportaproblem.apple.com, or to the refund button in your app if you've built one, and tell them to cancel it in their Apple account settings.
  • If Apple then sends a CONSUMPTION_REQUEST and the customer consented, answer it within 12 hours with accurate usage. A duplicate plan that was never used is easy for Apple to approve.

How to stop the second charge before it happens

Prevention is cheaper than any refund, and the tools already exist in both stores.

Tie every purchase to your account ID

On iOS, generate a UUID per account and pass it as the appAccountToken purchase option. Apple returns the same value in the transaction and in the subscription renewal information. If a purchase happened outside your app, the Set App Account Token endpoint lets you attach or update the token later. On Android, pass a hashed account ID of 64 characters or less to setObfuscatedAccountId, never raw personal data.

Check entitlements before you show a paywall

Before the paywall appears, ask your own server whether the signed-in account already has an active plan from any platform. Show a sign-in prompt first, then the paywall only to accounts with no active plan.

Watch for two active plans on one account

Run a daily check for accounts with more than one active subscription across stores. Catching it in week one means a one-month refund instead of a three-month one, and a short email instead of a chargeback.

RefundHalt tracks App Store and Google Play subscriptions against your own account IDs, so a customer paying twice shows up as one person with two plans before their bank does.

Frequently asked questions

Why was a customer charged twice for the same subscription?
Usually because they bought it on two platforms, such as the App Store and Google Play, or a store and your website. Each store bills its own subscription and doesn't know about the other, so both renew until one is canceled.
Can I refund an App Store subscription for a customer?
No. Only Apple can refund App Store purchases. You can open Apple's refund sheet inside your app with StoreKit's beginRefundRequest, or point the customer to reportaproblem.apple.com. Apple says it takes up to 48 hours to approve or deny the request.
How do I refund a duplicate Google Play subscription?
Refund the order from Order management in Play Console, or call the orders.refund API. Refunding the most recent order removes the subscription immediately and cancels future recurrences. The API can't refund orders older than 3 years.
Does refunding a subscription also cancel it?
On Google Play, refunding the most recent order cancels future recurrences, but refunding an older order leaves the subscription active. On the App Store, a refund is Apple's decision and the customer cancels the subscription from their Apple account.
How do I stop users from subscribing twice across iOS and Android?
Attach your own account ID to every purchase, with appAccountToken on Apple and an obfuscated account ID on Google Play. Then check your server for an active plan on any platform before showing a paywall, and ask the user to sign in first.

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.