What changes when you move a Bubble app to React

What changes when Bubble pages, repeating groups, custom states, workflows, auth, data, files, and permissions are rebuilt around React and a backend.

Updated
Apr 19, 2026
Read
8 min read
By Founder, Not Quite Unicorns

Bubble to React migration changes more than the visual editor and component layer.

React is very good at the interface layer. It gives you components, state, rendering, event handling, and a normal codebase developers can reason about. It does not give you the rest of Bubble.

That is the bit people often underestimate. Bubble is an application platform. The editor contains the UI, but the platform also handles database structure, workflows, backend workflows, auth, privacy rules, file storage, scheduled jobs, API Connector calls, plugin behaviour, hosting, and deployment.

So the useful migration question is not "how do we convert Bubble pages into React components?" It is "where does each Bubble responsibility live once React owns the UI?"

React Replaces The UI Layer

In Bubble, a page can contain visual structure, reusable elements, data sources, custom states, conditionals, workflows, role checks, and API calls. React splits that apart.

The visible interface becomes components. Page-level structure becomes routes, layouts, and nested UI. Repeating groups become list components with data fetching, pagination, empty states, and loading states. Popups become modals or routed screens. Custom states become local state, reducer state, URL state, server cache, or sometimes real database fields.

That split is healthy when it is done deliberately. But if you only rebuild what the user can see, the migration will be shallow. The old Bubble app had product behaviour behind those screens, and the React app needs somewhere for that behaviour to go.

If the target stack is actually Next.js, there is a related planning layer around routing, server rendering, server actions, and deployment. We cover that separately in Bubble to Next.js. React is the rendering model. The full app architecture still needs to be chosen.

Bubble Feature -> React/backend responsibility

Bubble featureReact responsibilityBackend/platform responsibility
Pages, groups, and reusable elementsRoutes, layouts, components, props, and compositionData loading and access checks for each route
Repeating groupsList components, pagination, filters, loading states, and empty statesIndexed queries, permission-aware data access, search, and sorting
Custom states and group variablesuseState, useReducer, URL params, context, or state machinesPersisted records when the state is business data
Conditional visibility and stylingConditional rendering, class names, disabled states, and guard UIServer-side permission checks and policy enforcement
Button and form workflowsEvent handlers, form components, optimistic UI, and error statesMutations, service functions, transactions, API routes, or backend functions
Backend workflows and scheduled workflowsProgress UI, status messages, and retry-friendly feedbackQueues, cron jobs, workers, scheduled functions, and idempotent operations
Data types, option sets, and list fieldsTyped models, form shapes, select options, and display componentsDatabase schema, relationships, indexes, migrations, and reporting model
Privacy rules and role checksHidden controls, route guards, and user-specific navigationAuth, membership model, row-level rules, policy checks, and audit logs
File uploads and Bubble file fieldsFile inputs, upload progress, previews, and download buttonsObject storage, signed URLs, private access rules, and file migration
API Connector calls and pluginsIntegration settings UI, loading states, and user-facing errorsTyped integration clients, webhooks, secrets, retries, logging, and tests

This table is not a mechanical conversion chart. It is a way to stop React becoming the dumping ground for everything Bubble used to handle.

Translate UI Patterns, Not Editor Shapes

A Bubble group does not automatically need to become a React component. Sometimes it should. Sometimes it is just a layout wrapper that can disappear. The same is true for reusable elements. A customer card, booking calendar, invoice table, onboarding step, admin approval panel, or message composer probably deserves a named component. A random group called Group Content left inner probably does not.

Repeating groups need similar care. In Bubble, a repeating group often mixes query logic, display rules, filtering, privacy behaviour, and item actions. In React, you normally want a list component that receives data in a predictable shape, plus a backend query that owns filtering, sorting, pagination, and access control. Copy the visible behaviour without redesigning the query and you can keep the same slow product, just rendered by a different library.

React State Is Not A Database

Custom states are one of the easiest Bubble patterns to misread during migration. Some are pure UI state: the selected tab, whether a modal is open, the current step in a wizard, or the draft value of a form. React handles those well.

Others are temporary workflow coordination: hold a selected record, pass data into a popup, store a calculated list before saving. Those can become component state, reducer state, or a small state machine if the interaction is complex.

The risky ones are custom states that are really business data. If a value affects billing, access, reporting, approval, availability, or customer-visible history, it probably belongs in the backend. The goal is not to replace every custom state with useState. The goal is to decide whether the state is local UI behaviour, server state, or durable product data.

Workflows Need Backend Homes

React can start a workflow. It should not contain the whole workflow.

