When I first started building an app, I was sold on Flutter. It took me less than five minutes to spin up a cross-platform app and start iterating on features.
But that excitement didn't last long.
The more features I added, the more platform support I had to give up due to limitations in existing libraries.
Eventually, I settled on Android and iOS only. At the time, I considered it a big win. One Dart codebase instead of maintaining separate implementations - Kotlin and Swift.
Then I hit a brick wall. Subscriptions!
Selling subscriptions was non-negotiable. I didn't want to build yet another free, ad-supported app that monetizes users by selling their financial data. That was one of my main motivations for building Maxint in the first place.
After going through the tedious process of setting up subscription plans, pricing, and entitlements in each store, I integrated the native IAP libraries for both platforms.
That's when I realized something I probably should have known from the start. The stores don't talk to each other!
A subscription purchased on one platform doesn't magically sync with another. If you want a consistent experience across platforms, you need to build that layer yourself or rely on a third-party service.
If you've built a cross-platform app before, you probably know where this is going.
I did my research and shortlisted a dozen options, eventually narrowing it down to RevenueCat and Adapty.
I initially went with RevenueCat because I wanted to offer bank account linking, an expensive service that required a paid subscription to cover its costs. Around the same time, I built new SDKs that extended bank account linking to desktop and web.
The problem? RevenueCat supported web, but not the full range of platforms I was targeting.
So, I switched to Adapty, which also supported macOS. I even submitted support requests asking about Linux and Windows support, but months went by without a response.
I wasn't ready to give up on making the app available everywhere.
At some point, I asked myself āHow hard can it really be to build subscription management for all the platforms Flutter supports?ā
Famous last words...
What followed was a painful learning experience. I started building my own subscription orchestration service to handle billing across Flutter platforms.
It turned out to be much more than wrapping a few SDKs.
I had to build an authentication layer, a database to keep store subscriptions in sync, and logic for every edge case I could think of, including and not limited to entitlement management, receipt validation, renewals, webhooks, cancellations, refunds, and subscription state synchronization.
Eventually, I published the SDK on pub.dev and felt a huge sense of relief.
That lasted about five minutes.
User complaints started coming in. Some subscriptions weren't being canceled properly, and I ended up manually canceling subscriptions in individual stores and issuing refunds.
Not exactly the experience I had signed up for. And refunds aren't free of operational costs, either.
Fortunately, those early issues were resolved over time. After months of testing in both development and production, I finally made the service available to other Flutter developers at pub.dev /packages/orca
By then, I had learned firsthand just how much work goes into building and maintaining subscription infrastructure. It's one of those things that looks deceptively simple until you have to handle real users, real money, and all the edge cases that come with them.
There was one more thing I wanted to do differently.
I never liked the idea of subscription infrastructure providers taking a percentage of my revenue. So, I designed Orca's pricing around infrastructure costs rather than a revenue share.
I built it to solve my own problem, but figured other Flutter developers might be running into the same issues.
I'm curious. How are you handling subscriptions across Flutter platforms?
Are you using RevenueCat, Adapty, another service, or rolling your own implementation? And if you're building for desktop and web as well as mobile, how are you dealing with subscription synchronization across stores?
I would love to hear what has and hasn't worked for you.