In-App Purchases with Capacitor: What I Learned Shipping youProof

This article is adapted from an X thread I posted in September 2024 about shipping youProof. The details below reflect that time. youProof never turned out to be a success, but I learned a lot along the way.
In July 2024, I released my first app, youProof, to the App Store and Google Play. It combined end-to-end encrypted, digitally signed business cards and digital profiles. The free version covered basic use; paid features sat behind subscriptions.
The app was built with Ionic/Capacitor. The backend was Supabase, with Edge Functions running on Deno. That combination worked well for most things, but in-app purchases turned out more annoying than I expected.
Starting with Apple
youProof was iOS-first (I daily-drive an iPhone), so I began with Apple’s system. The basic flow is familiar: create products in App Store Connect, the user buys something, the app receives a receipt, and you validate that receipt before unlocking anything.
If the purchase has ongoing costs on your side, validation belongs on the server. Apple’s libraries didn’t play nicely with Deno at the time. After enough trial and error I decided it was better to let someone else handle the complicated parts, especially since I also wanted the app on Android.
RevenueCat
I looked at a few services that manage in-app purchases and settled on RevenueCat. They had a Capacitor plugin and their pricing at the time felt reasonable (1% of revenue above a certain threshold).
The setup is straightforward:
- Create your products (subscriptions in my case) in App Store Connect and the Play Console.
- Connect those stores to your RevenueCat project.
- In the app, talk only to the RevenueCat plugin.
RevenueCat then sends webhooks to your backend for purchase, renewal, cancellation, and payment issues. There’s usually a short delay between a successful purchase and the webhook arriving, so plan for that.
They also handle the messy parts: receipt validation, cross-platform users, subscription transfers, and so on. Their documentation is solid enough that most questions are answered there.
Things I Learned or Struggled With
A few things that I didn’t immediately think of during that launch:
- Put a “Restore Purchases” button in the app. Apple requires it, and it also saves you support time when something goes wrong on the user’s side.
- You can link purchases to accounts in your own backend. Use the login function from the RevenueCat plugin with a user ID from your system; the webhook then includes that ID.
- Apple: even with everything else configured, you can’t properly test until you’ve signed the Paid Apps Agreement. You also need at least one build uploaded (not necessarily released) before you can set up in-app purchases.
- Android: you need to release at least one build (a closed testing track is enough) before you can configure in-app purchases.
- Testing: TestFlight and Xcode builds get purchases for free automatically. On Android you have to explicitly add the Google accounts allowed to make free test purchases. Subscription periods are also heavily shortened for testing.
- Both stores offer Small Business Programs that drop the fees from 30% to 15%.
Getting Through Review
Both Apple and Google initially rejected the app over in-app purchase issues.
With Apple, the review team can create test purchases (similar to TestFlight). But the products themselves must be approved first, and RevenueCat needs time to sync. If your app is rejected because products don’t load, ask them to review the in-app purchases before the app, or simply resubmit until it goes through.
Google wants the subscription terms spelled out directly on the offer screen, something short and clear is usually enough. They also won’t (or can’t) make test purchases themselves, so you need to provide a test account that can reach the paid features without actually buying. And don’t disable buttons that sit behind a paywall; on Android I ended up showing an alert instead. Hiding those buttons should probably work as well.
Closing Notes
That turned into a longer thread than I planned. RevenueCat took the worst of the receipt-validation and cross-platform pain away, which was worth it for a solo project that needed to work on both stores. If you’re building something similar with Capacitor or just want fewer surprises around subscriptions, their docs are a reasonable place to start.
At launch, youProof was free to try and available across the EU except France, and now it’s available in the USA as well: youproof.at.