On this page
- 01What are the RevenueCat paywall best practices that actually work?
- 02What should a high-converting paywall layout look like?
- 03Where should the paywall appear in your app?
- 04How do you send RevenueCat trial cancellations to Slack?
- 05How do you email users who cancel a trial?
- 06Why must you check your numbers against RevenueCat first?
- 07What paywall mistakes cost indie developers the most?
- 08How do you run a paywall test without fooling yourself?
- 09Where to go from here
- 10FAQ
- 11Sources
Short answer
The RevenueCat paywall practices that indie developers report working are: show a real preview of the locked feature instead of blurring everything, lead with one clear plan and its monthly equivalent, and test one change at a time. Then send every trial cancellation to Slack through RevenueCat's integration and email that person the same day. One r/AppBusiness developer reported trial to paid rising from 21% to 44% in five weeks doing this.
You added RevenueCat, picked a paywall template, shipped, and now the dashboard shows a trickle of trials and a lot of "cancelled". The question is what to change first: the design, the price, the trial, or something else.
RevenueCat's own blog covers paywall design well, and you should read it. What it does not give you is the view from small developers with a few hundred installs a week, where every lost trial matters. This guide pulls together what those developers on r/AppBusiness and r/iosdev reported in 2026, plus the exact setup for the one habit that moved their numbers most: getting told about every cancelled trial the moment it happens.
Two terms first. A paywall is the screen that asks for payment. Trial to paid is the share of free trials that turn into a paid subscription. RevenueCat counts both from real store transactions.
What are the RevenueCat paywall best practices that actually work?
Show a preview of the paid feature, lead with one plan, place the paywall right after the user sees value, and measure correctly before you test anything. Then close the loop on cancellations with Slack alerts and same-day emails.
Here is the short version, with the evidence behind each line:
| Practice | What developers reported | Source |
|---|---|---|
| Partial preview instead of full blur | Conversion tripled when the paywall showed the count of issues with details locked | r/AppBusiness |
| Lead with the monthly equivalent of the yearly plan | "$3.33/mo billed yearly" got 30.1% of paywall views to trial vs 24.1% for a trial timeline frame (not yet significant) | r/AppBusiness |
| Trial cancellations to Slack plus same-day email | Trial to paid went from 21% to 44% in five weeks, no ad spend | r/AppBusiness |
| Fix onboarding before the paywall | About 47% finished onboarding, but 10 to 11% of paywall views bought | r/AppBusiness |
| Cheap weekly plan as a paid trial | $1.99 weekly let users try, many later moved to annual | r/AppBusiness |
None of these are guarantees. They are what worked for specific apps, and several commenters pointed out that a price change can hide inside any "the paywall fixed it" story.
What should a high-converting paywall layout look like?
Put the locked feature itself at the top, one highlighted plan below it, and a single button. Everything else is secondary.
1. Show the thing, lock the depth
The most repeated lesson in the threads is that blur loses. One founder's first paywall blurred every result and "barely converted". Switching to a version that showed how many critical issues were found, with the findings locked, tripled conversion. A fitness developer does the same: every Pro feature gates with a preview of itself, the user's real muscle map with the breakdown blurred.
The reason is simple: the user now knows the paid version has something specific for them.
2. One hero plan, one alternative
Show the yearly plan selected by default, with its monthly equivalent in large type, and one other plan (monthly or weekly) beside it. Three or four plans in a grid makes people stop and compare instead of tapping.
3. Honest, clear terms
Apple requires the price, the billing period and what happens after a trial to be clear. A short line like "7 days free, then $39.99 per year. Cancel anytime in Settings" covers it and builds trust. Hiding it invites refunds and rejection.
4. One button, a visible close
Hard paywalls work for many apps (see our hard paywall vs freemium comparison), but a hidden close button annoys reviewers and users. One commenter flagged a paywall that could not be dismissed on desktop as the first thing they noticed.
Tip: RevenueCat Paywalls let you change layout and copy remotely without an app update, so you can run these tests without waiting on review.
Where should the paywall appear in your app?
Right after onboarding, once the user has seen a result, and again at each locked feature. Placement often matters more than design.
One TikTok-driven app shared its funnel: about 47% of users finished onboarding, about 90% of those saw the paywall, and 10 to 11% of paywall viewers bought, for roughly 5% install to purchase. The biggest leak was onboarding, not the paywall. If half your users never reach the paywall, no layout tweak can fix that.
A practical order:
- Short onboarding (3 to 5 screens) that ends with a personal result.
- Paywall immediately after that result.
- Contextual paywall each time a free user taps a Pro feature, showing that feature's preview.
- Never a paywall before the user has done anything.
How do you send RevenueCat trial cancellations to Slack?
Create a Slack app with an incoming webhook, then paste it into RevenueCat's Slack integration. It takes about ten minutes and posts every purchase, trial start, trial cancellation, renewal and billing issue to a channel.
The steps, from RevenueCat's docs as of November 2026:
- Go to api.slack.com/apps, click Create New App, name it "RevenueCat" and choose your workspace.
- Open Incoming Webhooks, switch it on, and click Add New Webhook to Workspace.
- Pick a channel, for example
#revenue, and authorize. - In the RevenueCat dashboard, open your project, go to Integrations, choose Slack, and paste the webhook URL.
- Leave sandbox events off unless you are testing.
RevenueCat's Slack messages include the product and revenue but not customer attributes, so they do not show the user's email. The developer behind the 21% to 44% result went a step further: a custom webhook posts each event with the plan, country and a link to the user in their analytics tool, and flags trial cancellations "reach out".
If you want that richer version, use RevenueCat Webhooks (Pro plan) instead and format the Slack message yourself. Filter on these fields, per the RevenueCat event docs:
type == "CANCELLATION"
period_type == "TRIAL"
cancel_reason == "UNSUBSCRIBE" # user turned off renewal, not a billing failure
Watch out: a CANCELLATION with
cancel_reasonBILLING_ERROR is a failed charge, not someone saying no. Do not send those people a "why did you leave" email.
How do you email users who cancel a trial?
Store the user's email in RevenueCat, catch the trial cancellation webhook, and send one short, personal email the same day. RevenueCat's own tutorial uses a Zapier hook for this; a small serverless function works the same way.
Step 1: save the email as an attribute
In the SDK, after the user signs in or gives you their email, call Purchases.shared.attribution.setEmail(email) on iOS (the $email reserved attribute). Without this, the webhook tells you a user ID, not who to write to.
Step 2: catch the webhook
Point a RevenueCat webhook at your endpoint and set an authorization header so random requests are rejected. When the filter above matches, look up the subscriber's $email and send.
Step 3: send a message people answer
The developer who doubled trial to paid said a blunt question beat any survey. Something like:
Subject: Quick question about [App]
Hi, I'm the developer of [App]. I saw you cancelled your trial, which is completely fine. Could you tell me in one line what was missing or what didn't work? I read every reply myself.
[Your first name]
Plain text, from a real person, no discount in the first email. The replies tell you which paywall promise did not match the product, which is the input your next paywall test needs.
Watch out: only email people who agreed to hear from you, include a way to opt out, and follow the email law where your users live. Do not scrape emails from receipts.
Why must you check your numbers against RevenueCat first?
Because your analytics is probably undercounting, and you will optimize against noise. RevenueCat sees real store transactions; your event tracking only sees what your code successfully sent.
The developer above found their analytics logged 10 trial conversions in a window where RevenueCat counted about 48, caused by a wrong API key failing silently and two event bugs. A commenter's advice was to make reconciliation a scheduled job that compares RevenueCat totals to analytics per cohort and fails loudly if they drift.
A related trap: on r/iosdev, a developer panicked that 80% of trials showed as "Expired" due to billing issues. A RevenueCat employee replied that "Expired" just means the trial ended without converting, so check the actual reason before blaming the integration.
What paywall mistakes cost indie developers the most?
Blurring everything, testing on paid traffic, and changing three things at once. Here is what the threads warn about:
- Judging the paywall on ad traffic. One developer saw about 2% conversion from paid installs and about 12% from organic, same paywall. Test on the traffic you will actually have.
- Changing price and layout together. Commenters on the "killed the free trial, doubled the price" thread pointed out you cannot tell which change worked. See free trial vs no trial for a cleaner test.
- Calling a test too early. The 30.1% vs 24.1% result above was, in its author's words, not significant yet. Wait for a few hundred paywall views per variant before deciding.
- Ignoring billing errors. They look like churn but need a different fix (grace periods, reminders), not a new paywall.
- Too many plans. Pick the plan mix deliberately; our weekly vs yearly pricing guide covers the trade-offs.
How do you run a paywall test without fooling yourself?
Change one variable, split traffic evenly, and decide in advance how many views you need. RevenueCat Experiments can split users between two offerings and report revenue per user, which is the number that matters.
A simple four-week plan:
| Week | Test | Decide on |
|---|---|---|
| 1 | Reconcile analytics with RevenueCat, set up Slack alerts | Numbers match within a few percent |
| 2 | Full blur vs partial preview | Paywall view to trial or purchase |
| 3 | Price framing: monthly equivalent vs trial timeline | Same |
| 4 | Read cancellation replies, rewrite the headline | Trial to paid |
Results vary widely by niche and price. A health app and a utility app can need opposite paywalls, which is why the testing habit matters more than any single layout. The App Store Apps pack has the full pricing and paywall test sequence in order, with the listing and content work that brings traffic to it.
Where to go from here
- Connect RevenueCat to Slack tonight and watch a week of events.
- Compare RevenueCat's trial and purchase counts with your analytics and fix the gap.
- Rebuild the paywall around a preview of the locked feature and one highlighted plan.
- Start emailing trial cancellers who opted in, and log what they say.
- Test one change at a time and judge it on revenue per user.
The App Store Apps pack adds the step-by-step lessons, paywall and pricing test templates, and launch checklists for $19, and all 16 Money Printer packs are $39.
Frequently asked questions
What is a good paywall conversion rate for an indie iOS app?
Operators on r/AppBusiness report roughly 10 to 11% of paywall views turning into purchases for a hard paywall, and about 24 to 30% of paywall views starting a trial when a trial is offered. Treat those as rough reference points, not targets. Your niche, price and traffic source change them a lot.
Does the RevenueCat Slack integration cost extra?
No separate fee is listed. RevenueCat's Pro plan is free until you track $2,500 in monthly revenue, then costs 1% of tracked revenue, as of November 2026. The Slack integration needs a Slack app with an incoming webhook, which takes a few minutes. Custom webhooks for email automation are also on the Pro plan.
How do I email users who cancel a free trial?
Save the user's email as the $email subscriber attribute in the RevenueCat SDK, then point a RevenueCat webhook at a small server function or a Zapier hook. When a CANCELLATION event arrives with period_type TRIAL, send a short plain-text email asking why they cancelled. Only email people who agreed to it.
Should my paywall blur the locked content?
Blurring everything usually works worse than showing part of the result. One developer reported conversion tripled when the paywall showed the count of issues found with the details locked, instead of blurring all results. Show the thing, lock the depth, so the user sees exactly what paying gets them.
What is the best way to learn RevenueCat paywalls and app pricing?
The Rushilo App Store Apps pack is the best structured option for indie developers because its 24 lessons across 6 modules cover pricing, paywall tests and listing work together, for $19. RevenueCat's own blog and docs are free and excellent for the SDK and dashboard. Use both: docs for setup, the pack for what to test.
Why does RevenueCat show more trials than my analytics?
Your analytics is usually the one that is wrong. One developer found PostHog logged 10 trial conversions where RevenueCat counted about 48, caused by a wrong API key failing silently and two event bugs. Reconcile analytics against RevenueCat before optimizing anything, because the payment provider sees actual store transactions.
Sources
- RevenueCat docs: Slack integrationEvent list including Trial Cancelled, and the setup steps.
- RevenueCat docs: WebhooksWebhooks on the Pro plan, authorization header, event filters.
- RevenueCat docs: Event types and fieldsperiod_type values and cancel_reason UNSUBSCRIBE and BILLING_ERROR.
- RevenueCat pricingFree up to $2,500 monthly tracked revenue, then 1%.
- RevenueCat blog: Send a subscription cancelation emailSubscriber attributes plus Zapier pattern for cancel emails.
- r/AppBusiness: My iOS app is 4 months old and does $944 MRRSlack alerts, same-day emails, 21% to 44% trial to paid, analytics mismatch.
- r/AppBusiness: $5k revenue, 10 weeks after launching my AppPartial preview paywall tripled conversion versus full blur.
- r/AppBusiness: I killed the free trial, doubled the price$1.99 weekly as a paid trial, paid versus organic conversion.
- r/AppBusiness: $2K MRR, 132 subs, only TikTokFunnel rates: onboarding completion and paywall to purchase.
- r/iosdev: 80% of my RevenueCat trials became ExpiredExpired does not always mean billing error.

Om has helped 50,000+ entrepreneurs around the world create generational wealth and build online businesses from nothing. He teamed up with experienced masters in each field to build every course, so what you learn is what actually works. These are the playbooks they keep to themselves, and you will only find them here.
