The short answer#
There is no AWS button that says "Supabase."
Supabase is one box with everything inside. AWS is a shelf full of separate boxes. You can build the same thing on AWS, but you pick the boxes yourself and wire them together.
Which is better? It depends on one thing more than any other: how many people log into your app.
That sounds like a cop-out. It isn't. There's a specific number where the answer flips, and most comparison articles never mention it. We'll get there.
Part 1: What is actually inside Supabase?#
Think of Supabase as a lunchbox. One price, everything inside.
The same thing on AWS:
More power, more places to get charged. That's the trade in one picture.
Part 2: The piece-by-piece map#
| What Supabase gives you | The AWS version | How hard is the swap? |
|---|---|---|
| Postgres database | RDS for Postgres, Aurora Serverless v2, or Aurora DSQL | Easy |
| Auth (login, signup, social) | Cognito — or something else, see Part 5 | Medium |
| File storage | Amazon S3 | Easy |
| Edge Functions | AWS Lambda | Easy |
| Realtime (listen to table changes) | AppSync subscriptions or API Gateway WebSockets | Hard |
| Auto REST API from your tables | Nothing built in. You build it. | Hardest |
| Row Level Security | Postgres RLS works fine on RDS | Easy |
| pgvector for AI | Works on RDS and Aurora | Easy |
| Dashboard | The AWS Console. Several of them | It is what it is |
The one that hurts: Supabase runs PostgREST. You create a table, and a secured API appears. AWS has no equivalent. You write Lambda handlers or AppSync resolvers by hand, for every table, forever.
That's the real cost of moving. Not dollars. Hours.
Part 3: There are three ways to build this on AWS#
Most articles compare Supabase against option A only, which is why they usually conclude AWS is expensive. There are two more.
| A. AWS-native | B. AWS + app auth | C. Supabase components on AWS | |
|---|---|---|---|
| Database | RDS / Aurora | RDS / Aurora | RDS |
| Auth | Cognito | Better Auth or Auth.js in your app | GoTrue (Supabase Auth), self-hosted |
| API layer | Lambda you write | Lambda you write | PostgREST |
| Auth cost per user | $0.015/MAU after 10k free | $0 | $0 |
| Auto REST API | no | no | yes |
| Runs in your VPC | yes | yes | yes |
| You patch what? | nothing | one npm dependency | 2–4 containers |
Option C is the one people miss. PostgREST, GoTrue, storage-api, and realtime are separate open-source projects (PostgREST and GoTrue are MIT; Realtime and Storage are Apache 2.0). They're plain Docker containers. They don't need Supabase's control plane. Point them at your own RDS instance and you get Supabase's developer experience inside your own VPC.
Which also means Supabase isn't lock-in. It's the same software either way. Moving is a connection string and a container deploy, not a rewrite.
Part 4: What it costs#
All figures are us-east-1 list prices, mid-2026. Singapore (ap-southeast-1) runs roughly 10–20% higher. Verify on the official pricing pages before committing anything.
Scenario A — Small project#
1,000 users, 2 GB data, light traffic
| Supabase | AWS | |
|---|---|---|
| Database | Free tier, or Pro w/ Micro compute | RDS db.t4g.micro ~$12 |
| Auth | included | Cognito $0 (free tier) |
| Storage + functions | included | ~$3 |
| Base plan | $0 or $25 | — |
| Monthly | $0 – $25 | ~$15 – $20 |
Effectively a tie. AWS is a few dollars less, and you built the login screens and the API yourself.
Scenario B — Growing product#
10,000 users, 20 GB data, 300 GB traffic out
| Line item | Supabase | AWS (naive) | AWS (optimized) |
|---|---|---|---|
| Database compute | $5 (after credit) | $25 | $17 (Reserved) |
| Base plan | $25 | — | — |
| Storage | $1.50 | $5 | $4.50 |
| Auth | included | $0 | $0 |
| API layer | included | $8 | $3 |
| Data out | ~$5 | $18 | $0 (CloudFront) |
| NAT Gateway | n/a | $32 | $0 |
| RDS Proxy | n/a | $22 | $0 or $22 |
| Monthly | ~$36 | ~$110 | ~$25 – $47 |
Notice that $54 of the naive column is NAT Gateway plus RDS Proxy — plumbing that does no user-facing work. Part 6 removes it.
Scenario C — 100,000 users#
| Supabase | AWS + Cognito | AWS + app auth | |
|---|---|---|---|
| Auth | $0 (included) | ~$1,350 | $0 |
| Database | $110 – $210 | $200 – $850 | $200 – $850 |
| Everything else | ~$50 | ~$150 | ~$150 |
| Monthly | ~$325 | ~$1,600 | ~$220 |
Same AWS. Same VPC. Same isolation. One component swapped, and the bill moves by $1,380.
Part 5: The number that decides everything#
Cognito Essentials gives you 10,000 monthly active users free, then charges $0.015 per user per month. Supabase Pro includes 100,000.
So the crossover is around 12,000 monthly active users.
| Users | Supabase auth | Cognito auth |
|---|---|---|
| 5,000 | $0 | $0 |
| 10,000 | $0 | $0 |
| 25,000 | $0 | $225 |
| 50,000 | $0 | $600 |
| 100,000 | $0 | $1,350 |
Supabase ───────────────────────────── flat $0
Cognito ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +$150 per 10,000 users
Every optimization in this article combined saves maybe $70/month. Cognito at 50,000 users eats all of it and $530 more.
This is not AWS being expensive. It's one pricing model inside AWS aimed at a different customer. Cognito charges per user because it is built for large firms buying identity systems. There, $0.015 per employee is a rounding error. For consumer or SMB SaaS with many low-revenue users, it's the wrong meter.
Do you actually need Cognito?#
Cognito earns its place when:
- You need Identity Pools to hand browser clients temporary IAM credentials — direct-to-S3 uploads with no signing endpoint. Nothing else on AWS does this.
- You need managed SAML/OIDC federation for enterprise customers and don't want to run it.
- You're under 10,000 MAU, where it's free and there's nothing to patch.
Otherwise:
| Option | Cost | Works with RLS? | You maintain |
|---|---|---|---|
| Better Auth / Auth.js | $0 | Yes — sign a JWT with the claims Postgres expects | one npm dependency |
| GoTrue self-hosted | ~$9–12/mo | Yes, natively | one container |
| Keycloak | ~$38+/mo | Yes, with config | JVM, realms, upgrades |
| Cognito | $0 → $0.015/MAU | Awkward — see Part 7 | nothing |
| Clerk / Auth0 / WorkOS | per-MAU | Yes, custom JWT template | nothing |
Say the honest part: auth is the one component where a bug is a breach, not an outage. Self-hosting means you own CVE monitoring and patch cadence. That's a real cost and it isn't zero. Two things make it manageable. GoTrue is well tested, because Supabase runs it for everyone. And Better Auth is a library you upgrade with npm update, not infrastructure you run. Rolling your own session handling from scratch is a different and much worse idea.
Part 6: How to make the AWS version cheap#
| Component | Obvious way | Better way | Saves/month |
|---|---|---|---|
| Multiple projects | One database each | Shared database, schema per app | ~$75 |
| Idle database | Aurora Serverless v2 (0.5 ACU floor) | Aurora DSQL (scales to zero) | ~$40 |
| Private DB access | NAT Gateway | Data API, or VPC endpoints only | ~$32 |
| Data out (300 GB) | Straight from S3 | Through CloudFront | ~$18 |
| Connection pooling | RDS Proxy | Cap Lambda concurrency, or pgbouncer | ~$22 |
| API layer | API Gateway REST ($3.50/M) | Lambda Function URLs, or HTTP API ($1/M) | ~$5 |
| Steady database | On-demand | 1-year Reserved Instance | ~$8 |
| Auth above 12k MAU | Cognito | App-level auth or GoTrue | $150+ per 10k users |
| Block storage | gp2 | gp3 | ~20% |
| Watching the bill | nothing | Budgets + anomaly alerts + tags | $0 |
The four that matter most:
1. Delete the NAT Gateway. It costs ~$32/month plus $0.045/GB and exists only so private resources can reach the internet. Use Aurora's Data API and your Lambda doesn't need a VPC at all. If it must sit in a VPC, it still needs no NAT unless it calls the public internet. Gateway endpoints for S3 and DynamoDB are free.
2. Put CloudFront in front of everything. The always-free tier includes 1 TB out and 10 million requests a month, permanently. Origin fetches from S3 or an ALB are free. That's $18/month to $0 on the Scenario B traffic.
Two traps. CloudFront prices by edge location, not origin. Asia-Pacific edges — Singapore, Hong Kong, Japan — run $0.120/GB against $0.085 in North America. So past the free tier, an Asian audience costs about 40% more. And the flat-rate plan confusingly named "Free" gives only 100 GB and 1 million requests. The always-free tier is the better deal; don't subscribe to the plan.
3. Kill the idle database floor. Aurora Serverless v2 has a 0.5 ACU minimum, about $43.80/month even when idle. There are no Reserved Instances and no free tier. Aurora DSQL bills $8.00 per million DPUs plus $0.33/GB-month, and scales to zero. It includes 100,000 DPUs and 1 GB free each month.
DSQL does not support the full PostgreSQL feature set. No traditional statistics or vacuum, so the planner behaves differently and some queries need rewriting. Benchmarks show lower raw throughput than Serverless v2. Test your schema first.
4. Watch the RDS Proxy floor. It's $0.015 per vCPU-hour with a 2 vCPU minimum, so $21.90/month on a provisioned instance. On Aurora Serverless v2 it is per ACU-hour, with an 8 ACU minimum. That is $87.60/month even when the database sits at its floor. Skip it if you can cap Lambda concurrency below max_connections. Don't skip it if you can't — see the next part.
Part 7: Worked example — multi-tenant SaaS#
This is where the shape of your app changes the answer.
| Several separate apps | One multi-tenant SaaS | |
|---|---|---|
| Dominant cost driver | project count | monthly active users |
| Supabase's weakness | per-project billing | none — it's one project |
| AWS's weakness | none | Cognito, priced per user |
Supabase bills per project, so several small apps get expensive. Multi-tenant SaaS is one project, so that weakness disappears entirely and Cognito's per-user pricing becomes the whole story.
The three isolation models#
| Model | What it means | Cost | When |
|---|---|---|---|
| Pool | All tenants in one schema, tenant_id column, RLS separates them | Cheapest. One DB for 1,000 tenants | B2C, SMB SaaS, most startups |
| Bridge | One schema per tenant, same database | Middle. Connection pressure grows | ~100s of tenants |
| Silo | One database per tenant | Most expensive by far | Enterprise, regulated |
Pool is where the money is, and it's what Supabase is built for. RLS policies read auth.uid() and JWT claims; PostgREST honors them automatically. Tenant isolation is enforced by the database, not by your code.
That's a security property, not a convenience. In pool model, one forgotten WHERE tenant_id = ? is a cross-tenant data leak. RLS makes that mistake structurally impossible.
Where each option lands#
| Supabase managed | AWS + Cognito | AWS + GoTrue/PostgREST | |
|---|---|---|---|
| Tenant claim in JWT | built in | pre-token-generation Lambda | built in |
| RLS enforcement | automatic | manual SET LOCAL per transaction | automatic |
| Leak risk if you forget | none — DB enforces | real | none — DB enforces |
| Auth at 100k MAU | $0 | ~$1,350 | $0 |
| Inside your VPC | no | yes | yes |
The middle column has a hidden cascade. With Cognito you must open a transaction and run SET LOCAL app.tenant_id = '...' before every query, with RLS written against current_setting('app.tenant_id'). That breaks the Data API optimization from Part 6, because Data API is request-scoped. So you're back to VPC-attached Lambdas, back to connection pressure, and back to paying for RDS Proxy. Optimizations are not independent — that one cascades.
Cost at three stages#
B2B SaaS, ~100 seats per tenant
| Stage | Supabase Pro | AWS + Cognito | AWS + components |
|---|---|---|---|
| 20 tenants / 2k MAU | ~$30 | ~$60 | ~$50 |
| 200 tenants / 20k MAU | ~$75 | ~$230 | ~$90 |
| 1,000 tenants / 100k MAU | ~$325 | ~$1,600 | ~$220 |
Two things AWS gives a SaaS operator that Supabase can't#
Per-tenant cost attribution. You eventually need to know what each tenant costs to serve. It is how you price tiers and find accounts that lose money. Supabase gives you one number for the whole project. On AWS you can emit tenant-tagged CloudWatch metrics and build a real cost-per-tenant dashboard.
Compliance without a subscription. Supabase's Team plan is $599/month. It mostly buys SOC 2, SSO and longer backup retention, not more capacity. Your first enterprise customer will ask for SOC 2. On AWS that is your own audit, against systems you control. Real work, but not a recurring $599 line. At 200 tenants that's $7,188/year.
Part 8: When to use Supabase#
Be honest about what you're buying, because it's a lot.
You're pre-product-market-fit. Speed to a working product beats every number in this article. A month saved is worth more than $100/month forever.
You're under ~12,000 monthly active users and expect to stay there for a while. Below the crossover, Supabase is cheaper and less work. There is no argument for AWS here on cost.
You want auto-generated APIs. PostgREST is the single feature AWS has no answer to. Create a table, get a secured endpoint. On AWS you write that by hand for every table.
You have no ops capacity. Nobody patches GoTrue for you on AWS. Nobody upgrades PostgREST when the Postgres major version moves. Supabase does both silently.
You want a spend cap. Supabase ships cost control on by default. AWS does not. A runaway Lambda loop or a badly set up NAT Gateway has ruined months for people.
You need a dashboard today. Table editor, SQL editor, log viewer, auth user list. Building the equivalent on AWS is a project.
Auth being someone else's responsibility matters to you. This is a legitimate reason on its own. A breach is worse than a bill.
Part 9: When to use the AWS equivalent#
You're above ~12,000 MAU and growing. Past the crossover, the gap widens every month. At 100k users a well-built AWS stack runs roughly $100/month cheaper than Supabase. It is $1,380 cheaper than the naive AWS one.
You run several separate small apps. Supabase's $25 base is per organization, not per project. The 100,000 MAU, 250 GB egress and 100 GB file storage quotas all pool across every project in that org. Only compute and disk are per project, at $10/month for a Micro instance each. So four small projects is $25 + $40 − $10 credit = about $55.
AWS bills per account, so apps two, three, and four are nearly free on a shared database. AWS still wins here, but by less than the per-project framing suggests.
You need VPC isolation, IAM, or private networking. Supabase offers AWS PrivateLink, but only on the Team plan at $599/month. Say your database must sit in a private subnet, and you are not paying for Team. The decision is already made.
You need other AWS services. SQS, Step Functions, Bedrock, Rekognition, IoT Core. Staying in one account, one IAM boundary, one bill has real value.
You need per-tenant cost data. For a SaaS business this becomes a pricing requirement, not a nice-to-have.
Enterprise customers are asking for SOC 2 or HIPAA. At that point $599/month for the Team plan is worse than owning your own audit.
You already have AWS expertise on the team. Most of this article's difficulty evaporates if someone already knows what a VPC endpoint is.
Part 10: Pick in thirty seconds#
Part 11: The costs that aren't on any bill#
| Supabase costs you | AWS costs you | |
|---|---|---|
| Setup time | hours | days to weeks |
| Auto-generated API | free | you write every endpoint |
| Auth flows | free | free (Cognito) or you host it |
| Patching | none | GoTrue, PostgREST, engine versions |
| Bill surprises | capped by default | uncapped by default |
| Cost per extra project | +$10/month (compute) | ~+$2/month |
| Cost per extra 10k users | $0 | $150 (Cognito) or $0 (app auth) |
| Exit difficulty | low — it's standard Postgres | low — it's standard Postgres |
That last row is worth sitting with. Neither one locks you in. Supabase is permissively licensed open-source software (MIT and Apache 2.0) on standard Postgres. AWS is standard Postgres on RDS. The migration between them is a connection string and some deployment work — not a rewrite. This decision is reversible, so don't agonize over it.
The honest summary#
| Supabase | AWS | |
|---|---|---|
| Time to first working API | minutes | days |
| Cost at 1,000 users | $0 – $25 | $15 – $20 |
| Cost at 10,000 users | ~$36 | $25 – $110 |
| Cost at 100,000 users | ~$325 | $220 (app auth) / $1,600 (Cognito) |
| Cost for 4 small apps | ~$55 | ~$31 |
| Auto REST API | unless you self-host PostgREST | |
| VPC isolation, IAM | Team plan only ($599) | |
| Spend cap by default | ||
| Ops burden | near zero | real |
| Escape hatch to more services | limited | 200+ services |
Neither platform is the right answer. Supabase wins on time and simplicity. AWS wins on control and on cost above the crossover. Most teams should start on Supabase. Move only when a specific number or requirement forces it. And because it is the same underlying software, that move stays cheap.
Every AWS saving in this article comes from removing a managed convenience. Supabase sells you not having to think about any of this. You are trading that away for a smaller number on a bill.
Sometimes that's the right trade. Just make it on purpose.
Need a hand with this?#
Two situations where it helps to have someone who has already made these mistakes:
You're on Supabase and thinking about AWS. The migration is not hard. Getting it cheap is. Part 4's $220 stack and $1,600 stack differ by a handful of early decisions. Which auth layer. Whether a NAT Gateway sits in the path. How tenants are kept apart. Made in the wrong order, they're painful to unwind later.
You're already on AWS and the bill keeps climbing. Most over-spend I see isn't waste in the obvious sense. It is NAT Gateways nobody needed. RDS Proxy floors on tiny instances. Traffic leaving straight out of S3 instead of through CloudFront. And Cognito quietly metering users. None of it shows up as an idle resource, so cost tools don't flag it.
I'm a Software Engineer and AWS Network Engineer, and I do this work. If either sounds like your situation, message me on LinkedIn:
Happy to look at your architecture and tell you honestly whether moving is worth it. Sometimes the answer is "stay on Supabase" — Part 8 exists for a reason.
References#
- Amazon Cognito Pricing — AWS — https://aws.amazon.com/cognito/pricing/
- Supabase Pricing & Fees — Supabase — https://supabase.com/pricing
- Supabase Architecture (component licenses) — Supabase Docs — https://supabase.com/docs/guides/getting-started/architecture
- AWS Free Tier Data Transfer Expansion (CloudFront 1 TB, regional 100 GB) — AWS News Blog — https://aws.amazon.com/blogs/aws/aws-free-tier-data-transfer-expansion-100-gb-from-regions-and-1-tb-from-amazon-cloudfront-per-month
- Amazon CloudFront Pricing — AWS — https://aws.amazon.com/cloudfront/pricing/
- Amazon Aurora Pricing (Serverless v2 ACU rates) — AWS — https://aws.amazon.com/rds/aurora/pricing
- Amazon Aurora DSQL Pricing (DPU rates) — AWS — https://aws.amazon.com/rds/aurora/dsql/pricing/
- Amazon RDS Pricing (instance and Reserved Instance rates) — AWS — https://aws.amazon.com/rds/pricing/
- Amazon RDS Proxy Pricing — AWS — https://aws.amazon.com/rds/proxy/pricing/
- Amazon API Gateway Pricing (HTTP vs REST API) — AWS — https://aws.amazon.com/api-gateway/pricing/
- Supabase Compute Add-ons — Supabase Docs — https://supabase.com/docs/guides/platform/compute-add-ons
- Supabase Cost Control & Spend Cap — Supabase Docs — https://supabase.com/docs/guides/platform/cost-control
- Supabase Self-Hosting Guide — Supabase Docs — https://supabase.com/docs/guides/self-hosting
- PostgREST Documentation — https://postgrest.org
- AWS Pricing Calculator — https://calculator.aws/
Sources 1–5 were read directly and every figure in this article traced to them. Sources 6–10 are the official pages for the AWS database and API rates quoted here. Check them for your own region first.
One caveat worth stating. Third parties report the RDS Proxy minimum on Aurora Serverless v2 as an 8 ACU floor. That is about $87.60 a month. I could not confirm that on the AWS page. The provisioned-instance figure ($0.015/vCPU-hour, 2 vCPU minimum, $21.90/month) is well corroborated.
All prices are us-east-1 list rates verified in mid-2026. Singapore (ap-southeast-1) runs roughly 10–20% higher. Rates change frequently — Cognito's tiers have already shifted twice since November 2024. Verify before committing.
Frequently asked questions#
At how many users does Supabase stop being cheaper than AWS?
Around 12,000 monthly active users. Amazon Cognito includes 10,000 monthly active users free. After that it charges $0.015 per user per month. Supabase Pro includes 100,000 in its $25 base. Below roughly 12,000 MAU Supabase is both cheaper and less work; above it the gap widens every month.
How much does Cognito cost at 100,000 monthly active users?
About $1,350 per month. That single line turns a roughly $220/month AWS stack into a roughly $1,600/month one. The rest of the design is identical.
Is there an AWS equivalent of Supabase?
No single service. Supabase maps to AWS piece by piece. Postgres becomes RDS or Aurora. Auth becomes Cognito, or a library in your own app. Files go to S3, functions to Lambda. Realtime becomes AppSync or API Gateway WebSockets. The one piece with no AWS match is PostgREST. It turns a table into a secured REST API on its own. On AWS you write that by hand, for every table.
Does using Supabase lock you in?
No. Supabase is open-source software on a permissive licence, running on standard Postgres. PostgREST and GoTrue are MIT. Realtime and Storage are Apache 2.0. You can run the same containers against your own RDS instance. So moving is a connection string and a container deploy, not a rewrite.
What is the most expensive mistake on a small AWS stack?
Paying for plumbing that does no user-facing work. A NAT Gateway costs about $32 a month and an RDS Proxy about $21.90. Together that is roughly half the bill of a 10,000-user deployment. Both are avoidable — Aurora's Data API removes the need for a VPC-attached Lambda, and capping Lambda concurrency below max_connections removes the proxy.
Can you run Supabase inside your own AWS VPC?
Yes. PostgREST, GoTrue, storage-api and realtime are plain Docker containers that do not need Supabase's control plane. Run them on ECS against your own RDS instance and you get Supabase's developer experience with AWS network isolation — at the cost of patching them yourself.