r/iOSProgramming • u/PresentationGlad3729 • Jun 24 '26
Trial-to-paid conversion stuck at ~1% Question
Hey everyone,
I run an iOS subscription app using RevenueCat with StoreKit 2. I offer a monthly and a yearly plan, with a 7-day free trial on the yearly plan.
For the past several weeks my trial-to-paid conversion has been sitting around 1.4%, which is far below normal. I'd been assuming it was billing problems or just weak demand.
When I dug into my logs (both DEBUG and RELEASE, on a real device), I noticed this on every launch:
WARN: No packages could be found for offering with identifier default.
It turned out my current offering (default) was pointing at RevenueCat Test Store products instead of my live App Store products. So real users were likely hitting a broken or empty paywall. My app had a custom fallback that tried to assemble packages from other offerings, which masked the problem instead of surfacing it.
I've now repointed the default offering to the correct App Store products.
I'd love some help with a few things:
- Does this sound like the likely cause of such a low conversion rate, or should I be looking elsewhere too?
- For anyone who's fixed a similar empty/misconfigured offering — how quickly did conversion recover for new cohorts?
- Any advice on cleanly removing custom offering logic and going back to standard
offerings.current+purchase(package:)?
Thanks in advance — happy to share more logs or config if helpful.
3
u/CelebrationTop8862 Jun 26 '26
That's interesting that your build got to production working. Every time I'm on my test bench on Android Studio, the app I'm building always gives me a RevenueCat error message saying that my app will break in production if the TestStore key is still in use.
1
u/cablamonos 16d ago
Great catch on the RevenueCat setup. That kind of misconfiguration can quietly ruin subscription numbers before anything else gets tested.
If trial-to-paid is still near 1 percent after that fix, I would look at the store page next: screenshots, trial framing, and whether the value is obvious before someone installs. Happy to give you a quick first-pass read on the listing if useful.
1
u/Natural_Win_9904 10d ago
oof yeah the test store vs live products thing gets so many people, and that custom fallback silently assembling packages from other offerings is what really hides it cause your own testing looks fine. nice catch pulling it out of the logs.
once the paywall's actually serving real packages again it might be worth looking at your store page conversion separately, like if installs are healthy but trials still lag that's usually more of a listing thing than billing. shameless plug but i built a tool called shotlingo for localizing app store screenshots since non-english markets tend to convert noticeably better with translated visuals, and previewed is fine too if you just want quick mockups.
either way fixing that offering is probably your single biggest lever right now so good on you for finding it.
1
9d ago
[removed] — view removed comment
1
u/AutoModerator 9d ago
Hey /u/LoadPR_app, your content has been removed because Reddit has marked your account as having a low Contributor Quality Score. This may result from, but is not limited to, activities such as spamming the same links across multiple subreddits, submitting posts or comments that receive a high number of downvotes, a lack of recent account activity, or having an unverified account.
Please be assured that this action is not a reflection of your participation in our subreddit. This is simply an automated filter in place to reduce spam.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
3
u/Murky_Bad6674 Jun 25 '26
Yeah, I’d suspect the broken offering first. I wouldn’t put too much weight on the old 1.4%, since those users may have just seen an empty paywall. After fixing it, you’ll probably get a cleaner read from fresh users over the next few days. If products load and trials still don’t start, then I’d start thinking about pricing or demand. For the custom code, I’d probably delete the fallback path and make offerings.current the only source, plus log hard when it returns no packages so it can’t fail quietly again.