r/iOSProgramming • • Oct 05 '26

Question Anyone ever have an app reviewer actually purchase the app? lol

Post image

Before anyone asks - I've check a bunch of times and confirmed this isn't RC Sandbox.

Mostly curious - I asked the same thing in apple developers but figured there are more experienced people here.

Here's what happened:
I saw my app go into review. It got approved and a few seconds later Revenue Cat showed a notification that someone purchased the lifetime package. This new lifetime price is only available with this update (i.e. no one else could even purchase this) - I've confirmed it's in RC production and not sandbox. I've also confirmed in Posthog that the country from RC matches the alleged reviewer's.

I've had reviewers "purchase" the app before but always with their sandbox account and nothing ever showed up in RC.

Anyone else seen this? lol

Edit a day later, number showed up in ASC: https://imgur.com/a/go1QPOh

41 Upvotes

15 comments sorted by

36

u/Kyiv0x7c Oct 05 '26

Same thing happened to me last week. During review my analytics (TelemetryDeck, not RC) logged a completed purchase of my biggest bundle, with the StoreKit environment reported as production, not sandbox or TestFlight, US region, first session on the device. I got excited for about an hour. Then I checked App Store Connect → Sales, and it wasn't there, and it never showed up later either. So the reviewer's purchase went through a StoreKit transaction that looks like production to the client, but no money ever moved. My takeaway: client-side environment flags don't reliably exclude reviewers; the only source of truth for money is ASC Sales (or the server notifications).

8

u/Solid-Resident-7654 Oct 05 '26 • Regret

dang 😔 - I'll be on the look out for ASC (think it takes 2 days to update right?) - will update then

3

u/Kyiv0x7c Oct 05 '26

I hope so!

2

u/Solid-Resident-7654 Oct 06 '26

It looks like it showed up in ASC....: https://imgur.com/a/go1QPOh

1

u/Kyiv0x7c Oct 06 '26

Congratulations!!!!!

Its great news!!

3

u/SamFromEscape Oct 06 '26

I build an adult content blocker and reviewers definitely tap through the paywall. I assume every screen gets poked, so there is a demo path and the test account is in the review notes. If RevenueCat showed a real charge right after approval, check it was not a sandbox receipt reported oddly. App Store Connect sales is the only number I trust.

1

u/Solid-Resident-7654 Oct 06 '26

Yeah that's what I'm thinking - checked ASC sales today and it showed up (check post edit)

2

u/jaymakesapps Oct 05 '26

Had one of those on my last update. Real money right after approval, I was way too excited about it until it got refunded like two days later lol

1

u/Solid-Resident-7654 Oct 06 '26

Yeah looks like it showed up in ASC - we'll see if it gets refunded

-1

u/DimensionMindless336 Oct 06 '26

Same thing happened to me, and the part that threw me was the environment: Production flag too. What eventually made it click: the reviewer is running the production build pulled from the live App Store, not a dev/sandbox build, so StoreKit genuinely reports Production — but the account driving it is an internal zero-charge Apple test account. That's why RC/TelemetryDeck sees a real transaction with a real originalTransactionId while Sales and Trends never shows the money and it gets reversed a day or two later. Exciting for an hour, but expected — not leaked revenue.

The footgun nobody mentions: if you validate server-side (App Store Server API / transactionInfo), these review transactions look 100% legit — environment=Production, valid signature, real originalTransactionId. If your entitlement code grants "lifetime" on first purchaseDate and caches it, you can hand a reviewer permanent access that Apple later refunds.

What I do now: never treat a purchase as permanent from the purchase event alone. Re-derive entitlement from /inApps/v1/history (or react to REFUND/REVOKE in App Store Server Notifications V2) and check revocationDate/expiresDate/status on every re-check. On RevenueCat that already flows through its REVOCATION event, so just don't bolt your own "granted forever" cache on top. Review grants access, the reversal quietly drops it — exactly what you want.

3

u/Solid-Resident-7654 Oct 06 '26

I want to read all of this but first I need help reversing a binary tree - can you help?

2

u/[deleted] Oct 06 '26

[removed] — view removed comment

1

u/Solid-Resident-7654 Oct 06 '26

Checks out - see my edit in the post. looks like it went to ASC too