Convex vs Supabase

Choose Convex if your app is realtime-first and you want the database, functions and subscriptions to be one typed TypeScript system. Choose Supabase if you want Postgres you can keep — SQL, extensions, and an exit path to any other Postgres host. Convex ships faster; Supabase is easier to leave.

Editorial judgement last reviewed

Should I build on Convex or Supabase?

The honest framing is that these are not the same category of product wearing different logos. Supabase is Postgres with an excellent set of services bolted around it — auth, storage, edge functions, a realtime broadcast layer, a good dashboard. Convex is a purpose-built reactive database where queries are TypeScript functions and every query is a live subscription by default. One is infrastructure you rent; the other is a programming model you adopt.

That difference decides almost everything downstream. On Supabase, the thing you're writing is SQL and the thing you own is a Postgres database. On Convex, the thing you're writing is a query function and the thing you own is application code that only runs on Convex.

For a realtime, collaborative, or agent-driven app being built by a small TypeScript team, Convex is the faster path and the fewer-bugs path. You do not write cache invalidation, you do not write a websocket layer, you do not reconcile optimistic updates by hand, and you do not maintain a second copy of your schema in a validation library. The transactional guarantees are real ones — functions run in a serialisable transaction, and a query that reads three tables sees a consistent snapshot of all three.

For anything where the data is likely to outlive the application — analytics, reporting, an eventual data team, a product with an acquisition-shaped future — Supabase is the safer call. Postgres is the most portable thing in this comparison. Every BI tool speaks it, every ORM speaks it, every LLM writes it, and if Supabase ever prices itself out of your budget you move the database to Neon, RDS, Hetzner or your own box in an afternoon.

Our score weights portability heavily, which is why the two land closer than the marketing on either side would suggest. Ignore the composite if your situation is lopsided: exit cost matters enormously to a Series A company and almost nothing to a weekend project.

Which one should you pick?

Choose Convex if…

  • Your UI is live: dashboards, chat, presence, collaborative editing, agent-run status. Convex gives you subscriptions for free, and "for free" here means you never write the invalidation logic that normally causes the bugs.
  • Your team is small and entirely TypeScript. End-to-end inference from schema to query to React hook removes a whole class of runtime errors, and there is no ORM layer to argue about.
  • You want scheduled functions, crons, file storage, vector search and full-text search without wiring four services together.
  • You are building agent tooling. Convex's transactional function model plus scheduling maps unusually well onto "an agent kicked off a long job, show me its state live".
  • You accept that leaving means rewriting your data layer, and you have decided that trading exit cost for velocity is correct at your stage. It often is.

Choose Supabase if…

  • You already know SQL and want to keep using it — window functions, CTEs, materialised views, EXPLAIN ANALYZE, the whole toolbox.
  • You need Postgres extensions: PostGIS for geo, pgvector at scale, pg_cron, TimescaleDB-shaped workloads, or anything that assumes a real Postgres wire protocol.
  • Portability is a requirement, not a preference. Compliance reviews, enterprise procurement and acquirers all ask where the data lives and how it gets out.
  • You want row-level security enforced in the database rather than in application code, and you're comfortable writing RLS policies carefully.
  • Your stack isn't only TypeScript. Supabase has first-class clients in Python, Dart, Swift and Kotlin; Convex's story outside TS is thinner.
  • You want self-hosting as a fallback. Supabase can be run on your own hardware; that option is worth real money to some teams even if they never exercise it.

Reactivity: subscriptions by default vs subscriptions you configure

This is the single biggest technical difference and it is worth being precise about.

In Convex, a query is a TypeScript function that reads from the database. The runtime records exactly which documents that function touched, and when any of them change it re-runs the function and pushes the new result to every client subscribed to it. You never say "invalidate this". Your React component calls a hook, the hook holds a live value, and the value is correct. Consistency is per-query and transactional, so a query joining three tables cannot return a half-updated view.

Supabase's realtime is a different mechanism with a different contract. It streams Postgres logical replication changes over a websocket: you subscribe to a table, optionally with a filter, and receive INSERT/UPDATE/DELETE events. That is a powerful primitive, but it is row-level, not query-level. If your UI shows a derived value — a count, a join, an aggregate — you are responsible for translating "row 4192 changed" into "recompute this". Most teams end up pairing it with a client cache like TanStack Query and writing invalidation rules by hand.

For simple lists, both work fine. For a screen showing several derived values that must agree with each other, Convex removes work that Supabase makes you do. If your app has no live surfaces at all, this section doesn't matter and you should decide on the other axes.

Exit cost: the field nobody publishes

Our killer field on the Convex alternatives hub is exit cost — a scored estimate of how much application code must be rewritten to leave. It exists because it is the actual question behind "should I use Convex", and no vendor will ever answer it.

