How to Migrate Off Bubble (Step-by-Step)
How to migrate off Bubble when there is no code export. Inventory your app, design a real database, rebuild in code, move data and users, and cut over safely.
Bubble is one of the most capable no-code platforms ever built. It is also a closed one. Bubble has no code export, so a migration off Bubble is a rebuild of the app in real code, plus a careful move of your data and users.
That sounds bigger than it is, if you plan it well. This guide shows how.
Short version: you can export your data from Bubble. You can’t export the app. Plan the rebuild around your data model, and keep the Bubble app running until the new one is proven.
Step 1: Inventory the Bubble app
Open the editor and write down everything the app does. Be thorough, because anything missing here turns into a surprise later.
| Area | What to list |
|---|---|
| Pages | Every page and its purpose, plus reusable elements |
| Workflows | Every front-end workflow and its trigger |
| Backend | Backend (API) workflows, scheduled events and recurring events |
| Privacy rules | Who can see and change each data type |
| Plugins | Each plugin and what it’s used for |
| API Connector | Every external API call and its credentials |
| Emails | Every email the app sends and when |
Screenshots of each page and each workflow are worth the time. They become the spec for the rebuild.
Step 2: Map the data model
In the Data tab, list every data type with its fields, field types and record counts. Pay attention to:
- List fields, which become join tables in a relational database.
- References between types, which become foreign keys.
- Option sets, which become enums or lookup tables.
- Deleted or unused fields, which you can leave behind.
This map is the foundation of the new database, and a chance to fix structure that grew by accident.
Step 3: Design the target stack
A common, boring-in-a-good-way target for Bubble apps:
- Frontend: React with TypeScript
- API: Node.js with a typed API layer
- Database: PostgreSQL
- Auth: a managed auth provider or a well-known library
- Files: S3 or Cloudflare R2
- Hosting: an EC2 instance or VPS behind Nginx with Certbot SSL, or a managed platform
Step 4: Rebuild the app
Build in this order: schema, then API, then UI.
- Create the schema and migrations from your data map.
- Turn each workflow into an API endpoint or a background job. Turn each privacy rule into an explicit authorization check.
- Rebuild pages in React, using your screenshots as the reference.
Keep features the same during the migration. Improvements can come right after launch, when you have a codebase that makes them easy.
Step 5: Migrate data and files
Export each data type from the Data tab as CSV, or page through the Data API, which returns up to 100 records per request and uses a cursor for the rest. Then transform and load it, parents before children, keeping Bubble’s unique IDs in a column so relationships can be rebuilt.
Download every uploaded file, upload it to your storage, and rewrite file URLs in your data. See the Bubble data export guide for the details.
Step 6: Migrate users
Bubble doesn’t export password hashes. Import users with their emails, roles and IDs, then send a friendly email with a password-reset or magic link. Most users complete it in under a minute.
Step 7: Cut over
Run the new app on a staging domain with real data, and test every flow. Then:
- Freeze writes in Bubble.
- Run a final data sync and reconcile row counts.
- Switch the domain to the new app.
- Keep the Bubble app read-only for a few weeks, then downgrade your plan.
Want it done for you?
X & Company rebuilds Bubble apps as real code and runs the whole migration, with a fixed-scope quote after a free audit.