Supabase to AWS migration: what it costs, what moves, and when to stay.
Supabase is Postgres with five services around it: Auth, Storage, Edge Functions, Realtime and an auto-generated API. In a Supabase to AWS migration the database is the easy part to move; the rest is where the time goes. Below: Supabase pricing against AWS at three illustrative sizes, the honest alternatives (including staying), and the step-by-step plan we use to migrate Supabase to AWS, with cutover and rollback. Follow it yourself, or have us run it as a fixed-scope project.
Facts checked: 31 Oct 2026. Prices checked: 31 Oct 2026, us-east-1
How hard is it to migrate Supabase to AWS?
The database is the easy part: it's plain Postgres, and logical replication to RDS keeps downtime to a short write pause. The work is in the services around it, so a Supabase migration is five small moves, not one big one.
Every Supabase project is a Postgres database plus a set of open-source services Supabase runs for you. Its own self-hosting guide lists them, among others: Auth, PostgREST, Realtime, Storage, the Edge Runtime for functions, Supavisor for connection pooling and the Studio dashboard. Moving to AWS means deciding, one by one, what replaces each of them, and which ones you keep.
| Supabase part | How hard to move | Why |
|---|---|---|
| Database (Postgres) | Easy to moderate | It's plain Postgres. Logical replication to RDS works, so downtime can be a short write pause. |
| Auto-generated API (PostgREST) and Row Level Security | Moderate | If your frontend calls the database through supabase-js, something on AWS has to answer those calls. You run PostgREST yourself, or write the API. |
| Auth | The real decision | Keeping Supabase Auth is a legitimate choice. Moving it changes your sign-in flow and, at scale, your bill. |
| Storage | Easy | Supabase Storage speaks the S3 protocol, so files copy to S3 with ordinary tools. |
| Edge Functions and Realtime | Depends on use | Deno functions need porting or a container. Realtime needs a replacement only if you actually use it. |
Should you move from Supabase to AWS?
Stay if the bill is small and the team is tiny. Move when the bill passes about $300 a month, a customer asks for SOC 2 or data in your own cloud account, or you have AWS credits to spend.
| If this is you | Our advice |
|---|---|
| Supabase Pro under $100 a month, team of one to three, no compliance asks | Stay. AWS costs more at this size and takes more of your time. |
| Bill past $300 a month and climbing with users, files or egress | Price it properly, using section 04. Moving often pays, but only if Auth doesn't eat the savings. |
| An enterprise customer wants SOC 2, a private network, or data in your own cloud account | Move the database, at least. Supabase's SOC 2 report and AWS PrivateLink both start on the Team plan at $599 a month. |
| You have AWS Activate credits and nothing to spend them on | Move. Credits pay AWS bills; they can't pay Supabase. |
| The rest of your stack already runs on AWS | Move the database into the same VPC. You'll stop paying for traffic between clouds and stop managing two sets of access. |
| Launching something big in the next 8 weeks | Wait until after the launch. |
Credits end, and when they do the bill lands all at once. If yours end in the next year, read what happens when AWS credits end before you size anything. If the app began as a Lovable or Bolt project, read taking a vibe-coded app to production first: it covers the RLS and API key checks worth doing before any move.
Checked 31 Oct 2026 on Supabase's own pages.
Sources: Supabase pricing, Compute and disk, Backups, IPv4 add-on, Cost control.
How much does Supabase cost per month in 2026?
Pro starts at $25 a month and Team at $599, but Supabase cost per month is a plan fee, plus a compute size per project, plus usage over the plan's quotas. The plan fee is the smallest part once you grow.
| Free | Pro | Team | |
|---|---|---|---|
| Plan fee | $0 | from $25 a month | from $599 a month |
| Compute credits | none | $10 a month, one Micro | $10 a month, one Micro |
| Database size included | 500 MB | 8 GB disk per project, then $0.125 /GB | 8 GB disk per project, then $0.125 /GB |
| Monthly active users included | 50,000 | 100,000, then $0.00325 per MAU | 100,000, then $0.00325 per MAU |
| File storage included | 1 GB | 100 GB, then $0.0213 /GB | 100 GB, then $0.0213 /GB |
| Egress included | 5 GB | 250 GB, then $0.09 /GB | 250 GB, then $0.09 /GB |
| Edge Function invocations | 500,000 | 2 million, then $2 per million | 2 million, then $2 per million |
| Realtime messages / concurrent connections | 2 million / 200 | 5 million / 500 | 5 million / 500 |
| Daily backups kept | none | 7 days | 14 days |
| SOC 2 and ISO 27001 | not included | not included | included |
| AWS PrivateLink | not included | not included | included |
| Inactive projects | paused after 1 week | never paused | never paused |
| Compute size | CPU | RAM | Per month |
|---|---|---|---|
| Micro | Shared | 1 GB | $10 |
| Small | Shared | 2 GB | $15 |
| Medium | Shared | 4 GB | $60 |
| Large | 2 vCPU dedicated | 8 GB | $110 |
| XL | 4 vCPU dedicated | 16 GB | $210 |
| 2XL | 8 vCPU dedicated | 32 GB | $410 |
| 4XL | 16 vCPU dedicated | 64 GB | $960 |
Four things move a Supabase bill more than the plan does:
- Compute is per project. The $10 credit covers one Micro. A staging project, or a second app, is another compute line.
- Users over 100,000. At $0.00325 each, 200,000 extra MAU is $650 a month.
- Point-in-time recovery. $100 a month per 7 days of retention. Without it you have daily backups only.
- Egress past 250 GB, at $0.09 per GB uncached and $0.03 cached.
Spend caps are on by default on Pro: usage past a covered quota is disallowed until the next billing cycle instead of billed. Compute, PITR and the IPv4 add-on aren't covered by the cap. Two facts matter during a migration: database backups don't include files stored through the Storage API, and the direct database connection is IPv6 unless you buy the IPv4 add-on at $0.0055 an hour (about $4 a month).
Illustrative bills, not clients. On-demand list prices, us-east-1, checked 31 Oct 2026, 730 hours a month. Excludes logs, CloudWatch, NAT data processing, email sending and your team's time.
Sources: Supabase pricing, RDS for PostgreSQL pricing, Fargate pricing, S3 pricing, ELB pricing, VPC pricing, EC2 data transfer, Cognito pricing, RDS backup storage. AWS rates read from the AWS Price List API.
Supabase cost vs AWS: is AWS cheaper? Three illustrative bills.
Not for a small app: Supabase Pro at $25 a month beats about $92 on AWS. From the medium size up, AWS with RDS is cheaper, by about $150 a month at our medium size and about $1,000 at the larger one, unless you swap Supabase Auth for Cognito.
| Illustrative app | Supabase | AWS, Supabase Auth self-run | AWS, Cognito Lite instead |
|---|---|---|---|
| Small: 2 GB database, 10 GB files, 20,000 MAU, 50 GB egress | $25 a month | about $92 a month | about $138 a month |
| Medium: 50 GB database, 200 GB files, 150,000 MAU, 400 GB egress, PITR | about $358 a month | about $205 a month | about $912 a month |
| Larger: SOC 2 asks, 200 GB database, 500 GB files, 300,000 MAU, 2 TB egress, PITR | about $1,639 a month | about $637 a month | about $2,034 a month |
| Who does the operations work | Supabase runs the platform. | RDS and Fargate patch the hosts. Someone on your side, or us, owns the Terraform, upgrades, alerts and on-call. | |
| Network | Supabase's network, reached over the internet. AWS PrivateLink from the Team plan up. | Your own VPC: database in private subnets, security groups, PrivateLink. | |
| Credits | AWS Activate credits can't pay a Supabase bill. | Activate credits pay for all of it. | |
How we priced it. Supabase: Small is Pro with the included Micro. Medium is Pro ($25), Medium compute ($60 less the $10 credit), 42 GB extra disk ($5.25), 7-day PITR ($100), 50,000 extra MAU ($162.50), 100 GB extra files ($2.13) and 150 GB extra egress ($13.50). Larger is Team ($599), Large compute ($110 less $10), 192 GB extra disk ($24), PITR ($100), 200,000 extra MAU ($650), 400 GB extra files ($8.52) and 1,750 GB extra egress ($157.50). All egress priced as uncached. AWS: Small is RDS db.t4g.micro Single-AZ ($11.68) with 20 GB gp3 ($2.30), one Fargate task for PostgREST and one for Supabase Auth (0.25 vCPU, 0.5 GB, $9.01 each) and S3. Medium is db.t4g.medium Single-AZ ($47.45) with 50 GB gp3, two 0.5 vCPU, 1 GB API tasks ($18.02 each), two Auth tasks, S3 ($4.60) and 300 GB of egress over the free 100 GB ($27). Larger is db.m7g.large Multi-AZ ($246.01) with 200 GB Multi-AZ gp3 ($46), four API tasks, two Auth tasks, S3 ($11.50) and 1,900 GB billed egress ($171). Every AWS column includes an Application Load Balancer ($16.43 plus $5.84 per LCU, one LCU on Medium and two on Larger), one NAT gateway ($32.85) and three public IPv4 addresses ($10.95). RDS automated backups with point-in-time restore are included up to the size of the database. The Cognito column swaps the Auth tasks for Cognito Lite: 10,000 MAU free, $0.0055 per MAU to 100,000, then $0.0046.
Two things stand out. First, at the small size Supabase is very good value and AWS can't match it: the load balancer, NAT gateway and IP addresses cost about $60 before anything runs. Second, Auth decides the medium and large bills. Supabase charges $0.00325 per MAU over 100,000; Cognito Lite charges $0.0055, then $0.0046. A team that moves to AWS and Cognito because "AWS is cheaper" can end up paying more. Running Supabase Auth yourself, or keeping hosted Supabase Auth, avoids that.
- Pro plan, small app, no compliance asksStay on Supabase.
- Bill driven by compute, disk, PITR or egressAWS usually wins once you're past $300 a month.
- Bill driven by MAUKeep Supabase Auth, hosted or self-run. Don't swap it for Cognito on price.
- Team plan only for the SOC 2 reportAWS, with your own controls. Read SOC 2 for startups on AWS.
Checked 31 Oct 2026 on each vendor's own page.
Sources: Supabase pricing, Supabase self-hosting, Supabase JWT signing keys, Neon pricing.
What are the Supabase alternatives on AWS?
There are four: stay on Supabase, split (database to RDS, hosted Supabase Auth kept), self-host Supabase on AWS, or go AWS-native with RDS, ECS, S3 and Cognito or your own auth. "Leave Supabase" covers four quite different projects. Here's how we see them.
| Option | What moves | Good at | Falls short when | We'd recommend it when |
|---|---|---|---|---|
| Stay on Supabase (Pro or Team) | Nothing. | The least work. Auth, Storage, Realtime and the API stay one product. | A customer wants your data inside your own AWS account, or MAU and compute make the bill climb. | Small teams with a small bill, and anyone mid-launch. |
| Split: database to RDS, keep hosted Supabase Auth | The database, files and functions. | Users sign in exactly as before. Your API on AWS verifies Supabase tokens against the public JWKS endpoint, if you use asymmetric signing keys. | Your tables reference auth.users with foreign keys. Those can't cross databases, so you keep a local copy of user IDs in sync. | The bill or the compliance ask is about the database, not about sign-in. |
| Self-host Supabase on AWS | Everything, onto servers you run. | Your code barely changes: same APIs, same supabase-js. | You now operate seven or more services. Supabase lists branching, managed backups and PITR among the features self-hosting doesn't have. | Rarely. Section 12 explains why. |
| AWS-native: RDS, ECS, S3, and Cognito or your own auth | Everything, onto AWS managed services. | Private networking, one bill, Activate credits, the setup enterprise security reviews expect. | It's the most work, and Cognito changes the sign-in flow and costs more per user than Supabase Auth. | You're already on AWS, have credits, or need SOC 2 evidence from your own account. |
If all you want is managed Postgres somewhere else, Neon is a common Supabase alternative: its Launch plan bills $0.106 per compute-unit hour and $0.35 per GB-month of storage, with no monthly minimum, and SOC 2 and HIPAA are listed on its Scale plan. It's a database host, though, not a full Supabase replacement, and it doesn't put the database in your AWS account.
The split is the option teams overlook most. It moves the part that costs money and draws security questions, and leaves the part your users touch alone. You can move Auth later, or never.
How to migrate Supabase to AWS, step 1: write down everything Supabase does for you.
Supabase hides a lot inside the database. Get the list with SQL against the project, not from memory:
select extname, extversion from pg_extension;for extensions. Check each against the RDS list. On RDS for PostgreSQL 17,vector(pgvector),pg_cron,postgis,pg_stat_statementsandpgauditare available.pg_net,pg_graphql,pgsodium,supabase_vault,pgjwt,httpandwrappersaren't in the RDS table.select * from pg_policies;for every Row Level Security policy, and which ones callauth.uid()orauth.jwt().select * from cron.job;if you usepg_cron, and every trigger that callsnet.http_post. Supabase Database Webhooks are triggers built onpg_net, which RDS doesn't have.- Row counts and sizes per schema:
publicand your own schemas,authif Auth is moving,storagefor file metadata. - Storage buckets, their sizes, and which are public.
- Edge Functions, their secrets, and what calls them.
- Auth providers (email, magic links, Google, GitHub), SMTP settings, redirect URLs and email templates.
Then search the frontend and mobile code for createClient, .from(, .rpc(, .channel( and storage.from(. That shows how much of your app talks to Supabase directly, and it's usually more than people think.
Target architecture
Why not Kubernetes: ECS vs EKS for startups.
Aurora rate: Aurora pricing, read from the AWS Price List API, 31 Oct 2026.
Step 2: pick a boring target architecture.
- Supabase PostgresAmazon RDS for PostgreSQL, or Aurora PostgreSQL
- Auto-generated REST APIPostgREST on ECS Fargate, or your own API on ECS
- Supabase AuthKeep hosted, self-run it on Fargate, or Amazon Cognito
- StorageAmazon S3, with CloudFront in front of public files
- Edge FunctionsLambda (Node.js) or a container on ECS
- RealtimeAppSync Events, API Gateway WebSockets, or keep Supabase Realtime
- Supavisor poolerRDS Proxy or PgBouncer in a container
- Vault secretsSecrets Manager and SSM Parameter Store
- pg_cron jobspg_cron on RDS, or EventBridge Scheduler
We default to RDS for PostgreSQL. It's the closest thing to the single Postgres instance you have on Supabase, and the cheapest to run at startup size. Aurora PostgreSQL makes sense when you want fast failover or several readers; Aurora Serverless v2 bills $0.12 per ACU-hour in us-east-1, which is worth pricing if your load is spiky.
Database in private subnets, one AWS account per environment, every resource in Terraform. Supabase's dashboard was your documentation; the Terraform repo replaces it.
What maps to what
Sources: Storage S3 compatibility, Edge Functions, Lambda runtimes, Realtime, RDS aws_lambda, Supabase backup and restore.
Step 3: map every Supabase feature to AWS, or decide to keep it.
| Supabase | On AWS | Watch out for |
|---|---|---|
| Postgres database | RDS for PostgreSQL | Match or exceed the major version. Step 4 covers the move. |
| PostgREST API and RLS | PostgREST on Fargate, or your own API | RLS keeps working on RDS. auth.uid() doesn't exist there until you create it. Step 6. |
| Auth | Keep, self-run, or Cognito | Password hashes are bcrypt and can be exported. Step 5. |
| Storage | S3 | Database backups don't include the files. Copy them separately, and replace storage RLS policies with presigned URLs from your API. |
| Edge Functions (Deno) | Lambda on Node.js, or Deno in a container on ECS or Lambda | Deno isn't one of Lambda's managed runtimes. Port small functions to Node.js; package bigger ones as container images. |
| Realtime: Broadcast, Presence | AppSync Events or API Gateway WebSockets | Client code changes. AppSync Events is $1 per million operations plus $0.08 per million connection-minutes. |
| Realtime: Postgres Changes | Publish events from your API after writes, or run Supabase Realtime yourself | Self-run Realtime needs logical replication turned on in RDS. |
Database Webhooks (pg_net) | The aws_lambda extension, or events from the app | A private RDS instance needs a NAT gateway or a Lambda VPC endpoint to reach Lambda. |
| Vault and encrypted columns | Secrets Manager, KMS | Supabase says backups never contain the root key. Decrypt, or copy the key across, before you shut the project down. |
| pg_cron | pg_cron on RDS | Available on RDS for PostgreSQL 17. Recreate the jobs; they live in the cron schema. |
GraphQL (pg_graphql) | No managed equivalent on RDS | Flag it early. It means another GraphQL layer, or moving those calls to REST. |
One rule covers the whole list: anything you aren't using, don't migrate. Many Supabase apps turn on Realtime or Edge Functions once and never use them. The inventory in step 1 tells you which.
Postgres to RDS
Sources: Supabase: replicate to external Postgres, RDS logical replication, PostgreSQL replication restrictions, PostgreSQL publications and replica identity, Supabase dump commands, Supabase IPv4.
Step 4: migrate Supabase Postgres to RDS with a short write pause.
Use pg_dump and pg_restore for a database of a few GB, and logical replication for anything bigger. This is where Supabase is easier to leave than Heroku (compare our Heroku to AWS migration guide). Supabase documents replicating a project to an external Postgres with native logical replication, so a copy on RDS can stay in sync while Supabase keeps serving traffic.
| Option | How it works | Downtime | Use it when |
|---|---|---|---|
| Dump and restore | Stop writes, pg_dump -Fc your schemas with --no-owner --no-acl, restore into RDS with pg_restore --jobs, point the app at RDS. | Writes stop for the whole dump and restore. | Databases of a few GB, where the rehearsed window is minutes. |
| Logical replication | Publication on Supabase, subscription on RDS. Initial copy, then ongoing changes. At cutover, stop writes, wait for lag to reach zero, switch. | A short write pause at the switch. | Larger databases, or any app where a long maintenance window hurts. |
How to set up logical replication from Supabase to RDS.
- Schema first. Logical replication doesn't copy the schema. Dump your own schemas with
pg_dump --schema-onlyand apply them to RDS. Leave Supabase-managed schemas out unless that part is moving. - Connectivity. Supabase says replication needs a direct connection, not the pooler, and the direct connection is IPv6 unless you enable the IPv4 add-on. An RDS instance in private subnets reaches the internet over IPv4 through a NAT gateway, so turn the add-on on for the weeks of the migration (about $4 a month).
- Publication and slot on Supabase. Create a publication with your tables and a
pgoutputreplication slot, as Supabase's guide shows. - Subscription on RDS. Create the subscription with
create_slot=falseandcopy_data=true. RDS supports publications and subscriptions natively; you need the master user, which hasrds_superuser. - Watch it. Check
pg_stat_replicationon Supabase. An unread slot keeps WAL around and fills the disk, so drop the slot if you abandon the attempt.
Four rules from the PostgreSQL docs catch people. Schema changes aren't replicated, so freeze migrations until cutover. Sequences aren't replicated, so at cutover run setval on every sequence on RDS, or the first insert fails with a duplicate key. Large objects aren't replicated at all. And a table without a primary key, once it's in a publication that replicates updates and deletes, rejects UPDATE and DELETE on Supabase itself, in production. Find those tables in step 1 and give them a primary key, or a replica identity, before you create the publication.
Rehearse either option at least twice against a fresh copy and time every stage. Fix the errors here, not on the night. The usual ones are extensions missing on RDS, grants to roles RDS doesn't have (anon, authenticated, service_role), and objects owned by supabase_admin.
Auth
Sources: Supabase Auth repository, Supabase signing keys, Cognito user import, Cognito migrate user trigger, Cognito pricing, WorkOS on Supabase hashes.
Step 5: Supabase Auth vs Cognito: keep it, self-run it, or move?
Keeping Supabase Auth, hosted or self-run, changes nothing for your users and is usually cheaper. Cognito costs more per active user once you pass its free 10,000 MAU. Three choices, in order of effort.
- Keep hosted Supabase Auth. Users sign in as before. Your API on AWS verifies access tokens against
https://<project>.supabase.co/auth/v1/.well-known/jwks.json, which works when the project uses asymmetric signing keys. You keep paying the Supabase plan and the MAU line. - Run Supabase Auth yourself. It's an MIT-licensed Go server that takes a Postgres connection string, so it runs on Fargate against RDS. User records and password hashes carry over with the
authschema; plan for existing sessions to end unless you move the signing keys too. The README is blunt that running an auth server in production is hard; you own security updates, SMTP (Amazon SES works) and a TLS proxy in front. - Move to Amazon Cognito. Supabase stores passwords as bcrypt hashes in
auth.users.encrypted_password, and Cognito's CSV import now accepts bcrypt hashes, with a maximum cost factor of 12. Imported users sign in with their existing passwords. OAuth-only users have no hash; social identities live inauth.identities. The alternative is Cognito's migrate-user Lambda trigger, which checks each password against the old store at first sign-in.
Check the cost factor in your own hashes (the number after $2a$) before you plan the Cognito route, and test a sample import first. Users imported with hashes must use USER_PASSWORD_AUTH until their first sign-in, not SRP, so your client code may change.
| Monthly auth cost at | 20,000 MAU | 150,000 MAU | 300,000 MAU |
|---|---|---|---|
| Supabase Auth, on top of the plan fee | $0 | $162.50 | $650 |
| Cognito Lite (passwords, social, SAML, MFA) | $55 | $725 | $1,415 |
| Cognito Essentials (adds passkeys, email OTP) | $150 | $2,100 | $4,350 |
| Supabase Auth self-run on Fargate | about $9 | about $18 | about $18 |
Cognito: 10,000 MAU a month free on Lite and Essentials, with no expiry; Lite $0.0055 per MAU to 100,000 then $0.0046; Essentials $0.015 above the free tier. Self-run: one or two 0.25 vCPU, 0.5 GB Fargate tasks, excluding email sending and the time to run it.
Step 6: Supabase RLS and PostgREST on RDS: what to recreate.
Row Level Security is a Postgres feature, not a Supabase one, so your policies work on RDS unchanged. What they depend on is Supabase's: auth.uid() and auth.jwt() read the signed-in user's token claims, which PostgREST puts into the transaction as the request.jwt.claims setting, and the anon and authenticated roles it switches into.
If you keep the browser talking to the database through supabase-js, run PostgREST as a Fargate service behind the load balancer, create the same roles on RDS, and recreate the two helpers. A minimal sketch, to adapt and test:
create schema if not exists auth;
create or replace function auth.uid() returns uuid language sql stable as $$
select nullif(current_setting('request.jwt.claims', true)::json->>'sub', '')::uuid
$$;
create or replace function auth.jwt() returns jsonb language sql stable as $$
select coalesce(current_setting('request.jwt.claims', true), '{}')::jsonb
$$;
If you'd rather have a normal backend, your API sets the same setting at the start of each transaction (set_config('request.jwt.claims', ..., true)) and switches role, and the policies keep protecting every row. Either way, keep RLS. It's the reason a bug in one endpoint doesn't leak every customer's data.
Supabase's own advice still applies after the move: base policies on raw_app_meta_data, never raw_user_meta_data, which users can edit themselves.
Prices: us-east-1, checked 31 Oct 2026.
Sources: Supabase self-hosting, Self-hosting with Docker, EC2 pricing, EBS pricing. Rates read from the AWS Price List API.
How to self-host Supabase on AWS, and what it costs.
Run the official Docker Compose stack on one EC2 instance: about $108 a month for the machine, disk and IP address, before backups, failover and the time to run it. It's the middle path between hosted Supabase and AWS-native.
Supabase's supported way to self-host is Docker Compose. The guide asks for 4 GB of RAM, 2 cores and 40 GB of SSD as a minimum, and recommends 8 GB or more, 4 cores and 80 GB.
| Line item, us-east-1 | Per month |
|---|---|
| EC2 t4g.xlarge (4 vCPU, 16 GB), Linux, on demand at $0.1344 an hour | $98.11 |
| 80 GB gp3 EBS at $0.08 per GB-month | $6.40 |
| One public IPv4 address | $3.65 |
| Snapshots, a second machine for failover, monitoring | extra, and yours to build |
| Total before backups and egress | about $108 |
The machine is cheap. The work isn't. Supabase's page says that when you self-host you're responsible for server maintenance, security hardening and updates, Postgres maintenance, high availability, backups and disaster recovery, and monitoring. Branching, managed backups and PITR, the Management API and multiple projects aren't available. Updates arrive as Compose snapshots roughly monthly, and mixing image versions isn't guaranteed to work.
Our view: self-hosting the whole stack on one VM swaps a $25 to $600 Supabase bill for a single machine nobody is paged for. It's reasonable for internal tools. For a product with customers, take the database to RDS and self-run only the pieces you need (usually PostgREST and Auth) as Fargate services. The official stack ships its own Postgres image with Supabase's extensions, so pointing it at RDS needs testing before you plan around it.
List prices, us-east-1, checked 31 Oct 2026.
Sources: Supabase pricing, VPC pricing, ELB pricing, EC2 data transfer, RDS pricing, API Gateway pricing, AppSync pricing.
What does a Supabase migration add to the AWS bill?
Mostly the pieces Supabase bundles into the plan: an API in front of the database, a load balancer, a NAT gateway and public IPv4 addresses. Add one to two months of paying both providers while you migrate.
| Line item | Supabase | AWS |
|---|---|---|
| API in front of the database | included (PostgREST) | about $9 to $18 per Fargate task |
| Load balancer | included | about $16 + $5.84 per LCU (ALB) |
| NAT gateway for private subnets | not applicable | about $33 + $0.045 /GB |
| Public IPv4 addresses | $4 add-on, if you need IPv4 direct | about $3.65 each |
| Egress | 250 GB included, then $0.09 /GB | 100 GB free, then $0.09 /GB |
| Point-in-time recovery | $100 per 7 days | included with automated backups, up to database size |
| Realtime | 5 million messages included | AppSync Events $1 per million; API Gateway WebSockets $1 per million messages + $0.25 per million connection-minutes |
| Running both during the migration | Plan for one to two months of paying Supabase and AWS together. | |
| Your time running it | low | more: Terraform, upgrades, alerts and on-call are yours, or ours |
For a full line-by-line AWS bill at three startup sizes, see how much AWS costs a startup per month.
Cutover and rollback
Step 7: cut over from Supabase to AWS at a quiet hour, with a way back.
Freeze writes, let replication drain, reset sequences, switch your own API domain to AWS, and keep Supabase untouched until a rollback deadline you set in advance. Supabase apps have one cutover problem Heroku apps don't: the client often holds the connection details. Your web app and, worse, your mobile app have the Supabase URL and anon key built in. A web deploy switches everyone in minutes. A mobile release doesn't, and old app versions keep calling Supabase for weeks.
- Before the night: put the API behind your own domain (
api.yourapp.com) and ship a client release that uses it, while it still points at Supabase. Then the cutover is a DNS change, not an app store review. - Freeze writes: maintenance mode in the app, and revoke write access for the app's roles on Supabase so nothing writes by accident. Pause cron jobs and webhooks.
- Drain replication: wait until the subscription on RDS has applied everything, then run
setvalon every sequence. - Switch: point the API domain, the backend's connection string and Storage URLs at AWS. Lift maintenance mode.
- Check: sign-in, sign-up, one write per critical table, a file upload, and a password reset email.
The rollback plan is a runbook page with three parts:
- The trigger. Decided in advance: error rate above a set level, or a broken critical path such as sign-in or checkout, for more than a set number of minutes.
- The steps. Point the API domain back at Supabase and restore write grants there. With a 60-second TTL that's minutes.
- The data question. Once real writes land in RDS, going back means copying them to Supabase. So the plan names a point of no return, usually a few hours after cutover, and keeps the Supabase project untouched until then. If you need a longer window, set up replication in the other direction and rehearse it too.
Keep the Supabase project running, on its paid plan, for at least a week after cutover. A Free project pauses after a week of inactivity, which is not what you want under a rollback plan.
Step 8: what to check in the first week on AWS.
- Alerts on load balancer 5xx rate and latency, RDS CPU, free storage and connections, and restarting ECS tasks.
- RDS automated backups on, with retention you chose on purpose. Then restore one into a scratch instance and time it, and write the result into your disaster recovery plan for AWS.
- Every RLS policy tested as an anonymous user and as two different signed-in users. A table without RLS enabled, or an API that connects as the table owner, skips every policy.
- Every cron job and former webhook ran at least once, and its logs are where you expect.
- Files: object counts in S3 match the old buckets, and private files need a signed URL.
- The replication slot and publication on Supabase dropped, once you're past the point of no return.
- The first days of the AWS bill, line by line. NAT data and log ingestion are the usual surprises.
- After the rollback window: the Supabase project downgraded or deleted, and the last invoice checked.
Or hand it to us: a fixed-scope Supabase migration in three to six weeks.
- Inventory and decide.
Steps 1 to 3, and the Auth decision in writing. Then the AWS side in Terraform: accounts, network, RDS, ECS, S3 and CI, next to Supabase. Nothing is switched yet.
- Replicate and run staging on AWS.
Logical replication from Supabase into RDS, PostgREST or your API on Fargate, files copied to S3.
- Rehearse the cutover.
Timed, end to end, at least twice, including sequences, RLS tests and the client switch.
- Cut over, with a way back.
At a quiet hour. Supabase stays up until the rollback window closes.
Moving Auth to Cognito, Realtime, many Edge Functions or a mobile app with old versions in the field push it toward six weeks; the quote says which. Everything is Terraform in your repository, in your AWS accounts. If you'd rather not run it afterwards either, our managed DevOps plans pick up from cutover day, and fractional DevOps starts at $2,900 a month.
When you don't need us: a small Pro bill, a team of two, no compliance asks. Stay on Supabase, and come back when one of those changes. If you aren't sure, the AWS readiness review prices both sides for your actual app before you commit to anything.
Sources: Supabase regions, Supabase pricing (PrivateLink on Team), plus the sources in each section above.
Questions founders ask about moving from Supabase to AWS.
How long does a Supabase to AWS migration take?
For one app with the database, Storage and Auth kept or self-run, three to four weeks of calendar time, most of it running both side by side. Moving Auth to Cognito, Realtime or a mobile app pushes it toward six. The cutover itself is one evening.
Can we migrate Supabase to AWS with zero downtime?
Close to it. Supabase supports logical replication to an external Postgres, so RDS stays in sync and the switch needs only a short write pause while replication drains and sequences are reset. The harder part is clients: a mobile app with the Supabase URL built in can't be switched by you, so route it through your own domain first.
How much does Supabase cost per month, and per project?
Pro starts at $25 a month and Team at $599, and both include a $10 compute credit that covers one Micro instance. Compute is charged per project, so a staging copy or a second app adds its own line, from $10 for Micro to $960 for 4XL. Users over 100,000, point-in-time recovery and egress over 250 GB come on top. Our illustrative medium app comes to about $358 a month.
Is Supabase hosted on AWS?
Yes. Supabase deploys each project to an AWS region you pick, such as us-east-1, but in Supabase's own account, not yours. So you get no VPC of your own, private networking to your other AWS services only through PrivateLink from the $599 Team plan up, and your Activate credits can't pay for it. Moving to AWS puts the same Postgres in your account. Pick the same region for RDS while you replicate.
Supabase vs AWS RDS: what's the difference?
RDS for PostgreSQL is only the managed database, in your own AWS account and VPC. Supabase is Postgres plus Auth, Storage, an auto-generated REST API, Realtime and Edge Functions, run for you as one product. Moving to RDS means replacing or keeping each of those services. RDS also includes point-in-time restore with automated backups, where Supabase charges $100 a month per 7 days of PITR.
Is AWS cheaper than Supabase?
Not for a small app: $25 on Supabase against about $92 on AWS in our illustrative setup. From the medium size up AWS is cheaper, as long as you keep Supabase Auth rather than switching to Cognito, which costs more per user.
Can we keep Supabase Auth and move only the database?
Yes. Your API on AWS verifies Supabase access tokens against the project's JWKS endpoint, which needs asymmetric signing keys turned on. The catch is foreign keys to auth.users: they can't point across databases, so keep a local users table keyed by the same ID and sync it.
Will our users have to reset their passwords?
Not necessarily. Supabase stores bcrypt hashes, and Cognito can import bcrypt hashes with a cost factor up to 12, so users keep their passwords. If you self-run Supabase Auth, the auth schema moves with the database and nothing changes for users. Test a sample import before you plan on it.
Does Row Level Security work on RDS?
Yes. RLS is part of Postgres. What you recreate is the Supabase glue: the anon and authenticated roles, and the auth.uid() and auth.jwt() functions that read the claims PostgREST or your API sets for each request. After the move, test every policy as an anonymous user and as two different signed-in users.
How do we move Supabase Storage to S3?
Supabase Storage speaks the S3 protocol, so ordinary S3 tools can copy every bucket into Amazon S3. Copy files separately from the database, because Supabase's database backups don't include them. Then replace storage RLS policies with presigned URLs issued by your API, put CloudFront in front of public files, and check that object counts in S3 match the old buckets before you switch.
Can Supabase Edge Functions run on AWS Lambda?
Not as they are. Edge Functions run on Deno, and Deno isn't one of Lambda's managed runtimes. Port small functions to Node.js on Lambda, or package bigger ones as container images on Lambda or ECS. First check which functions anything actually calls: many Supabase apps turned Edge Functions on once and never used them, and those don't need to move.
Can we self-host Supabase on AWS instead?
Yes, with Docker Compose on EC2, for about $108 a month in machine costs. You take on updates, backups, failover and monitoring for every service. For a product with customers we'd put the database on RDS and self-run only PostgREST and Auth.