Skip to main content
Back to Blog
Comparisons
3 min read
April 2, 2026

Convex vs Supabase vs Appwrite: Backend-as-a-Service Compared

Backend-as-a-Service platforms eliminate boilerplate server code. Compare Convex, Supabase, and Appwrite for real-time apps, auth, and storage.

Ryel Banfield

Founder & Lead Developer

Building a backend from scratch takes weeks. BaaS platforms provide databases, authentication, file storage, and real-time subscriptions out of the box. Three platforms lead the modern stack.

Architecture

Convex: Reactive database with server functions. Write TypeScript functions that automatically sync to the client in real-time. Not a traditional SQL database, more of a document store with relational capabilities.

Supabase: Open-source Firebase alternative built on PostgreSQL. Full SQL database with REST and real-time APIs, auth, storage, and edge functions.

Appwrite: Open-source BaaS with databases, auth, storage, functions, and messaging. Self-hosting or cloud-hosted. Language-agnostic.

Feature Comparison

FeatureConvexSupabaseAppwrite
DatabaseDocument store (reactive)PostgreSQLMariaDB-based
Query languageTypeScript functionsSQL + PostgRESTSDKs + REST API
Real-timeNative (automatic)Realtime channelsRealtime events
AuthenticationClerk/Auth0 integrationBuilt-in (GoTrue)Built-in
File storageBuilt-inBuilt-in (S3-compatible)Built-in
Server functionsBuilt-in (TypeScript)Edge Functions (Deno)Cloud Functions
Scheduled tasksBuilt-in (cron)pg_cron extensionScheduled functions
Full-text searchBuilt-inPostgreSQL FTSBuilt-in
Self-hostingNoYesYes
Schema managementCode-definedSQL migrationsDashboard/SDK
Type safetyEnd-to-end TypeScriptGenerated types (optional)SDK types

Developer Experience

Convex

// convex/messages.ts
export const list = query({
  handler: async (ctx) => {
    return await ctx.db.query("messages").order("desc").take(50)
  },
})

export const send = mutation({
  args: { body: v.string(), author: v.string() },
  handler: async (ctx, args) => {
    await ctx.db.insert("messages", args)
  },
})
// React component
function Chat() {
  const messages = useQuery(api.messages.list)
  const sendMessage = useMutation(api.messages.send)
  // messages auto-update in real-time, no setup needed
}

Key insight: Convex queries are reactive. When data changes, connected clients update automatically. No WebSocket setup, no subscription management, no cache invalidation.

Supabase

// Query
const { data: messages } = await supabase
  .from('messages')
  .select('*')
  .order('created_at', { ascending: false })
  .limit(50)

// Insert
await supabase.from('messages').insert({ body, author })

// Real-time subscription
supabase
  .channel('messages')
  .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' },
    (payload) => setMessages(prev => [payload.new, ...prev])
  )
  .subscribe()

Supabase gives you PostgreSQL power with a JavaScript client. Real-time requires explicit subscription setup.

Appwrite

// Query
const messages = await databases.listDocuments(
  DATABASE_ID, COLLECTION_ID,
  [Query.orderDesc('$createdAt'), Query.limit(50)]
)

// Insert
await databases.createDocument(
  DATABASE_ID, COLLECTION_ID, ID.unique(),
  { body, author }
)

// Real-time
client.subscribe(`databases.${DATABASE_ID}.collections.${COLLECTION_ID}.documents`,
  (response) => setMessages(prev => [response.payload, ...prev])
)

Appwrite works similarly to Supabase but with a document-oriented data model.

Pricing

Free Tiers

FeatureConvexSupabaseAppwrite
Database1M documents500 MB10 GB (self-hosted: unlimited)
Storage1 GB1 GB2 GB
Bandwidth1 GB/month5 GB/monthUnlimited (self-hosted)
Functions500K calls500K invocations750K executions
AuthVia Clerk/Auth050K MAUUnlimited

Paid Plans

PlanConvexSupabaseAppwrite
Entry$25/month$25/month$15/month
ProCustom$25/month + usageCustom

Performance

MetricConvexSupabaseAppwrite
Read latency5-20ms10-50ms10-50ms
Write latency10-30ms10-50ms20-80ms
Real-time delivery< 50ms100-500ms100-500ms
Cold start (functions)None (always warm)200-500ms (edge)500ms-2s

Convex's reactive system delivers real-time updates faster because it is designed around reactivity from the ground up.

When to Choose Each

Convex

  1. Real-time applications (chat, collaboration, live dashboards)
  2. TypeScript teams wanting end-to-end type safety
  3. Rapid prototyping (minimal boilerplate)
  4. Applications where reactivity matters (state syncs automatically)
  5. Serverless-first architecture

Supabase

  1. PostgreSQL is required (existing schema, extensions like pgvector)
  2. Row-level security for multi-tenant applications
  3. Self-hosting requirement (data sovereignty)
  4. Complex SQL queries (joins, aggregations, CTEs)
  5. Existing PostgreSQL expertise on the team
  6. Auth as a core feature (built-in, not third-party)

Appwrite

  1. Self-hosting is a hard requirement
  2. Multi-platform (web + mobile with native SDKs)
  3. Open-source commitment (fully open-source)
  4. Simple document storage (not complex relational queries)
  5. Budget-conscious (self-hosted = only infrastructure costs)

Our Approach

We evaluate BaaS platforms per project. For real-time collaborative applications, Convex is our first choice. For projects needing PostgreSQL, complex queries, or self-hosting, Supabase is our recommendation. We use Appwrite when clients have strong self-hosting requirements and simpler data models.

For most business websites and applications, we build with Next.js + PostgreSQL (Neon or Supabase) for maximum flexibility.

Contact us to discuss backend architecture for your application.

ConvexSupabaseAppwriteBaaSbackendcomparison

Ready to Start Your Project?

RCB Software builds world-class websites and applications for businesses worldwide.

Get in Touch

Related Articles