Skip to content
Tech Stack7 August 2026 · 10 min read

Flutter + Firebase for SaaS Mobile Apps in 2026

A Flutter and Firebase SaaS stack gives you six platforms from one Dart codebase and leaves two genuinely hard problems: tenant isolation and billing. What that costs in 2026.

Flutter + Firebase for SaaS Mobile Apps in 2026

Flutter + Firebase for SaaS Mobile Apps in 2026

A Flutter and Firebase SaaS stack buys you one Dart codebase across six platforms and a backend you never provision. It leaves you two problems that are genuinely hard: tenant isolation and billing.

I have been running that stack in production on BookBed, the property management SaaS I built solo, since October 16, 2025. The same Dart code compiles to iOS, Android, Web, macOS, Linux and Windows. Firestore holds the data, Cloud Functions handle anything money touches, Stripe takes the payment. Six months and forty-plus screens later, the parts that hurt were not the parts the tutorials warn about. Nobody warned me that the deep-linking product Google recommended in every Flutter tutorial would be returning HTTP 404s before the app turned one.

So this post covers what a Flutter and Firebase SaaS mobile stack actually contains, where Firebase quietly bills you, the one architectural decision you cannot undo, and the two things that changed in the last twelve months that most Flutter SaaS advice has not caught up with.

What Does a Flutter + Firebase SaaS Stack Actually Include?

A stack of cream index cards fanned into a tilted column on a wooden desk, one card slipped loose in front with a dog-eared corner and a grey thumbprint

A production Flutter and Firebase SaaS needs six layers: auth with tenant claims, a tenant-scoped datastore, server-side functions, a billing broker, message delivery, and crash telemetry. Miss one and it surfaces as an incident rather than a missing feature.

  • Auth. Firebase Authentication, with a custom claim on the token naming the tenant. Apple Sign-In becomes mandatory on iOS the moment you offer any other social provider, so budget for it before you ship, not during review.
  • Data. Cloud Firestore for document-shaped data, or Firebase SQL Connect when the domain is genuinely relational.
  • Server. Cloud Functions. Every webhook, every privileged write, every claim mutation. The client never writes its own subscription status.
  • Billing. RevenueCat, Stripe, or both. People get this one wrong, and not in the way they expect.
  • Delivery. Firebase Cloud Messaging for push, plus a transactional email provider. BookBed runs eighteen-plus Resend templates alongside FCM, because a booking confirmation is an email problem and a check-in reminder is a push problem.
  • Telemetry. Crashlytics. A Flutter crash on a mid-range Samsung is otherwise invisible to you.

What is missing from that list is a state-management library, and the omission is deliberate. Riverpod, Bloc, Provider — pick one and stop reading comparison posts. None of them is why a SaaS fails.

Firestore, SQL Connect, or Supabase for a Firebase SaaS Backend?

Three brass keys with visibly different cuts laid in a row beside a heavy matte-grey padlock on beige paper, lit by hard raking light

Pick Firestore when your data is document-shaped and your queries are known in advance; pick SQL Connect when you need joins, aggregates, or window functions.

This question is live again because Firebase Data Connect was renamed Firebase SQL Connect at Cloud Next on April 29, 2026, picking up realtime query subscriptions through an @refresh directive, offline caching, and the option to drop raw SQL into .gql operation files (Firebase blog). Operations were repriced to $0.90 per million from May 1, down from $4.00, with 250,000 free per month on Blaze. Managed Postgres with realtime subscriptions inside the Firebase console is a materially different offer than it was a year ago.

OptionBest whenFree tierWhere it hurts
Cloud FirestoreDocument-shaped data, offline-first mobile, query paths known at design time50K reads, 20K writes, 20K deletes per day, 1 GiB storedNo joins; per-read billing punishes list screens
Firebase SQL ConnectRelational domains, reporting, joins across a tenant's own records250K operations/month, 90-day Cloud SQL trialYou now pay for a Cloud SQL instance that does not scale to zero
SupabaseYou want Postgres with row-level security and will leave the Firebase console500 MB database, two free projectsFlutter offline support is thinner; you rebuild the FCM and Crashlytics equivalents

Firestore quotas above come from Firebase pricing. The number that catches people is reads, not writes. A dashboard rendering a list of forty bookings costs forty reads every time someone pulls to refresh, and a 50,000-a-day allowance evaporates faster than you would guess once a handful of tenants develop a refresh habit.

Multi-Tenancy Is the One Thing You Cannot Retrofit

A hand pressing a bowing wooden divider down into a drawer compartment already packed full of paper clips, with several clips spilled into the neighbouring slot

Put the tenant ID in the document path before you write your first screen, because moving it there later means migrating every document, index, rule and query at once.

