Cover image for blog post: "Convex vs Firebase vs Supabase in 2026: Stop Asking Which One Is Best"
← Back to blog posts

Convex vs Firebase vs Supabase in 2026: Stop Asking Which One Is Best

Convex, Supabase or Firebase? An honest 2026 comparison of realtime, SQL, lock-in, pricing models and DX, and which backend I'd pick for each kind of project.

Published onOctober 06, 202616 minutes read

Table of Contents

Three backends walk into a startup.

Firebase says:

β€œI’ve been doing this for years.”

Supabase says:

β€œCool. But have you heard of PostgreSQL?”

Convex walks in and says:

β€œWhy are you thinking about your backend this much?”

And honestly... that pretty much sums up the battle.

If you're starting a new SaaS, side project, AI app, mobile app, or one of those β€œthis will take me one weekend” projects that mysteriously consumes the next three months of your life, you've probably considered at least one of these:

I've spent a lot of time looking at backend-as-a-service platforms, and here's the thing: there is no universal winner.

But there is a winner depending on what kind of developer you are and what you're building.

A person weighing up two options, unsure which one to pick GIF via GIPHY

And in 2026, the comparison has become much more interesting:

So let's forget the marketing pages and talk about what it actually feels like to build with them.

The 30-second answer

If you don't want to read the whole article:

ConvexSupabaseFirebase
Database philosophyReactive document databasePostgreSQLFirestore + PostgreSQL via SQL Connect
Realtime
TypeScript DX
SQLβŒβœ…βœ… via SQL Connect
Complex relational dataGoodExcellentGood/Excellent with SQL Connect
Authβœ…βœ…βœ…
Server functionsβœ…βœ…βœ…
Self-hostingβœ…βœ…βŒ managed Google platform
Ecosystem maturityGrowingMatureExtremely mature
Vendor independenceGoodExcellentLower
Mobile ecosystemGoodGoodExcellent
β€œJust build the damn thing” factorπŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯

My simplified recommendation:

But that's the boring answer. Let's go deeper.

1. Convex: the backend that feels like React

Convex has a very different philosophy from the other two. With most backend platforms, you think like this:

Frontend
   ↓
API
   ↓
Backend logic
   ↓
Database
   ↓
Realtime/WebSocket layer
   ↓
Frontend state update

Convex basically asks:

What if we removed half of that mental overhead?

A Convex backend revolves around three main concepts:

query()
mutation()
action()

That sounds simple. The interesting part is what happens when you query data.

Convex queries are automatically reactive. When the underlying data changes, subscribed clients receive updated query results without you manually building a synchronization system around them. Convex also caches query results automatically.

Here's roughly what a tiny chat backend looks like:

// convex/messages.ts
import { query, mutation } from './_generated/server';
import { v } from 'convex/values';
 
export const list = query({
  args: {},
  handler: async (ctx) => {
    return await ctx.db.query('messages').order('desc').take(50);
  },
});
 
export const send = mutation({
  args: { author: v.string(), body: v.string() },
  handler: async (ctx, { author, body }) => {
    await ctx.db.insert('messages', { author, body });
  },
});

And on the client, this:

const messages = useQuery(api.messages.list);

isn't mentally equivalent to:

GET /messages

It's closer to:

Keep this UI synchronized with the result of this query.

That's a subtle difference. But once you're building any of these:

...it becomes a massive difference.

Convex's biggest advantage isn't the database

It's the amount of backend code you don't have to think about. You aren't constantly asking:

Do I need a REST endpoint here?

Should this be a WebSocket?

Should I invalidate this cache?

Should I refetch this query?

How do I keep two browser sessions synchronized?

Convex's answer is often: don't worry about it.

That's extremely attractive for small teams, and even more attractive for solo developers.

But there is a catch

Convex asks you to adopt the Convex way of building backends.

Its database stores JSON-like documents and supports schemas, indexes, references and relational-style modelling, but you're not sitting directly on top of PostgreSQL writing arbitrary SQL.

For many applications, that's completely fine. But if your brain immediately starts thinking like this:

SELECT
  customers.country,
  SUM(orders.total)
FROM orders
JOIN customers
  ON customers.id = orders.customer_id
GROUP BY customers.country;

...Supabase is probably going to feel more natural.

Those sound similar. They aren't.

2. Supabase: PostgreSQL wearing a really nice suit

Supabase started life with an easy marketing pitch:

Open-source Firebase alternative.

I don't think that description does it justice anymore. The biggest difference is simple: Supabase gives you PostgreSQL.

Not β€œa database inspired by relational databases.” Not β€œa proprietary database with SQL-like functionality.” A real PostgreSQL database, with Auth, Storage, Realtime, Edge Functions, APIs and other tooling built around it.

That one architectural decision has enormous consequences. You get:

And when your cute little weekend SaaS suddenly becomes an actual business, those boring database features become very sexy.

Supabase's secret weapon: boring technology