Leaving Supabase is close to a data migration. Your tables are Postgres tables; pg_dump produces a file that restores anywhere. What you leave behind is the ancillary layer — auth users and their hashed credentials, storage buckets, RLS policies expressed in Supabase's idioms, and any Edge Functions. That is real work, typically days to a couple of weeks, but the core asset moves intact and your SQL keeps running.

Leaving Convex is a rewrite of the data layer. The documents export cleanly — that part is fine, and Convex does not hold your data hostage. But your queries and mutations are Convex functions using the Convex query builder, your reactivity is Convex subscriptions, and your scheduled jobs are Convex crons. None of that is portable. You are rewriting to Postgres plus an ORM plus a realtime story plus a job runner, and re-testing all of it.

The correct way to hold this: exit cost is a real liability, and it is also frequently the right trade. A team that ships six months earlier because it didn't build a realtime layer has bought itself the runway to afford a migration later. Just make the trade deliberately, and don't let anyone tell you it isn't a trade.

Pricing shape, and where each one surprises you

Supabase prices like infrastructure: a flat platform fee per project on paid plans, then compute sized by instance, plus storage and egress. It is predictable and it is easy to model on a spreadsheet. The surprises are that a paused free project needs restoring, that compute is the line item that actually grows, and that bandwidth on media-heavy apps adds up faster than teams expect.

Convex prices like a platform: function calls, action compute time, database bandwidth and storage. It is generous at the bottom and the free tier carries a real side project comfortably. The surprise is the reactive model's own cost shape — a query that fans out to many subscribers re-runs on every write to any document it read. A poorly scoped query over a hot table can multiply your function-call bill in a way that has no analogue in a request-per-page architecture. This is manageable (scope queries narrowly, paginate, avoid reading giant collections in a subscribed query) but it is a discipline you have to learn.

Neither is expensive at small scale. Both are cheaper than a two-week detour building the thing they give you. Model your own numbers on the pricing fields in the category table rather than trusting either landing page.

Auth, storage and the rest of the platform

Supabase's auth is the more complete product: email and password, magic links, a long list of OAuth providers, phone OTP, MFA, and — critically — it issues a JWT that Postgres itself reads for row-level security. That integration is genuinely elegant. The cost is that RLS is easy to get subtly wrong, and getting it wrong means a data leak rather than a broken page. Test policies deliberately.

Convex leans on external identity providers, with first-class integrations for Clerk and Auth0 and its own auth library for teams that want fewer vendors. Authorisation lives in your query and mutation functions as ordinary TypeScript. Most developers find that easier to reason about and easier to test than policy DSLs, at the cost of it being your job to remember the check in every function.

Both include file storage with signed URLs, both include vector search suitable for retrieval, both have full-text search that is fine for in-app search and not a Meilisearch or Typesense replacement. Supabase's dashboard is the better data-browsing experience; Convex's dashboard is the better function-observability experience, with live logs and function-level history that make debugging obvious.

If you want a third option, the same hub covers InstantDB, Triplit and ElectricSQL for local-first, and PocketBase and Appwrite for self-hosted single-binary deployments.

Frequently asked questions

Is Convex just Firebase with types?

No, and the difference matters. Firebase's realtime model is document-level listeners with no transactional joins; Convex runs your query as a serialisable transaction and re-runs it when anything it read changes. Convex also gives you real ACID mutations across documents, which Firestore has never offered in the same shape.

Can I use Convex and Supabase together?

Yes, and some teams do — Supabase Postgres as the system of record for reporting and analytics, Convex for the live application surface. It's more moving parts and a sync problem you now own, so only do it if you have a concrete reason. Most teams should pick one.

Which is better for AI agents?

Convex, in most cases. Agents produce long-running jobs with state that a UI needs to watch, and Convex's scheduled functions plus automatic subscriptions cover that without extra infrastructure. Supabase can do it, but you'll add a queue, a worker and your own status-streaming path.

Does Supabase lock me in at all?

Less than most, but not zero. The database is plain Postgres and moves cleanly. Supabase Auth, Storage, Edge Functions and your RLS policy style are the sticky parts, and re-homing auth users is the fiddliest step because you're moving password hashes and provider identities.

What about cost at scale?

Supabase becomes a compute-sizing exercise, which is familiar and predictable. Convex becomes a query-shape exercise: costs scale with function calls and database bandwidth, so a broadly scoped subscribed query over a hot table is the thing that bites. Both are cheap below serious traffic.

Which has the better local development story?

Supabase, narrowly — the CLI runs the whole stack in Docker with migrations in your repo, which suits teams that want deterministic CI. Convex's dev deployment plus live push is a faster inner loop day to day, but it is a cloud deployment rather than a local one.