Firebase documents the mechanism: a custom claim on the auth token, read back inside Security Rules as request.auth.token.<claim> (Firebase docs). For a tenant boundary that becomes a tenant_id claim compared against the tenant segment of the path, and writing it is an afternoon of work. The part that trips teams is subtler. Google's own wording is that "security rules are not filters — queries are all or nothing," and Firestore evaluates a query against its potential result set rather than the documents it would actually return (Firestore docs). A collectionGroup query spanning tenants therefore does not quietly hand back the caller's own subset. It is denied outright.

Actually, that undersells the consequence. The tenant ID has to live in the query as well as the rule, which means it has to live in the path or an indexed field, which means the decision is made at schema-design time and then enforced by every read you ever write. There is no version of this you bolt on in month four.

The cost of getting it wrong does not arrive on day one. It arrives the day you add your first cross-tenant admin screen, reach for collectionGroup because nothing else works, and write a rule to permit it that is broader than the rule it replaced.

Do You Need RevenueCat for a Flutter Subscription App?

RevenueCat earns its place the moment you sell on both App Store and Play, because cross-store receipt validation and subscription reconciliation is a real backend product.

It is free up to $2,500 in monthly tracked revenue, then 1% of tracked revenue (RevenueCat pricing). Several comparison posts still quote a $99-a-month Grow tier that the first-party pricing page does not list. Check any RevenueCat number you read elsewhere against that page.

ApproachSetup costOngoing costCovers
in_app_purchase package, directHigh. You build receipt validation, renewal handling and grace-period logic yourselfStore commission onlyiOS and Android only
RevenueCatLow. SDK plus a dashboard entitlement modelFree to $2,500 MTR, then 1% of tracked revenueApp Store, Play, and web billing it brokers
Stripe, directMedium. Webhooks and a subscription state machine you ownPayment processing feesWeb and desktop; not a legal path for iOS digital goods

The last row is the one that decides your architecture. RevenueCat covers the surfaces it brokers, and a Flutter product shipping to macOS, Linux, Windows and web has surfaces it does not. BookBed bills through Stripe for exactly that reason, with cross-tab checkout resolved by a BroadcastChannel listener and a Firestore listener as the authoritative fallback, because webhook writes are the only thing permitted to move an account's status. Two billing systems, not one. The Flutter, Firebase and RevenueCat stack breakdown covers the mobile-only path where one is enough.

One number before you build any of it. RevenueCat's State of Subscription Apps 2026, drawn from more than 115,000 apps and $16 billion in tracked revenue, puts the global median download-to-paid conversion at 2.0% and finds that 4.6% of apps reach $10,000 in monthly revenue within two years (RevenueCat). Build the billing layer that fits the median outcome first, and earn the complicated one.

Deep Links Are Now Your Problem

Firebase Dynamic Links shut down on August 25, 2025. Every .page.link URL and custom FDL domain now returns HTTP 404, and the link metadata was purged (Firebase FAQ). No redirect. No grace period.

You shipped the app; a user taps a shared invite link. What happens? App Links and Universal Links handle it when the app is installed. When it is not, you need deferred deep linking, and Google's answer there is a paid third party.

The App Store Tax Is Unsettled, Which Changes the Math

United States link-outs to your own web checkout are currently permitted with no Apple commission, but that state is provisional and the case is still moving.

The sequence matters if you are pricing a Flutter subscription app right now. Judge Gonzalez Rogers found in April 2025 that Apple had willfully violated the 2021 injunction and barred commissions on external purchase links. In December 2025 the Ninth Circuit affirmed the contempt findings but vacated the total ban, remanding so the district court could set a rate tied to Apple's actual costs (MacRumors). The Supreme Court then granted certiorari in mid-2026 on the narrow question of whether a party can be held in contempt for violating the spirit of an injunction.

For a Flutter SaaS this is an architecture question, not a legal one. If your web checkout already exists because you ship to desktop and browser anyway, a US link-out costs you nothing to add and can be removed in a config flag if the rate changes. If your only surface is mobile, do not build a web billing stack on the assumption that today's zero-commission window survives a 2027 ruling.

What Flutter SaaS Architecture I Would Wire Up This Week

  1. Create the Firebase project and write Security Rules before the first screen. Tenant ID in the path, custom claim on the token, and emulator tests proving a second tenant is denied.
  2. Model documents as tenants/{tenantId}/... even when you have exactly one tenant and no plans for a second. Especially then.
  3. Route every privileged write through a Cloud Function. Subscription status, tenant claims, invitations. The client proposes; the function decides.
  4. Add RevenueCat if you are mobile-only, Stripe if you have a web or desktop surface, both if you have both. Reconciliation between them is now a standing job, so name an owner for it.
  5. Configure AASA and assetlinks.json on day one, before anybody has a link to share. Deferred deep linking can wait a quarter; installed-app deep linking cannot wait a week.
  6. Turn on Crashlytics before the first TestFlight build, not after the first crash report you cannot reproduce.

