Skip to content
    Field notes

    RevenueCat vs Superwall: you are probably comparing the wrong things

    These two are not alternatives. One owns who is subscribed, the other owns what the paywall looks like — and picking one because you think it replaces the other is how apps end up rebuilding their billing layer twice.

    5 min read

    The most common mistake in mobile subscriptions is treating this as an either/or. People search "RevenueCat vs Superwall", read a feature table, pick the one with more checkmarks, and discover four months later that they bought a screwdriver when they also needed a hammer.

    They solve different problems. A lot of successful subscription apps run both.

    The short version

    RevenueCat answers "is this person subscribed?" It validates receipts, tracks entitlements across iOS and Android, survives reinstalls and device changes, and gives you one boolean you can trust.

    Superwall answers "what should this person see, and does it convert?" It hosts your paywall, lets you change it without shipping a build, and runs experiments on it.

    You need the first one. Whether you need the second depends on how much money is riding on your paywall.

    Why the entitlement layer is not optional

    The naive version of subscriptions looks simple: call StoreKit, get a purchase, unlock the feature. It stays simple for about a week.

    Then the real cases arrive. Someone subscribes on their iPhone and opens your app on their iPad. Someone reinstalls and expects their subscription back. Someone's card fails and Apple puts them in a billing retry state that is neither subscribed nor cancelled. Someone gets a refund. Someone's subscription is in a grace period. Someone upgrades from monthly to annual mid-cycle. Someone is in a family sharing group.

    Every one of those is a state your app has to get right, on two platforms whose APIs disagree about almost everything. This is what RevenueCat is: the part that turns all of it into one entitlement check that does not lie to you.

    It is free under $2,500 in monthly tracked revenue, then takes 1% of tracked revenue above that — calculated on gross, before Apple and Google take their cut. Worth knowing when you model it, because 1% of gross is meaningfully more than 1% of what lands in your account.

    Could you build this yourself? Yes. It is receipt validation, a server, webhook handling for six subscription lifecycle events per platform, and a state machine you will keep finding bugs in for a year. People do build it. Almost nobody who has built it recommends building it.

    What Superwall adds on top

    Superwall is not trying to be that. It is the presentation and experimentation layer.

    The problem it solves is release cadence. Your paywall is the single highest-leverage screen in the app — it is where the money is decided — and if it is compiled into your binary, every change to it is a code change, a build, a review, and a wait. That is a week per iteration on the one screen that matters most. Most teams iterate on it twice and then never again.

    With Superwall the paywall is remote. You edit it in a dashboard, split traffic across variants, and read results without shipping anything. Headline, layout, imagery, social proof, price points, monthly-versus-annual framing, trial-versus-no-trial — all testable on live traffic. It is freemium, with paid tiers that scale as you grow; check their current pricing, since the tiers move.

    That is worth real money if your paywall sees meaningful traffic. It is worth very little if you have 40 users, because you will not reach significance on any test you run and you will spend your time reading noise.

    How they fit together

    RevenueCat Superwall
    Owns Entitlement state Paywall UI and experiments
    Question it answers Is this person subscribed? What should they see?
    Change without a release N/A Yes, that is the point
    Can you skip it Not really Until traffic justifies it

    The common production setup is both: Superwall presents the paywall and runs the experiment, the purchase completes through StoreKit, and RevenueCat records the entitlement and remains the source of truth your app checks. They are designed to coexist, and the integration between them is well-trodden.

    The one rule that makes running both painless: never let the presentation layer own the access decision. If you have already chosen and want the implementation detail, wiring the two so the paywall and the entitlement can change independently is its own post.

    What to actually do

    Pre-launch, or under a few thousand users: RevenueCat alone. Build one good paywall in your app. You do not have the traffic to test anything, and the complexity of a second service buys you nothing yet.

    Once the paywall sees real traffic: add Superwall. The moment a 10% lift in conversion is worth more than the integration cost, the argument makes itself.

    If you are already shipping and iterating on the paywall by hand: you are paying for Superwall in engineering time and release latency. You just are not paying it to Superwall.

    The part that catches people

    Whichever you choose, the wiring is not the fun part, and it is where launches slip.

    The entitlement check has to be available everywhere in the app without turning into a global. Purchase restoration needs a path — Apple rejects apps that do not offer it. The paywall needs to handle the cancelled purchase, the failed purchase, the pending purchase and the "already subscribed" case without a dead end. Sandbox testing behaves differently enough from production to eat a day on its own. And the whole thing has to survive the app being killed mid-purchase.

    This is a week of work that produces nothing a user will ever praise, and it has to be right before you can take a single payment.

    ShipAppFast ships it already done. RevenueCat is connected, Superwall is supported, the paywall is designed and handles every one of those states, restoration works, and the entitlement is available through Riverpod wherever you need it. You switch on payments by adding your keys, not by building a billing layer.

    shipappfast.site