Skip to content

In-app purchase problem

Why did a user pay in my app but not get premium?

A user writes in with a receipt from Apple or Google, and the app still shows the free plan. On Android, an unhandled purchase can even be refunded on its own a few days later. The store took the payment; the gap is in how the app records and checks it. Here’s what Apple, Google and RevenueCat say, in their words, and what to check, or hand it over at a fixed price.

Rather hand it over? App Fix Ticket: One reproducible bug in an existing mobile or web app, diagnosed and fixed.

Full refund if Simon can’t take it on once he sees your project, or if you cancel before work starts. Refund terms.

Short answer

Check that the app completes every purchase after unlocking it (finish on iPhone, acknowledge on Android within three days), listens for purchases that finish while the app is closed or later, such as Ask to Buy and pending payments, has a working Restore Purchases button, and, with RevenueCat, that each product is attached to the entitlement the app checks and the user is signed in as the same customer.

Rather not fix it yourself? App Fix Ticket starts with a fixed-price diagnosis, then a fixed price for the fix before any fix work.

Why premium didn’t unlock, and the fix

  1. 01

    Android: the purchase was never acknowledged

    “must be done within three days so that the purchase isn't automatically refunded and entitlement revoked.” Android Developers, Integrate the Google Play Billing Library into your app

    After a purchase, the app has to tell Google it was processed. If the app doesn’t do that within three days, Google refunds the purchase automatically and removes access. On iPhone, the matching step is to finish the transaction once the content is unlocked.

  2. 02

    The app only checks at the moment of purchase

    “Without the Task to listen for these transactions, your app may miss them.” Apple, Transaction.updates

    Some purchases complete later or outside the app: a parent approving Ask to Buy, an offer code, or a purchase made in the App Store. The app has to listen for new transactions while it runs and check again when it opens.

  3. 03

    Android: the payment was still pending

    “Only grant entitlement when the purchase transitions from PENDING to PURCHASED.” Android Developers, Integrate the Google Play Billing Library into your app

    With some payment methods the purchase stays pending until the user finishes paying, even after the app is closed. The app should unlock premium once the purchase turns into a completed one, and look for completed purchases when it opens.

  4. 04

    RevenueCat: the product isn’t attached to the entitlement

    “Failing to add your products to an entitlement, could lead to your users making purchases that don't unlock access to the promised content.” RevenueCat, Entitlements

    The app unlocks premium when an entitlement is active, and an entitlement only turns on for the products attached to it. A new product that was never attached unlocks nothing. Check the entitlement’s products in the RevenueCat dashboard.

  5. 05

    RevenueCat: the user is a different customer now

    “the cache will be cleared and a new random anonymous App User ID will be generated” RevenueCat, Identifying Customers

    An app that uses RevenueCat’s anonymous IDs gets a new one after a reinstall, so the purchase belongs to the old ID. Sign users in with your own account ID. Otherwise a user can tap Restore Purchases, and whether RevenueCat moves the purchase to the new ID depends on the transfer behavior setting in your project.

  6. 06

    There is no Restore Purchases button

    “Include some mechanism in your app, such as a Restore Purchases button, to let users restore their Apple In-App Purchases.” Apple, AppStore.sync()

    Apple says to include a Restore Purchases button so users can restore their purchases. Apple also says a reinstalled app or a new device gets all transactions automatically on first launch, so the button matters most when a user thinks something is missing.

Checked against the vendor’s docs on : Android Developers: Integrate the Google Play Billing Library; Apple docs: Transaction.updates; Apple docs: finish(); Apple docs: AppStore.sync(); RevenueCat docs: Entitlements; RevenueCat docs: Identifying Customers; RevenueCat docs: Restoring Purchases.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

“Very responsive, attentive to fixing bugs, and completed the project as needed! Thank you!”
A buyer in the United States, July 2022. Shopify on Fiverr
All 127 Fiverr reviews

Related: RevenueCat products could not be fetched · App Store Guideline 3.1.1 in-app purchase · Google Play Billing Library deprecated · Stripe paid but account not upgraded

Questions

More on this error

Does a user lose the purchase when they get a new iPhone?

No. Apple says that when users reinstall the app or download it on a new device, the app has all transactions available to it on first launch. The app still has to read them and unlock premium.

Should the app restore purchases every time it opens?

No. Apple says that in regular operations there’s no need to call sync(); keep it for a Restore Purchases button the user taps.

Can a purchase on iPhone unlock premium on Android?

Yes, if the app uses RevenueCat and signs the user in with the same App User ID on both. RevenueCat says that when the user logs in on multiple devices, you can honor a subscription purchased on one device across any other platform.

Can you fix it for me?

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.

A different error?

Describe it and get a written quote

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.