AppSavvyBook a call
Bubble Migration

Why External Backends (Xano, Supabase, Firebase) Kill Bubble Apps

Bolting an external backend onto Bubble looks cheap. The hidden costs - latency, sync bugs, data drift, double maintenance - quietly destroy the app. Here's what to do instead.

Will Driscoll9 min read

One of the most popular Stack Overflow answers for "my Bubble app is slow" is: bolt an external backend onto it. Use Xano, Supabase, or Firebase as the database. Keep Bubble for the front-end. Best of both worlds, right?

In practice this is one of the most expensive mistakes a Bubble team can make. It looks cheap because the first six months feel productive. The real cost shows up in months 9-18 when the architecture's hidden trade-offs start compounding.

This article walks through why the external-backend pattern fails, what it actually costs, and what to do instead when you've outgrown Bubble's native database.

The pattern in question

The "Bubble + external backend" pattern looks like this:

  1. Bubble continues to serve the UI - pages, workflows, the editor experience
  2. An external service (Xano, Supabase, Firebase) hosts the "real" data
  3. Bubble calls the external service via the API connector for reads and writes
  4. Sometimes there's a partial mirror in Bubble's database for performance

It sounds reasonable. It's often pitched as a way to get "real database power" without the cost of a full migration. The talks at Bubble conferences make it look smooth.

It's not smooth. Here's why.

What goes wrong

Latency stacks up on every call

Bubble's front-end already has its own round-trip latency. Adding an API call to an external backend adds another. Adding two API calls (read user, then read user's bookings) adds two more. Page loads that were sluggish at 1.5 seconds become painful at 3-5 seconds.

The API connector also doesn't batch well. Each call is independent. So a list page that previously did one Bubble search now does N+1 external calls, each adding network latency.

The data model is now in two places

In Bubble's native database, the data model is defined by the Data Types and their relationships. In an external backend, the data model is defined by tables (or collections). When you use both, the canonical model is in neither place.

Some fields live in Bubble (because they were there first). Some live in the external backend (because they were added later). Workflows update one, the other, or both, depending on when they were written.

The first time this matters is when you find a record with conflicting values in the two places. The second time is when you can't figure out which one is correct. By the third time, the team has stopped trusting the data entirely.

Sync logic becomes its own product

If you want a partial mirror (for performance), you need sync workflows. Sync workflows have to handle:

  • Initial backfill
  • Real-time updates (or near-real-time)
  • Conflict resolution (what if both sides changed)
  • Retry on failure
  • Backpressure when the external API is slow

This is a non-trivial distributed-systems problem. It's also something neither Bubble nor the external backend is designed to solve for you. So you build it yourself, badly, with workflows.

Authentication is now a problem

Bubble has its own auth system. Xano/Supabase/Firebase have theirs. Now you have two systems that need to know about your users. Either you sync user records between them (back to sync problems) or you use one as the source of truth and the other as a follower (which means custom code on every auth event).

We've seen apps with three layers of auth state because nobody felt comfortable refactoring it after the initial decision.

Plugins don't work with external data the same way

Many useful Bubble plugins (lists, repeating groups, certain UI components) are designed to work with Bubble's native database operations. They handle the "list this Data Type, filter by these constraints, paginate" pattern. When the data is in an external backend, these plugins either don't work or work in a degraded mode.

You end up rewriting plugin functionality in workflows or custom code.

Privacy rules can't be enforced

Bubble privacy rules apply to Bubble Data Types. They don't apply to data read from an external API call. So the security model is now: "the external backend enforces access control, and the Bubble UI hides things it shouldn't show."

The first part is fine if you set up Postgres RLS correctly on Supabase, or row-level rules in Xano. The second part is what bites you - the Bubble side has full access to whatever the API returns, and if the API returns too much, the UI restriction is the only protection. We've found exposed-data bugs in production apps using this pattern more than once.

The hidden cost

The dollar cost looks attractive at first. External backends often look cheaper than full migration:

  • Bubble subscription: unchanged
  • Xano/Supabase/Firebase: $25-200/month
  • Initial setup time: 2-4 weeks

But the real cost lives in two categories that don't appear on the invoice:

Compounding maintenance overhead

Every new feature now has to live in two places. The Bubble workflow + the external API integration. Updates take longer. Bug fixes take longer. New engineers take much longer to onboard because there are two mental models to learn.

Six months in, the team is shipping features 2-3x slower than they were before the architecture change.

Migration becomes more expensive later

When the day comes that you finally need to migrate off Bubble entirely (and it always comes), you now have two systems to migrate from. The external backend made the architecture more complex, not less. The eventual migration is bigger, slower, and more expensive than if you'd just migrated when you first thought about it.

We've migrated apps off the Bubble + Xano pattern. They take 30-50% longer than apps that stayed on pure Bubble.

What to do instead

The real choice when you've outgrown Bubble's native database is between three options, and "external backend" isn't one of them.

Option 1: refactor and optimise in Bubble

If your data model issues are about query performance, often the fix is to denormalise, add lookup tables for hot reads, or restructure how you're storing repeated data. This is genuine engineering work but it's bounded.

A senior Bubble dev can usually get a year more out of an app at this stage with focused refactoring. (Yes - we've done this for clients where migration wasn't the right answer.)

Option 2: extend Bubble with a single bounded code service

If your bottleneck is in one specific area - payments, AI integration, heavy computation, real-time messaging - you can run a single code service alongside Bubble that handles only that thing.

The key word is bounded. One code service, owning a clear domain, with Bubble calling it via an API. Not "the database lives over there now."

This is similar to what we did at Ohana early - Bubble handled the marketplace UI, while a Stripe Connect payment service lived in code. The boundary was clean, the responsibilities didn't drift, and the architecture stayed manageable.

Option 3: migrate properly

If your database needs are deep enough that an external backend was tempting in the first place, the honest answer is: you've outgrown Bubble. Don't half-migrate; migrate.

A proper slice-by-slice migration takes 8-16 weeks. It's more expensive than bolting on an external backend, but it's the only one of these three options where you end up with a clean architecture.

What to do next

If you've already gone down the external-backend path and want to know how to unwind it, book a 30-minute discovery call. We've untangled several of these and can tell you how big the cleanup is for your specific case.

If you're thinking about it as a future move, please don't. Read the Bubble performance ceiling first to understand whether refactoring is the right answer instead.

Read next: Bubble to Next.js migration guide and Hidden costs of staying on Bubble.

Got a Bubble or Canvas app you’d like a second pair of eyes on?

30-minute discovery call. We’ll look at your app live and tell you honestly what we’d do next.

Or grab the Bubble migration playbook PDF.