Software developers love shiny things. Founders should sometimes love boring things.

PostgreSQL is boring in the best possible way. If your application eventually contains:

users
organizations
memberships
subscriptions
products
orders
payments
invoices
permissions
audit_logs

...you're going to start appreciating relational databases very quickly.

Imagine asking:

Give me every active organization on the Pro plan whose subscription renews this month and has more than five active members.

In PostgreSQL? That's normal. Complex relational querying is literally what the thing was designed to do.

And then there is Row Level Security

Supabase leans heavily on PostgreSQL Row Level Security (RLS). You can write policies such as:

create policy "Users can read their own documents"
on documents
for select
using (auth.uid() = user_id);

Now your authorization rule lives at the database layer. That's powerful: even if somebody reaches the database through another permitted API path, PostgreSQL still enforces the policy.

But RLS is also one of those technologies that starts like:

Wow, this is elegant!

and three weeks later becomes:

Why is this query returning zero rows?

πŸ˜‚ Power usually comes with complexity.

Supabase Realtime is good, but it's not Convex realtime

Supabase absolutely supports realtime, but philosophically it works differently.

Supabase currently offers mechanisms including Broadcast, Presence and database-change subscriptions. Its documentation recommends Broadcast for scalable database-change subscriptions, while direct Postgres Changes is the simpler approach but has different scaling characteristics.

In practice, you subscribe explicitly:

const channel = supabase
  .channel('messages')
  .on(
    'postgres_changes',
    { event: 'INSERT', schema: 'public', table: 'messages' },
    (payload) => {
      // merge payload.new into your local state
    }
  )
  .subscribe();

Notice that keeping your UI state in sync with that payload is still your job. That's the cleanest distinction I can make:

3. Firebase: the backend everyone loves to declare dead

Every couple of years, developers announce:

Firebase is dead.

Firebase:

continues running half the mobile apps on their phones

Okay, slight exaggeration. But Firebase isn't going anywhere, and dismissing it because Supabase and Convex are cooler on developer Twitter is silly.

Firebase's advantage: ecosystem

This is the thing startups underestimate. Firebase isn't just a database; it's a huge collection of tools around application development:

If you're building a serious mobile product, that collection is hard to ignore.

The old Firebase criticism is becoming outdated

Historically, one of the easiest arguments against Firebase was:

β€œFirestore is NoSQL. My app needs relational data.”

That argument isn't completely valid anymore. Firebase now has SQL Connect, backed by Cloud SQL for PostgreSQL.

You define a relational schema and operations through GraphQL-style definitions, and Firebase generates strongly typed client SDKs around those operations.

That means Firebase in 2026 can effectively give you two very different database approaches:

Firestore
    ↓
Document-oriented, realtime-friendly database
 
SQL Connect
    ↓
PostgreSQL relational database

That's a pretty significant evolution. Firebase is no longer simply β€œthe NoSQL option.”

Firebase still has one problem I can't ignore

Firebase projects can become... very Firebase.

It usually goes like this:

  1. At first you use Firebase Auth + Firestore.
  2. Then you add Cloud Functions.
  3. Then Cloud Storage.
  4. Then Firebase Cloud Messaging.
  5. Then some Google Cloud service.
  6. Then another Google Cloud service.

And suddenly your architecture diagram looks like Google's homepage had children.

None of this is necessarily bad. In fact, it can be incredibly productive. But leaving becomes increasingly painful. That's vendor lock-in.

The lock-in question

This is where things get interesting.

Rows of server cabinets connected by blue network cables in a data center Photo via Unsplash

Supabase

Probably the winner.

Your core database is PostgreSQL. If one day you decide β€œI'm done with Supabase,” your data model is still PostgreSQL.

Obviously, migrating an entire production backend is never effortless, and Supabase-specific features still need replacements. But PostgreSQL gives you a beautiful escape hatch. Supabase also officially supports self-hosting.

Convex

This answer has changed considerably.

Convex's backend is open source and can now be self-hosted. That removes one of the strongest historical arguments against adopting a more opinionated backend.

However, your application architecture is still written around Convex's programming model. So I would describe the lock-in as:

Firebase

Your database might be portable to some degree, especially if you're using PostgreSQL through SQL Connect, but Firebase itself remains deeply integrated with Google's managed ecosystem.

That's fantastic when you want the ecosystem. Less fantastic when you're trying to escape it.

The pricing problem nobody can answer with a single number

People love asking:

Which one is cheapest?

Wrong question. The right question is:

Which pricing model matches my workload?

So don't compare them like this:

Firebase = $X
Supabase = $Y
Convex = $Z

Instead, model your application:

Architecture determines your bill more than the logo on your dashboard.

Where each one absolutely wins

Convex: collaborative, realtime products

Let's say I'm building:

A collaborative project-management application where multiple users are editing tasks and watching updates happen instantly.

I'd probably reach for Convex first. Why? Because synchronization is part of the programming model rather than something I'm assembling afterwards.

