Convex and Supabase both sell themselves as "backend in a box," but they start from very different foundations. Supabase wraps PostgreSQL with auth, storage, and real-time subscriptions into one managed service. Convex is a reactive document database where your TypeScript functions are the entire backend: no SQL, no ORM, no separate caching layer.
That difference shapes almost everything downstream, so the right pick depends on what you value. If you're building real-time collaborative apps and live in TypeScript, Convex removes a lot of friction. If you want SQL power, Postgres extensions, or the ability to self-host, Supabase is the safer bet. The sections below go dimension by dimension so you can see where each one lands.
Quick comparison
| Feature | Convex | Supabase |
|---|---|---|
| Database type | Reactive document store | PostgreSQL (relational) |
| Query language | TypeScript functions | SQL |
| Real-time | Built-in, reactive by default | WAL-based subscriptions |
| Schema definition | TypeScript schema validation | SQL migrations |
| Auth | Built-in (JWT, OAuth) | Built-in (email, OAuth, SSO, MFA) |
| File storage | Built-in | S3-compatible, built-in |
| Edge functions | Convex Actions (TypeScript) | Edge Functions (Deno) |
| Vector search | Built-in | pgvector extension |
| Open source | Backend open-sourced Feb 2025 | Fully open-source, self-hostable |
| Self-hosting | Not available | Available |
| Free tier | Yes (compute + storage limits) | Yes (500MB DB, 50K MAUs) |
| Paid plan starts | Usage-based | $25/month |
| GitHub stars | ~10K | ~97K |
Architecture
Supabase is a managed PostgreSQL platform. When you create a Supabase project, you get a dedicated Postgres instance alongside auth, real-time, file storage, and edge functions, all connected through a single API layer. The database is standard Postgres, which means any Postgres-compatible tool, ORM, or extension works with it. Supabase instances do not pause on paid plans, so there are no cold starts.
Convex takes a different route. Under the hood it runs a custom transactional document store built on top of a SQL engine, but that SQL layer is completely hidden. You write queries and mutations as pure TypeScript functions that run server-side inside Convex's infrastructure. The platform tracks every data dependency for every active query function. When a document changes, Convex reruns any function that depends on it and pushes the update to connected clients. There is no separate pub/sub configuration, no cache invalidation logic, and no WebSocket setup on your end.
So you end up with two very different mental models. Supabase feels like a database with services attached. Convex feels like a reactive backend runtime where the database is an implementation detail.
Data model and querying
Supabase gives you full PostgreSQL: tables, foreign keys, indexes, views, stored procedures, and complex multi-table queries with joins and aggregations. If you need to analyze a year of order history or run a report across five tables, Postgres handles it natively. Teams that already know SQL are productive from day one.
Convex uses a document model. Data is stored as typed documents in tables, and you query it through TypeScript functions:
// Convex query: fetch messages for a channel
export const listMessages = query({
args: { channelId: v.id("channels") },
handler: async (ctx, args) => {
return await ctx.db
.query("messages")
.withIndex("by_channel", (q) => q.eq("channelId", args.channelId))
.order("desc")
.take(50);
},
});There is no SQL and no ORM to configure, and TypeScript types flow end-to-end from the database through to your frontend components automatically. The tradeoff is expressiveness: Convex queries are simpler to write for common app patterns but cannot match Postgres for analytical queries, complex joins, or anything that leans on a mature SQL ecosystem.
For standard CRUD apps, both approaches work equally well. If you have data-heavy workloads or existing SQL knowledge, Supabase's Postgres has the edge. If you're building a TypeScript-first frontend and want minimal backend boilerplate, Convex's model removes a lot of friction.
Real-time capabilities
This is where the two diverge most sharply.
Supabase real-time works through PostgreSQL's Write-Ahead Log. You subscribe to a table or a filtered set of rows, and Supabase notifies your client when inserts, updates, or deletes happen. This works well for event-driven UIs like chat notifications, live dashboards, and activity feeds. The limitation is consistency: because reads and writes travel over different channels, there is no guarantee that a client's subscription update reflects the exact state a write produced. For most apps, this does not matter.
Convex's real-time model is different in kind, not just degree. Every query function you write becomes a live subscription automatically. When any data the function reads changes, Convex reruns the function server-side and delivers the new result to the client, with consistency guarantees, because the re-execution and delivery happen inside the same system. There is no separate subscription API to configure. You write a query and it is reactive.
In practice, collaborative apps (multiplayer tools, live editing, presence systems) are noticeably simpler to build on Convex. If you only need to be notified of discrete events, like "a new row arrived," either platform does the job fine.
Schema management and migrations
Supabase uses standard SQL migrations. You write .sql files through the Supabase CLI, apply them locally, and push to production. Because it is Postgres, the full range of ALTER TABLE, CREATE INDEX, and similar DDL is available. Schema changes are explicit, versioned, and auditable.
If you want governance around those schema changes (review workflows, CI/CD gating, approval policies, and audit logs), Bytebase integrates directly with Supabase's PostgreSQL database. That is most useful in team environments where several engineers are proposing schema changes and you need a structured process before anything reaches production.
Convex defines schemas in TypeScript using its defineSchema function:
// convex/schema.ts
import { defineSchema, defineTable } from "convex/server";
import { v } from "convex/values";
export default defineSchema({
messages: defineTable({
channelId: v.id("channels"),
body: v.string(),
author: v.string(),
}).index("by_channel", ["channelId"]),
});Schema changes ship alongside code. There is no separate migration file: you update the schema definition and Convex handles the rest. That is fast for a solo developer, but less auditable than SQL migration files once you're on a large team.
Authentication and security
Both platforms include auth out of the box.
Supabase Auth supports email/password, magic links, OAuth (Google, GitHub, and others), phone/SMS, SSO, and MFA. Authorization runs through PostgreSQL Row Level Security (RLS): you write SQL policies that control which rows each user can read or write. This keeps security logic close to the data and is easy to audit, though it does assume you're comfortable with SQL policy syntax.
Convex Auth provides JWT-based authentication with similar provider support. Authorization runs through query/mutation function logic in TypeScript: you check the user's identity inside the function before touching the database. If your team thinks in code rather than SQL policies, this pattern is easier to follow, though it does scatter security logic across function files rather than centralizing it in the database layer.
Neither is objectively better. It comes down to where your team is more comfortable reasoning about access control.
Pricing
Both platforms offer a free tier suitable for prototypes and personal projects.
| Convex | Supabase | |
|---|---|---|
| Free tier | Compute + storage allowance, no auto-pause | 500MB DB, 1GB storage, 50K MAUs; pauses after 7 days inactivity |
| Paid plan | Usage-based (function execution + storage) | $25/month per project + overages |
| Team plan | Custom | $599/month |
| Enterprise | Custom | Custom |
| Billing model | Pay-as-you-go | Predictable tiered |
| Self-hosting | Not available | Available (reduces cost) |
Supabase's pricing maps to database size and user counts, metrics teams already track, which makes it easier to forecast. Convex bills on function execution time, which is harder to estimate before launch. At medium scale (10K MAUs, 20GB database), Supabase Pro typically runs $27-$50/month with overages; Convex's cost depends heavily on how query-heavy your app turns out to be.
Open source and self-hosting
Supabase has been fully open-source since launch and can be self-hosted using Docker. The GitHub repository has nearly 98K stars. For organizations that cannot use managed cloud services because of compliance or data-residency requirements, Supabase is the only option of the two.
Convex open-sourced its backend infrastructure in February 2025 (GitHub, ~10K stars), but self-hosting is not a supported option yet. The open-source release means you can inspect the code, but running your own Convex instance is not a realistic path for most teams today. If avoiding vendor lock-in is a hard requirement, that is a real constraint.
When to choose Convex
- Your app is built primarily in TypeScript/React and you want type safety from database to UI with zero configuration
- Real-time collaborative features (multiplayer, live editing, presence) are central to your product, not an afterthought
- Your team has limited backend experience and you want to avoid SQL schemas, ORMs, and migration management
- You are building an AI application that needs vector search and reactive data updates in the same system
When to choose Supabase
- You need full SQL power (complex queries, joins, aggregations, stored procedures)
- Your team already knows PostgreSQL and wants to stay in that ecosystem
- Self-hosting or data-residency compliance is a requirement
- You want access to the broader Postgres extension ecosystem (PostGIS, pgvector, TimescaleDB, etc.)
- You need a predictable monthly bill rather than usage-based pricing
FAQ
Is Convex open source? Convex open-sourced its backend in February 2025. The source code for the server infrastructure is available on GitHub, but self-hosting is not officially supported. Supabase is fully open-source and self-hostable.
Can Supabase do real-time like Convex? Supabase has real-time subscriptions through PostgreSQL's Write-Ahead Log. It works well for event-driven notifications. Convex's reactive model is more automatic (every query becomes a live subscription) and provides stronger consistency guarantees. For deeply collaborative apps, Convex's approach requires less setup.
Does Convex use SQL? No. Convex queries and mutations are written as TypeScript functions. There is no SQL, no ORM, and no migration files. Schema is defined in TypeScript and deployed alongside your application code.
Which is better for AI applications?
Both platforms support vector search. Supabase uses the pgvector PostgreSQL extension; Convex has built-in vector storage alongside its document database. Convex's reactive model helps AI apps that need real-time data updates (for example, streaming chat with live context), while Supabase's full Postgres gives more flexibility for complex retrieval pipelines and hybrid search.
If you have already decided and need to migrate, here are the most useful resources:
Supabase → Convex
- Migrating from Supabase and Prisma to Convex – community walkthrough on dev.to
- Why I picked Convex over Firebase, Supabase, and Neon – developer story on the Convex blog
- Migrating data from Postgres to Convex – official Convex migration guide
Convex → Supabase
No genuine third-party migration stories exist yet: Convex is still relatively new and the community is small. The resources below are official ones from Convex and Supabase:
- How hard is it to migrate away from Convex? – Convex's honest take on lock-in
- Convex limitations – Convex's own page on where the platform falls short
- Migrating to Supabase – official Supabase migration docs
Related comparisons:
- Supabase vs Firebase
- Supabase vs AWS: Feature and Pricing Comparison
- Drizzle vs Prisma
- PostgreSQL vs MongoDB