Blog

Guides for subscription app developers

Paywalls that convert, step-by-step SDK tutorials, App Store and Google Play server setup, refunds and web checkout, with a source for every number. Posts are Markdown in the revenuedot/docs repository on GitHub.

2026-11-09Google Play pending purchases: how to handle themHow to handle Google Play pending purchases: enable them, keep access locked until payment clears, acknowledge at the right time, and catch the result on your server. 2026-11-09How to get App Store transaction history in Node.jsFetch a customer's App Store purchases from your server with Apple's Node.js library: the API key, the V2 endpoint, paging, filters, rate limits and common errors. 2026-11-09Leave RevenueCat with a Flutter or React Native appHow a Flutter, React Native or Expo app on both stores moves off RevenueCat: what it costs at $30K to $100K a month, the code change, the dual run and the risks. 2026-11-02Apple win-back offers: setup, eligibility and StoreKit codeHow App Store win-back offers bring back lapsed subscribers: the eligibility rules, setup in App Store Connect, StoreKit 2 code, sandbox tests and Google's equivalent. 2026-11-02How to sell credits in an AI app with in-app purchasesSell AI credits as consumable in-app purchases on iOS and Android: Apple's no-expiry rule, Google's 3-day consume rule, a server ledger, spending and refunds. 2026-11-02Why in-app products fail to load on iOS and AndroidStoreKit returns no products, Play Billing returns unfetched products, or offerings come back empty. The causes on each store, in order, and how to find yours. 2026-10-26Google Play Billing Library 8: deadline and migrationPlay rejects app updates on Billing Library 7 since August 31, 2026, with extensions to November 1. What changed in version 8 and the SDK versions to pick. 2026-10-26How to look up an in-app purchase by order IDA customer sends an App Store or Google Play order ID. How to find the purchase with Apple's Look Up Order ID and Google's Orders API, and give back access. 2026-10-26What happens if your in-app purchase vendor shuts downSubscribers keep paying Apple and Google when a vendor like RevenueCat or Adapty closes. What breaks in your app, the data you lose, and six steps to take now. 2026-10-19How to export your data from RevenueCatRevenueCat has four exports: scheduled transaction files, customer CSVs, chart CSVs and a support-made migration file. What each holds and which one a move needs. 2026-10-19How to handle Google Play refunds and chargebacksGoogle tells you about a refund through a voided purchase notification and the Voided Purchases API. How each works, when to remove access, and how to refund from your server. 2026-10-19How to handle StoreKit 2 Transaction.updatesStart one Transaction.updates listener at launch, verify each transaction, grant access, then call finish(). Code, Ask to Buy, refunds and what to do when the app is closed. 2026-10-02Apple's Retention Messaging API: setup, approval and offersHow Apple's Retention Messaging API shows a message or offer on the App Store cancel screen, what approval you need and how to set it up in RevenueDot. 2026-10-02Billing grace period and account hold: recover failed renewalsHow Apple and Google handle a failed renewal: grace period, billing retry and account hold. See both timelines, the events to watch and how to keep subscribers. 2026-10-02Do you still need RevenueCat with StoreKit 2?StoreKit 2 handles purchases on the device. See what it covers, what still needs a server, and how to choose between building, RevenueCat and open source. 2026-10-02Flutter in_app_purchase vs purchases_flutter: which to usein_app_purchase talks to the stores and leaves verification to your own server. purchases_flutter works with a backend such as RevenueCat or RevenueDot. Code side by side, cost, and when each one fits. 2026-10-02Google Play base plans and offers explained for iOS developersA Google Play subscription holds base plans and offers. See how they map to iOS groups, products and offers, how eligibility works, and how to buy one. 2026-10-02How to check free trial eligibility on iOS and AndroidShow "Start free trial" only to users who can get it: Apple's one-trial-per-group rule, Google Play offers, StoreKit 2 and RevenueCat SDK code, and button text. 2026-10-02How to price a subscription app in 2026: plans, trials, regionsPrice a subscription app with data: median prices, plans, trial length, regional pricing, price increase consent on both stores, and how to test prices. 2026-10-02How to reduce subscription churn: voluntary and involuntaryCut subscription churn with a billing grace period, a cancellation flow with an offer, Apple Retention Messaging and win-back campaigns, set up in RevenueDot. 2026-10-02How to sell a lifetime purchase next to a subscriptionA lifetime plan is a non-consumable on iOS and a one-time product on Google Play, never part of a subscription group. Attach it and your subscriptions to one entitlement, then handle subscribers who buy it, refunds, Family Sharing and restore. 2026-10-02How to share one subscription across iOS, Android and the webGive each customer one account ID, attach every store's product to one entitlement, and check the entitlement before you sell. What Apple 3.1.3(b) and Google Play allow, how to avoid double billing, and code. 2026-10-02iOS promotional offers: how the signature works and how to signPromotional offers need a signature from your server. See the seven signed fields, a Node.js example, the StoreKit 2 call and how RevenueDot signs it. 2026-10-02iOS subscription offer codes: create, redeem and trackHow App Store offer codes work for subscriptions: create one-time-use or custom codes, share them, redeem them in your app, and track every redemption. 2026-10-02Migrate from Adapty to an open-source backend (RevenueDot)Move an app from Adapty to RevenueDot: swap the SDK, re-sync active subscribers from store receipts, reroute store notifications and run both side by side. 2026-10-02Migrate from Qonversion to an open-source backend (RevenueDot)Move an app from Qonversion to RevenueDot: swap the SDK, rebuild the catalog, re-sync active subscribers from receipts and run both backends side by side. 2026-10-02Move off Superwall: keep its paywalls or replace themSuperwall is a paywall layer plus a subscription layer. Learn how to move the backend to RevenueDot, replace the paywalls, or do both, and what each path costs. 2026-10-02Paywall A/B testing: what to test, sample size, resultsWhat to test first on a paywall, how many customers each variant needs, how long to run and how to read chance to win, using RevenueDot experiments. 2026-10-02react-native-iap vs expo-iap vs react-native-purchases: which to usereact-native-iap and expo-iap talk to the stores and leave verification to a server you pick. react-native-purchases works with a backend such as RevenueCat or RevenueDot. Expo Go, code, cost and fit. 2026-10-02Restore purchases on iOS and Android: what App Review wantsApple guideline 3.1.1 asks for a restore mechanism. When to call AppStore.sync, why Google Play has no restore button, restorePurchases vs syncPurchases, who owns a restored purchase, and how to test it. 2026-10-02Subscription app metrics that matter: MRR, churn, LTV and moreThe subscription app metrics to track: MRR, churn, trial conversion, LTV and refunds. Plain definitions, worked examples, benchmarks and a link to every chart. 2026-10-02Subscription upgrades and downgrades: iOS levels, Play prorationHow subscription upgrades, downgrades and crossgrades work: iOS subscription groups and levels, Google Play replacement modes, proration, code and events. 2026-10-02Test in-app purchases: StoreKit, sandbox, TestFlight and PlayTest subscriptions without real money: StoreKit configuration files, sandbox accounts, TestFlight, Play license testers and a Test Store with no store at all. 2026-10-02Web-to-app funnels: quiz, checkout and app accessHow to build a web-to-app funnel: an ad, a quiz, Stripe checkout, then a redemption link that gives the app access, with Meta and TikTok attribution. 2026-10-01Add subscriptions to a SwiftUI app: StoreKit 2 and RevenueDotAdd auto-renewable subscriptions to a SwiftUI app: App Store Connect setup, the RevenueDot SDK, a paywall, purchase, restore and server notifications. 2026-10-01Android subscriptions with Google Play Billing, Kotlin and RTDNAdd Google Play subscriptions to an Android app in Kotlin: Play Console setup, a service account, real-time notifications on Pub/Sub and the RevenueDot SDK. 2026-10-01App Store Server Notifications V2: setup and notification typesSet up App Store Server Notifications V2, verify the signed payload, and learn every notificationType and subtype Apple sends and how RevenueDot handles each. 2026-10-01Apple free trial toggle rejection: what to ship instead (2026)Apple rejects paywalls with a free-trial on/off switch under guideline 3.1.2, and onboarding rating prompts under 5.6.3. Here is what to ship instead. 2026-10-01Apple refund requests: CONSUMPTION_REQUEST and how to answer itWhen a customer asks Apple for a refund, you get 12 hours to send consumption information. See what CONSUMPTION_REQUEST asks, what to send and Refund Control. 2026-10-01Flutter in-app purchases and subscriptions with purchases_flutterAdd in-app purchases to a Flutter app with the RevenueDot SDK (purchases_flutter): install, configure, offerings, purchase, restore and testing. 2026-10-01Free trial timeline paywall: why it works and how to build itA "how your free trial works" timeline paywall lifted trial conversions 23% for Blinkist and lifetime value 50% for Pepper. Here is why, and how to build one. 2026-10-01Hard paywall vs freemium: conversion and revenue dataHard-paywall apps convert 10.7% of users by Day 35 and freemium apps 2.1%. See the revenue, refund and retention data, and when freemium is still right. 2026-10-01Multi-page paywalls vs single page: the 2026 data and layoutMulti-page onboarding paywalls converted 12.41% against 9.07% for single pages in Superwall's 2026 data. See the data, the layout, and how to build one. 2026-10-01Onboarding quiz before a paywall: steps, order and why it worksThe long onboarding quiz before a hard paywall, the Cal AI pattern: how many steps, in what order, and why a plan reveal right before the paywall helps. 2026-10-01Paywall best practices for 2026: what the data saysThe paywall pattern that wins in 2026 is a long quiz, a plan reveal and a hard paywall in two pages with a trial timeline. Here is the data behind each part. 2026-10-01Paywall exit offers: discount after a cancelled purchaseTransaction-abandon offers made 17% of total revenue in Superwall's study, with fewer refunds. See how exit offers work, the App Store rules and how to build one. 2026-10-01React Native and Expo subscriptions with react-native-purchasesAdd subscriptions to a React Native or Expo app with the RevenueDot SDK (react-native-purchases): dev build, configure, purchase, restore and testing. 2026-10-01RevenueCat pricing in 2026, explained (and how to pay less)RevenueCat is free to $2,500 a month, then 1% of all tracked revenue, before store fees. See the bill at $5K to $1M and three ways to pay less. 2026-10-01Self-hosting an in-app purchase backend: when, cost, how to runSelf-host an in-app purchase server with Docker Compose and Postgres. See when it makes sense, what a small VPS costs, data residency, backups and upgrades. 2026-10-01Selling iOS subscriptions on the web with Stripe in 2026Since the 2025 US ruling, iOS apps can link to web checkout. See the court timeline, the fee math and a Stripe web-to-app flow with redemption links. 2026-10-01Server-side in-app purchase validation: App Store and Google PlayValidate in-app purchases on your server in 2026: Apple's App Store Server API and signed JWS, Google's subscriptionsv2, and whether to build or use a server. 2026-10-01Weekly vs annual subscriptions: which earns more in 2026Weekly plans earn 55.5% of subscription revenue in Adapty's 2026 data, but annual still wins in health and fitness. See the numbers and how to show both. 2026-09-30 2026-09-30How RevenueDot stays compatible with the RevenueCat SDKThe endpoints the SDK calls, the customer info it decodes, the 4xx/5xx rule that protects purchases, the contract tests, and response signing byte by byte. 2026-09-30 2026-09-30Introducing RevenueDot, an open-source backend for in-app purchasesRevenueDot is an open-source backend for in-app purchases that works with the RevenueCat SDK, free to start on RevenueDot Cloud. Here is why we built it, and what it does today. 2026-09-30 2026-09-30Migrating from RevenueCat without losing a subscriberThe safe order for moving to RevenueDot: import customers and keep your public keys, forward store notifications to run both systems, verify, then switch with an app update. 2026-09-30 2026-09-30Self-host RevenueDot in 5 minutesStart RevenueDot with Docker Compose, seed a Test Store project, make a first purchase with curl, receive the webhook on your laptop, and turn on response signing. 2026-09-30 2026-09-30Why we forked the RevenueCat SDKsRevenueDot maintains MIT forks of all ten RevenueCat SDKs. What the patches change, why every import name stays the same, and how one script keeps the forks in sync with upstream.