The developer loop is beautiful:

Define schema
↓
Write TypeScript query
↓
Use query from React
↓
Data changes
↓
UI updates

Very little glue. For a startup trying to discover whether anybody actually wants the product, that's powerful.

You can optimize architecture later. You cannot optimize a startup that never ships.

Supabase: data-heavy SaaS

Now imagine I'm building:

A SaaS with customers, organizations, roles, subscriptions, invoices, reports and an admin dashboard.

I'm probably picking Supabase. Not because Convex couldn't build it; it absolutely could. I'm choosing Supabase because I know where this product is heading:

More relationships
More reporting
More analytics
More migrations
More weird admin queries
More data integrations

At some point, someone is going to ask:

Can you export all customers who purchased X but not Y between these two dates, grouped by organization?

And PostgreSQL will quietly sit in the corner, smiling.

Firebase: consumer mobile apps

Now imagine I'm building:

A consumer mobile app with push notifications, authentication, analytics, remote configuration, crash reporting and tight Google Cloud integration.

Firebase immediately becomes much more attractive.

Could I assemble those pieces elsewhere? Absolutely. But that's the point: I'd have to assemble those pieces. Firebase already has an absurd amount of application infrastructure under one roof.

Sometimes boring maturity beats architectural purity.

What about AI-assisted development?

This category has become surprisingly important. We're increasingly not writing every line ourselves: Claude Code, Codex, Cursor and similar agents are becoming part of the development loop.

And backend architecture matters a lot here. Agents love:

All three platforms have been moving aggressively in this direction:

This matters. The backend of the future isn't only being designed for humans. It's increasingly being designed for humans supervising agents.

My decision tree

Here's the completely scientific decision tree I use:

Do you strongly want PostgreSQL?
β”‚
β”œβ”€β”€ YES β†’ Supabase
β”‚
└── NO
    β”‚
    β”œβ”€β”€ Is realtime central to the product?
    β”‚       β”‚
    β”‚       └── YES β†’ Convex
    β”‚
    └── Are you heavily invested in mobile / Google services?
            β”‚
            └── YES β†’ Firebase

Obviously, reality is more complicated. But honestly? That gets you surprisingly far.

My picks by project type

Project typeMy pickWhy
Realtime chat appπŸ₯‡ ConvexRealtime is the product.
Collaborative SaaSπŸ₯‡ ConvexSupabase is a very close second if the data model becomes heavily relational.
Traditional B2B SaaSπŸ₯‡ SupabasePostgres wins this one for me.
E-commerce backendπŸ₯‡ SupabaseRelational data: products, orders, customers, payments, inventory. Give me SQL.
Mobile consumer applicationπŸ₯‡ FirebaseEspecially when Firebase Cloud Messaging, Analytics and Crashlytics are useful.
Weekend MVPπŸ₯‡ ConvexThe fewer infrastructure decisions I make before getting users, the better.
Heavy reportingπŸ₯‡ SupabaseSQL. Next question.
Existing Firebase app with real usersπŸ₯‡ FirebaseDon't rewrite a working production system because of a cool demo.

That last one deserves emphasis: please don't rewrite your functioning production system because somebody posted a cool Convex demo. Migration-driven development is a dangerous hobby.

So... which one would I choose today?

If you forced me to pick one backend for every project I build for the next two years, I'd probably choose Supabase.

Not because it has the fanciest developer experience, but because PostgreSQL gives me enormous flexibility. I can build:

...without worrying too much about whether my database model will eventually fight me.

But if you asked:

Which one makes me most excited to build something new?

I'd say Convex.

There's something incredibly satisfying about removing synchronization, caching and API boilerplate from your mental stack. Convex feels like someone looked at modern React development and asked:

Why doesn't the backend feel like this?

And then tried to build exactly that.

And Firebase? Firebase is the experienced engineer in the room that everyone keeps calling old while it quietly continues running production systems at ridiculous scale.

I wouldn't automatically choose Firebase for every new web SaaS. But dismissing it would be equally foolish, especially now that Firebase has a serious relational PostgreSQL story.

Wrapping up

Here's how I see the three philosophies:

πŸ”΄ Convex

β€œYour backend should react to your data.”

Choose it for speed, TypeScript DX, realtime products and minimal infrastructure thinking.

Supabase

β€œYour backend should be built on technologies you already understand.”

Choose it for PostgreSQL, relational data, control, portability and long-term flexibility.

Firebase

β€œYour backend should come with everything.”

Choose it for ecosystem maturity, mobile development, Google integrations and an enormous collection of production-ready services.

Key takeaways

The mistake isn't choosing Firebase. The mistake isn't choosing Supabase. And the mistake isn't choosing Convex.

The mistake is choosing a backend because everyone on X is talking about it... before understanding what kind of application you're actually building.

Now I'm curious: if you were starting a SaaS today, which one would you pick: Convex, Supabase or Firebase? And more importantly... why?

Originally published on dev.to.


Mascot