Search latency hit 6+ seconds and Bubble's database row limits were forcing painful workarounds.
What they were actually dealing with.
A marketplace operating 120,000 listings across 18 Latin American countries had built the entire platform on Bubble. Search was the product; a marketplace is only as good as how fast someone can find what they're looking for, and Bubble's database was no longer keeping up with that job.
Search latency had climbed past six seconds, and Bubble's database row-limit behaviour was forcing the team into workarounds that made the product worse to maintain every time they touched it. The workarounds were themselves becoming the bottleneck on shipping anything new.
The decisions that actually mattered.
Not a task list. The four calls that determined whether this worked.
NestJS chosen for a search service that could be scaled independently
Rather than treat search as one feature among many, it was architected as its own service, so the part of the product under the most load could be scaled and optimised without touching everything else.
Schema redesigned around query patterns, not just data shape
The Postgres schema was built around how listings are actually searched and filtered in production traffic, with indexes matched to real query patterns rather than a generic normalised structure carried over from Bubble's data model.
Concurrency tested against real regional traffic patterns
With users across 18 countries, load doesn't arrive evenly. The new backend was tested against the concurrent-user patterns this specific marketplace actually produces, not a synthetic uniform-load benchmark.
Real-time filters shipped as proof the constraint was gone
The team's own test of whether the migration had worked was shipping a feature, real-time search filters, that the old row-limit workarounds had made impractical to build at all.
Is this outcome remarkable or ordinary?
For calibration: sub-200ms search response time is generally considered the threshold at which search feels instantaneous to users rather than perceptibly loading. Moving from 6+ seconds to 180ms is not an incremental improvement on the same experience, it changes what kind of product search is capable of being.
Source: General web performance research on perceived instantaneity thresholds
“Search was our product, and it was dying. After migration we shipped real-time filters in a week.”
If you're in the same position.
When workarounds for a platform's structural limits start being the thing that slows down every new feature, the workarounds are the signal, not the platform's underlying suitability for your original use case. That signal usually appears well before the search bar visibly breaks.
You shipped fast on no-code.
Now ship faster, on code.
30-minute scoping call · pixel-faithful migration plan · fixed-price quote within 48 hours. No NDA gymnastics.