- Features
- Pricing
- English
- français
- Deutsche
- Contact us
- Docs
- Login

A customer asked me once, in the middle of a demo, "what is lorem ipsum?"
That is the moment. The preview URL loaded. Every page rendered. The merge was clean, the build was green, the tests passed. And a customer I was trying to sell to was reading placeholder copy out loud on a shared screen.
I've thought about that moment a lot. Not for the embarrassment, though I earned it. For what it told me about what a preview environment actually is, which is not what most of us think it is.
Most conversations about preview environments stop at "does the build work." Every frontend-forward platform in the last five years has solved that cleanly. Push a branch, get a URL, share the URL, merge or don't. The code path is fine.
The data path is the lie.
In the platforms most of us use, the application gets branched on every push but the database does not. The preview URL points at staging data, or dev seed data, or a fixture someone's coworker wrote during their first week and nobody has touched since. The UI layer behaves correctly, rendering whatever happens to be in the table. The reviewer, looking at a preview, has no way to know whether the feature works against production-shaped data, because the preview has never seen production-shaped data.
The result is a class of bug that survives review and dies in front of a customer. The "what is lorem ipsum" moment is one of the nicer versions. The worse ones involve queries that were fine against a hundred rows and fall over against a million, UI states that only exist once a user has three years of history, and integrations whose credentials are valid in staging and wrong in production.
A preview environment with fixture data is a model home. The couches look great. The light switches all work. Nobody has ever lived there, which means you can't tell whether the plumbing holds up once a family moves in.
The part nobody tells you: this isn't a bug the industry is ignoring. It's a problem teams have chosen to solve around rather than through.
You can wire up a managed database that supports branching per preview. You can write a fixture generator. You can copy anonymized production snapshots into staging weekly. Plenty of teams do, and most of them work, most of the time.
Each one is a configuration that lives outside the application. Each one is a second system, with its own expiry, its own access grant, its own cost model, and its own way to drift out of sync. Each one is time your team is focusing on infrastructure instead of features.
The frontend-first platforms that popularized Git-push previews built that workflow around the code. The rest of the preview, the services and the data, lives in whatever integration the team wired up, usually through a marketplace or a GitHub Action someone bolted on last quarter.
A reviewer, sitting in a pull request, has to ask a question that shouldn't be their job: is the database on this preview the actual shape, or is it whatever the fixture gave me?
I run a handful of side projects. Small enough that any platform decision is a judgment call about what my future self will thank me for. The one place I never cut is preview parity. Every time I have, my future self has become the customer staring at lorem ipsum on my own demo, which is a humbling way to review your own pull requests.
On Upsun, every Git branch gets a byte-for-byte clone of production. Application, services, data. It takes about a minute. The databases running in your preview are the databases running in production, with the same rows, the same indices, the same foreign keys, the same everything. If you don't want reviewers looking at customer data, you define a sanitization hook in your .upsun/config.yaml that strips PII on deploy, and reviewers get realistic-shaped but non-sensitive data.
This isn't a marketplace integration you configure per project. It's how environments work.
The term for this is byte-for-byte environment cloning. Not the catchiest phrase. What it actually does is let a reviewer answer "does this work?" without guessing.
I talk to customers every week and I ship code on side projects with the same workflow. Two different jobs, same pattern from different angles.
From the customer side, the preview stops being the place where bugs hide until the demo. Reviewers catch the query that won't scale. Product managers click through the feature and notice the empty-state language is wrong because they see real empty states. Sales engineers run the demo against the clone and nothing says lorem ipsum.
From the shipping side, the merge button starts to mean what it says. When I approve a pull request against a clone of production, I'm approving behavior against the actual data shape my users will hit. The class of "passed review, broke in prod" bugs gets smaller. Not zero. Smaller, and in a category you can reason about.
That's a small change in the workflow and a large change in the trust you have in your own pipeline.
Pull up your last three production incidents. How many of them were visible in the preview environment where the change was reviewed? If the answer is none, and you're sure, your preview environment is doing its job. If the answer is "I don't know," the data path is probably the reason.
The customer who asked me what lorem ipsum was is still a customer. They were kind about it, the way people usually are when you've just caught yourself out in front of them. What they were actually asking, I think, is "why am I looking at something that isn't real?" That's the right question to ask any preview environment. Yours should be able to answer it without you squinting.