"Supabase or Firebase?" is the second question every technical founder asks me, right after "Flutter or native?" And like most either/or questions in engineering, the honest answer is a decision tree, not a brand. I've shipped production Flutter apps on Firebase — auth flows from Google Sign-In to anonymous guests, Firestore, Storage, push — and reached for Supabase and custom backends where they fit better. Here's the actual decision logic, stripped of fandom.
The one-line version of each
Firebase is a bundle of managed product services — document database, auth, storage, push, analytics, crash reporting — designed to get a mobile app running with essentially zero backend work. Its data model is a document tree; its superpower is realtime sync and a mobile SDK that handles offline for you.
Supabase is a managed Postgres with batteries — auth, storage, realtime, and auto-generated APIs wrapped around a genuine relational database. Its superpower is that your data layer is just SQL: joins, constraints, views, transactions, and an exit door that any Postgres host can receive.
That single difference — documents versus relations — decides most projects on its own.
Choose by data shape, not by vibes
Ask one question first: when you describe your product's data, are you describing objects or relationships?
- "A user has a profile, their generations, their saved items" — object-shaped, hierarchy-friendly. Firestore models this naturally, and you'll ship fast. An image-generation app I built runs exactly this shape on Firestore: user documents, a community feed, personal albums. It never fights the database.
- "Students belong to classes, classes have subjects, subjects have chapters, and we need every student's progress per chapter, aggregated per class" — that's a join. Then another join. In a document database you'll end up duplicating data and maintaining it by hand in application code; in Postgres it's a query. Products like marketplaces, bookings, anything with reporting or an admin dashboard full of tables — this is Supabase territory.
The most expensive backend mistake I see isn't picking the "wrong" brand — it's putting deeply relational data in a document store and paying for it in denormalisation bugs from month three onward, forever.
Where Firebase genuinely wins
- Offline-first mobile. Firestore's client-side cache and sync is still the best in class, and you get it for free. Building comparable offline behaviour yourself is real work.
- Auth breadth on mobile. Google, Apple, phone, email, and — underrated — anonymous auth with later account linking. Letting users try the product as a guest and upgrade seamlessly is a conversion feature, and Firebase makes it nearly free.
- The peripheral services. Push (FCM), Crashlytics, analytics, remote config — you're likely using some of these regardless of your database, and they're a console login away.
- Realtime UX — chat, live presence, collaborative state — with no infrastructure to run.
Where Supabase genuinely wins
- Relational integrity. Foreign keys, constraints, and transactions enforced by the database instead of by developer discipline.
- Queries you haven't predicted yet. Firestore requires you to structure data around known access patterns; SQL lets tomorrow's question be a new query instead of a data migration.
- Admin tooling and dashboards. Anything back-office loves SQL. Your future admin panel is a
selectaway, not an aggregation pipeline. - Portability. It's Postgres. If you outgrow the platform, the database comes with you. Vendor exit from a document store is a rewrite of the data layer.
- Pricing predictability at scale tends to be easier to reason about than per-operation billing — model your usage either way before you commit.
The hybrid nobody markets, everybody ships
Real products mix. A travel app I built runs its heavy routing logic through a custom FastAPI backend — because a route-generation algorithm belongs in real server code, not in client-side database calls — while realtime group chat rides on managed backend services, because building realtime infrastructure for chat would be madness. Firebase's peripheral services (push, crash reporting) show up in my Supabase-backed and custom-backend projects too.
The BaaS is a component, not a religion. Use the managed pieces that erase whole categories of work; write real backend code where your product's actual novelty lives.
My defaults, condensed
| Situation | Reach for |
|---|---|
| Consumer MVP, object-shaped data, needs offline + guest mode | Firebase |
| Relational domain, reporting, admin dashboards | Supabase |
| Realtime chat/presence as a feature | Firebase (or Supabase Realtime if already there) |
| Proprietary algorithm / heavy server logic | Custom backend (FastAPI) + managed services around it |
| "We might migrate off later" is a stated requirement | Supabase — it's just Postgres |
Both platforms let a solo developer ship what used to take a backend team. Pick by your data's shape and your product's next twelve months — then spend the saved time on the part of the product no platform can give you.