Payments / Purchases and access

A user paid for premium. Why is the app still locked?

A customer says they paid, but the premium screen stays locked. The first useful move is to check your own purchase and account records, then give them a clear update.

App Tech Partner editorial guideSources checked 4 October 2026

The short answer

Start with what you can verify internally: the store transaction, the product, the in-app account, its access permission (often called an entitlement), and the screen or server rule that enforces it. Record the first disagreement. Before requesting a receipt, check whether your own systems already show the purchase or a known delivery failure. Tell the customer what you are investigating and what happens next; do not imply access is restored until you have verified it.

What should you check before contacting the customer?

Many apps use a purchase service between the stores and the app. RevenueCat, used as the example in this guide, receives App Store and Google Play purchases and records which app account should have premium access. Search your store records and, if you use one, the purchase service for the relevant product, recent transactions, app accounts and known processing errors. Write down what you can confirm and what remains uncertain. Do this before asking an already frustrated customer to prove the purchase to you.

Then send a concise update: acknowledge that paid access is missing, explain that you are tracing the purchase to their account, and state the next action you will take. Do not suggest the customer caused the problem; even an account mix-up is something your sign-in and restore flow should handle. If your records cannot identify the transaction, ask privately for the store, approximate time, product name, app version and account used inside the app; a redacted order reference may help. Do not ask for card numbers, passwords, full receipts or purchase tokens in a public issue.

If the app has Restore Purchases, you can suggest it as an optional step after checking your records, while the customer is signed into the intended app account. Do not make restoration the only support response. RevenueCat’s restore guidance explains what a restore can and cannot repair. Verify ownership through the store or purchase service before moving access between accounts.

Diagram of store purchase, verification, app identity, entitlement and premium screen
A completed transaction is the beginning of the access check, not its final result. See RevenueCat’s entitlement model. Original diagram by App Tech Partner. On a narrow screen, swipe the diagram to see its full width.

Did the store complete the purchase?

Check the product and current transaction state using your store or purchase provider. On Google Play, grant the benefit only when a new purchase is PURCHASED; a PENDING purchase is not yet an unlock. Verify the purchase on a trusted backend before granting access. On iOS, StoreKit current entitlements help for auto-renewable subscriptions and non-consumable premium products. Consumables need a separate verified transaction and fulfilment check; do not assume they appear in that entitlement list. A bank notification or screenshot from the customer helps you search, but confirm the purchase in the store or provider records before changing access.

For a new purchase that is pending or failed, do not grant new access yet. A failed renewal needs a different check: an existing subscription may remain entitled during a billing grace period on Google Play or Apple. Do not revoke access from a payment-failure notice alone; inspect the current entitlement. If the purchase is completed and current, continue along the chain. For a completed Google Play purchase, also check acknowledgement: Google says unacknowledged purchases may be refunded after three days.

Decision tree for initial purchase states with a note about renewal grace periods
The diagram covers an initial purchase; an existing subscription can remain active during a renewal grace period. See Google’s lifecycle guidance. Original diagram by App Tech Partner. On a narrow screen, swipe the diagram to see its full width.

Which app account owns the premium permission?

Compare the product identifier with the feature the paywall promised. For a subscription or durable premium product using RevenueCat, attach the product to the intended entitlement; an unattached product can be purchased without unlocking that feature. Inspect CustomerInfo for the affected App User ID. The store account, an anonymous SDK ID and the login inside your app can be three different identifiers.

Illustrative mismatch, not a customer case: the store reports premium_monthly as purchased, while entitlement premium is active under anonymous ID A; the customer is signed into app ID B. That points to an identity-linking investigation, not an automatic transfer. RevenueCat’s login and alias rules determine how those records can be joined.

Illustrative identity mismatch with paid access on anonymous SDK ID A and current login on account B
An SDK identity mismatch can leave a verified buyer on a locked screen. Compare IDs using the provider’s identity rules. Original diagram by App Tech Partner. On a narrow screen, swipe the diagram to see its full width.

What if the entitlement is active but the screen stays locked?

Then inspect the app and backend gate. Does the premium screen read the same account and entitlement you just checked? Does it refresh after purchase, restore, sign-in and app restart? RevenueCat caches and updates CustomerInfo; calling getCustomerInfo() retrieves the latest available status. A stale screen should not send a verified buyer back through checkout.

Check a webhook only if your backend depends on it to update its own access database. A delivered event does not prove the right row changed or the app refreshed. RevenueCat webhooks can be retried, so handlers need authenticated, repeat-safe processing and reconciliation with current subscriber status.

How can you prove the repair worked?

In the relevant Apple or Google test environment, use a fresh account and record the build, product ID, app user ID, store state, entitlement result and premium-screen result. Purchase, close and reopen the app, then restore on the same account if your product supports it. Try a different app account to verify that access does not leak. Also test pending or failed and expired states so a fix does not grant access when the store has not completed payment. Google’s billing tests and Apple’s sandbox tests describe their environments.

A sandbox pass does not resolve the real customer’s case. Reconcile that person’s verified production transaction and explain the outcome privately.

Four paid-access test cases covering fresh purchase, restart, same-account restore and account switch
A compact test matrix for the access promise; adapt it to the product and store environment. Original diagram by App Tech Partner. On a narrow screen, swipe the diagram to see its full width.

Questions you may be thinking

Can a failed renewal still leave access active?

Yes. An auto-renewable subscription can remain entitled during a configured billing grace period. Check its current store or purchase-provider status before removing access.

Is the Apple or Google account the same as the login inside my app?

Not necessarily. A store account, anonymous purchase-service ID and your own app login may differ. Compare their mapping for the affected purchase before transferring access.

Can I test this without charging a real customer?

Yes. Apple sandbox and Google Play Billing test environments support purchase scenarios. Use the relevant test account and product setup; afterwards, reconcile the actual customer separately.

Sources

Apple and Google Play documentation describes the store side. The RevenueCat pages apply only if your app uses RevenueCat; if you use a different purchase service, check its own documentation for the equivalent records. They were checked on 4 October 2026; check the latest documentation before changing your app.

If a verified buyer remains locked out, ask a trusted mobile professional to trace the exact purchase journey and restore access responsibly. If you do not have one, Daniel can investigate one agreed blocker; send the redacted details in the form or email hello@apptechpartner.com.

Keep exploring

Why does my AI-built mobile app break again after every fix?

The assistant says “fixed.” You install the next build, and the bug survives or a nearby feature fails. Without a repeatable check, each patch is another guess.

Read the related guide ↗

Work with a person

Talk through your app with Daniel.

Share the outcome you want, where the app is today and the one issue that concerns you most.

Discuss your app ↗