A click handler can validate a form, show a spinner, call a mutation, and display the result. The product operation should usually live behind that call: create the booking, cancel the subscription, invite the user, approve the claim, send the notification, or sync the external service.

Bubble makes it easy to stack workflow actions behind a button. In code, that same behaviour usually needs a cleaner shape. Some parts belong in a transaction. Some parts belong in a queue. Some parts need idempotency because they might be retried.

This is why workflow migration deserves its own pass. We go deeper on that in Bubble workflows to code, but the short version is simple: treat workflows as product logic, not as UI glue.

Data, Auth, And Permissions Are The Real Migration

The hardest part of a Bubble to React migration is usually not JSX. It is deciding what the new system believes about data and access.

Bubble data types often grow around editor convenience. List fields, option sets, loose references, text fields that should be statuses, and duplicated values can all be perfectly workable in Bubble for a while. When you move to code, you have a chance to design the model around the product rather than the old editor.

That does not mean changing everything for the sake of it. It means checking which fields are real business concepts, which are reporting shortcuts, which exist for old workflows, and which are safe to remove. The data migration then needs proof: record counts, relationship checks, role checks, file checks, report comparisons, and awkward legacy records.

If the app has meaningful customer data, read the Bubble data migration plan before estimating the React work. A nice React UI sitting on incorrectly moved data is not a successful migration.

Permissions need the same seriousness. Bubble privacy rules, page redirects, role fields, "only when" conditions, and admin checks all need to become an explicit access model. React can hide buttons. The backend must enforce the rule.

Pick The Full Stack, Not Just React

"We are moving to React" is not enough of an architecture decision.

You still need to choose the backend, database, auth provider, file storage, job runner, integration pattern, logging, deployment process, staging environment, test strategy, and rollback plan. For some apps, that might mean React with Next.js, Supabase, and Postgres. For others, it might mean React with Convex, a custom Node API, Rails, Django, Laravel, or something else.

The right answer depends on the app. A marketplace with complex permissions has different needs from an internal ops dashboard. A realtime collaboration product has different needs from a content-heavy customer portal.

This is the same reason our broader Bubble to code migration advice starts with understanding the existing system before choosing the final implementation. Stack decisions made from screenshots are usually just guesses wearing technical clothes.

Plan The Release Process

Bubble gives you a deploy button, version history, logs, app data, test mode, and a familiar way for the team to make changes. A React codebase needs its own operating model.

That means staging environments, preview deployments, database migration scripts, seed data, automated checks, error monitoring, feature flags where useful, and a clear rollback plan. It also means deciding how the business keeps shipping while the migration is happening.

For a live app, a staged rollout is usually safer than a single dramatic cutover. You might move one module first, rebuild admin tools, migrate a customer cohort, or run Bubble and the new React app side by side for a period. The sequence should follow business risk, not page order.

A Practical Bubble To React Migration Sequence

Start by auditing the app inside Bubble. List the screens, workflows, backend workflows, data types, privacy rules, API Connector calls, plugins, files, scheduled jobs, and admin tools that matter.

Then map each responsibility to the new architecture. Decide what React owns, what the backend owns, what the database owns, and what external services own.

Next, design the data and permission model. Decide what should be preserved exactly, what should be cleaned up, and what should be rebuilt differently because the old Bubble pattern was only there to work around the platform.

After that, rebuild a thin vertical slice that includes UI, auth, data, workflow logic, and QA against real examples. Then widen the rollout with tests and reconciliation: permissions, record counts, reports, file access, webhook behaviour, emails, failed payments, admin overrides, deleted users, and old edge cases.

Is React Enough To Replace Bubble?

No. React is enough to replace Bubble's visual interface layer. It is not enough to replace Bubble as an application platform.

That is not a criticism of React. It is just the job description. React renders UI and manages interaction. A migrated Bubble app also needs backend functions, data storage, auth, permissions, files, jobs, integrations, observability, testing, and a release process.

If you are considering a Bubble to React migration, start with an assessment rather than a component estimate. The useful output is a map of the existing app, the target architecture, the data migration risk, and the rollout order.

That is exactly what our migration assessment is designed to do: understand the Bubble app as a working business system first, then decide the safest path into code.

Questions This Guide Answers

Can a Bubble app be migrated to React?

Yes. The React app needs to be backed by a real data and backend architecture, because React mainly handles the user interface and client-side interaction model.

Does React replace Bubble?

React can replace Bubble's page and component layer, but the migration still needs backend functions, data modelling, permissions, files, jobs, integrations, and QA.

What Bubble UI patterns need translation?

Repeating groups, custom states, conditionals, reusable elements, hidden groups, responsive rules, and workflow-triggered UI changes all need deliberate translation into React patterns.

All resources