Orange Book
Reference

D1 vs Supabase and Neon: edge SQLite or serverless Postgres

Compare Cloudflare D1, Supabase, and Neon across runtime model, SQL, capacity, consistency, platform scope, and billing dimensions.

Edited and verified by Orange Book Editorial Team ·

DECISION GUIDEDATABASE28 minVerified: 2026-08-27
Three abstract database architectures representing an edge-native database, an integrated backend platform, and branched compute and storage
A Codex ImageGen concept illustration, not a vendor topology; the precise runtime models are in the technical diagram below.

These products live at different layers

D1 is a serverless SQLite database tightly integrated with Workers Bindings. Supabase is a BaaS built around full PostgreSQL plus Auth, Storage, Realtime, APIs, and other services. Neon is serverless Postgres with separated compute and storage, autoscaling, and database branching. Choose the application abstraction before comparing quotas.

Three runtime models

Comparison of D1, Supabase, and Neon database runtime models
The same relational data reaches a database through three interfaces, changing connection, platform, and extension boundaries.Open original
Detailed description
On the left, a Worker uses a D1 Binding or Sessions API to reach a SQLite primary and optional read replicas. In the middle, an application uses a Supabase SDK, generated API, or connection string to combine Auth, Realtime, Storage, and full PostgreSQL. On the right, a standard Postgres driver reaches Neon's autoscaling compute and then separated storage and branches.
  1. 01
    D1

    The app targets a Binding and SQLite, dropping pool management while accepting per-database and write-model boundaries.

  2. 02
    Supabase

    The database anchors a larger platform that can include Auth, Storage, Realtime, and generated APIs.

  3. 03
    Neon

    The app retains a standard Postgres interface while gaining autoscaling, scale-to-zero, and branches.

DimensionCloudflare D1SupabaseNeon
Database engineSQLite semantics, managed by CloudflareFull PostgreSQLFull PostgreSQL with separated compute and storage
Application interfaceWorkers Binding, Sessions API, HTTP API/toolingSDKs, generated REST/GraphQL capabilities, standard connection stringsStandard Postgres connections, serverless driver, common ORMs
Platform scopeDatabase composed with Workers, Queues, R2, and other bindingsDatabase plus Auth, Storage, Realtime, Functions, and a broader BaaSServerless Postgres, branching, autoscaling, and database development workflow
Scaling modelQueries execute serially per database; split by tenant or boundaryDedicated compute per project, scaled by plan and instance resourcesAutoscaling compute can idle to zero while storage grows separately
Global readsRead Replication requires the Sessions API; writes still reach the primaryDepends on project region and available read-replica featuresDepends on regions and read-replica/compute configuration
Capacity boundaryPaid hard limit of 10 GB per database; designed for many databases when appropriateProject compute, disk, and plan support a larger single Postgres databaseCompute, storage, and plan support a larger single Postgres database
StrengthWorkers-native, no connection pool, row/storage billing, tenant shardingIntegrated backend, RLS, extensions, realtime, auth, and storageStandard Postgres compatibility, branching, previews, elastic compute
Main tradeoffSQLite/Postgres differences, hard per-DB limit, serial hot-write pathsLarger platform surface; compute, disk, egress, and features shape the billCorrect connection, region, wake-up, and CU-hour design still matters

D1 limits shape the data model

According to D1 Limits, a Free database is capped at 500 MB and a Paid database has a hard 10 GB limit. A single database executes queries sequentially. This fits a tenant, site, workspace, or project-per-database architecture; it is a poor excuse to force a continuously growing analytics warehouse into one database.

D1 Read Replication creates global read replicas, but the application must use the Sessions API and bookmarks for sequential consistency. Writes still return to the primary. It is not multi-primary and does not remove contention on a hot row or database.

D1 follows SQLite conventions and supports the documented extensions. Before moving a Postgres application, inspect types, extensions, functions, concurrent transactions, and ORM-generated SQL—not just a simple SELECT.

Billing units are not interchangeable

PlatformBilling shapeHow to interpret included usage
D1Rows read, rows written, and storage; no D1 egress charge, while Workers is billed separatelyFree includes 5 million rows read and 100,000 rows written per day plus 5 GB total; Paid includes 25 billion reads, 50 million writes, and 5 GB monthly before overage
SupabaseOrganization plan plus dedicated compute per project, then disk, egress, and feature usageIt is a full backend-platform bill, not just database capacity; calculate from current Supabase Billing organization and project units
NeonCU-hours, storage, history, and additional capabilitiesFree, Launch, and Scale include different compute and storage; reprice from Neon Pricing with the actual active/idle curve

At the verification date, D1 Paid overage lists $0.001 per million rows read, $1 per million rows written, and $0.75/GB-month. Neon's public page lists Launch compute at $0.106/CU-hour and storage at $0.35/GB-month. The units are fundamentally different: scanned/written rows versus Postgres compute time and storage. The smaller number does not declare a winner.

Rows read are not API requests

One unindexed query can scan many rows, so a D1 model must record rows_read, not only HTTP requests. Conversely, Postgres connections, active compute, instance size, disk, and egress cannot honestly be compressed into a fake “cost per request.”

Choose by application boundary, not popularity

D1 is a stronger fit when

  • A Workers-native SaaS, CMS, or small API can isolate each tenant or site in its own database.
  • Relational data is bounded and the team wants a Binding instead of pools and public database credentials.
  • Reads dominate, indexes are explicit, and writes can reach one primary.
  • D1 metadata composes with R2 files, Queue jobs, and Durable Objects coordination.

Supabase is a stronger fit when

  • The team needs Auth, Storage, Realtime, RLS, and generated APIs around the database and accepts an integrated platform.
  • The application depends on Postgres extensions, complex SQL, triggers, or database authorization.
  • An AI-generated SaaS or CMS frontend needs mature backend capabilities quickly, while the team will still review RLS and key boundaries.

Neon is a stronger fit when

  • Standard PostgreSQL, ORM, and driver compatibility are mandatory, with autoscaling or scale-to-zero compute.
  • Every pull request or preview needs a database branch, or test-data workflow is a major bottleneck.
  • The database is the main boundary and an integrated BaaS abstraction is not required.
Database decision flow based on Workers-native sharding, integrated BaaS, and standard Postgres branching needs
The flow identifies a strong candidate; migrate only after a representative schema, query, and concurrent-write prototype.Open original
Detailed description
First decide whether the app is Workers-native, shardable by a real boundary, and below 10 GB per database; if yes, D1 is a candidate. Otherwise test the need for integrated Auth, Storage, and Realtime to select Supabase, then standard Postgres, ORM, and branching needs to select Neon. If none fits, continue evaluating other databases.

Constraints matter more than asking AI to “pick a database”

For the internal Cloudflare storage boundary, read KV, D1, R2, and Durable Objects. After selecting D1, use the migration, local verification, and Time Travel release guide. Runnable examples include Workers + D1 API, multi-tenant SaaS, and content CMS.

Official and vendor sources

Did this page help you complete your goal?

Beta feedback is generated in this browser and is never uploaded automatically.

On this page