Tooling for all of that is deliberately boring, and the Flutter dev tools I actually keep installed is a short list. If what you are building is a template rather than a platform, the economics invert entirely — the FlutterFlow marketplace templates I ship run on a review-and-update cycle instead of a subscription state machine. And if you are still deciding whether this is a SaaS product or a one-off app, settle that first, because the tenancy model follows from the answer.

Six months in, BookBed's booking calendar repository is 989 lines carrying a comment pinned at the top that reads do not refactor without unit tests. The duplication underneath came from bugs fixed one at a time, and collapsing it would resurrect them. That is what a Flutter and Firebase SaaS looks like once it has been alive long enough to have scars.

Before You Open Your Editor

Open your Firestore data model and answer one question: if you onboarded a second tenant tomorrow, how many documents would have to move? Any answer above zero is your next sprint, and the number only grows from here.

What does your app's download-to-paid conversion actually look like against that 2.0% median?

Free resource

Free SaaS MVP Scope Template

A Notion document with the full feature checklist, MVP vs. nice-to-have table, pre-build questions, and cost signals — so you walk into any developer call knowing exactly what to ask for.

Get the template →
DL

Dusko Licanin

Full-Stack Developer · Banja Luka, Bosnia

Full-stack developer shipping SaaS MVPs, web apps, and mobile apps using AI-augmented workflows — without agency coordination overhead. Live portfolio: BookBed, Callidus, Pizzeria Bestek.

Frequently Asked Questions

Is Firebase a good backend for a SaaS product?

Firebase works well for SaaS when your data is document-shaped and your team is small, and it works badly when your reporting needs joins. The Blaze free tier covers 50,000 Firestore reads, 20,000 writes and 20,000 deletes a day plus 2 million Cloud Functions invocations a month, which carries a small product a long way. What it does not give you is relational querying, so aggregate reporting either moves to Firebase SQL Connect, which Google repriced to $0.90 per million operations in May 2026, or gets precomputed into summary documents by a scheduled function. The other consideration is lock-in: Auth, Firestore, Functions, FCM and Crashlytics are pleasant together and awkward to separate later.

How do you handle subscriptions in a Flutter app?

Route every subscription state change through a server, never the client, and pick your billing broker by which platforms you actually ship to. On iOS and Android, digital subscriptions must go through StoreKit and Google Play Billing, which the `in_app_purchase` package exposes and RevenueCat wraps with receipt validation and entitlement management. On web and desktop, Stripe handles it. A Flutter app shipping to all six targets needs both, with webhooks writing the authoritative status into your database and the client only ever reading it. The most common failure is a client that flips an account to active on a purchase callback and then drifts out of sync with the store.

Is RevenueCat worth it for a Flutter app?

RevenueCat is worth it if you sell on both App Store and Play, because it replaces receipt validation, renewal handling and grace-period logic you would otherwise build and maintain yourself. Pricing is free up to $2,500 in monthly tracked revenue and 1% of tracked revenue above that, per RevenueCat's own 2026 pricing page. At $10,000 in monthly revenue that is $100, which is less than a day of engineering time. It stops being obviously worth it when you ship to only one store, or when most of your revenue arrives through a web checkout RevenueCat does not broker, because then you are paying a percentage on a fraction of the problem.

What is the best Flutter SaaS architecture?

The architecture that survives is the one where tenant boundaries live in the data model and privileged writes live on the server. Concretely: documents under `tenants/{tenantId}/`, a tenant claim on the Firebase auth token, Security Rules comparing the two, and Cloud Functions owning every write that touches money or permissions. State management inside the app matters far less than people argue, and Riverpod and Bloc both hold up fine. Feature-first folders beat layer-first once you pass roughly twenty screens, because a feature is what you eventually delete or hand off and a layer never is. Everything else is a preference you can change in an afternoon.

What replaced Firebase Dynamic Links for Flutter deep linking?

Nothing from Google replaced Firebase Dynamic Links directly, so you now use native App Links and Universal Links plus a paid third party if you need deferred deep linking. Firebase Dynamic Links shut down on August 25, 2025, and all existing links return HTTP 404 rather than degrading gracefully, per Google's own Dynamic Links deprecation FAQ. Standard deep links work through platform configuration alone: an `apple-app-site-association` file and an `assetlinks.json` file served from your domain, with no Flutter-specific SDK required. Deferred deep linking, where a user without the app installed still lands on the right screen after installing, is the capability that genuinely disappeared. Google's FAQ points at Adjust, AppsFlyer, Branch and others for that.