All posts

April 13, 2026 · 4 min read

The Demo Environment We Showed to Prospects Was Quietly Running on Real Customer Data

A small team I worked with last year gave product demos to prospective customers regularly, walking through the app live rather than using screenshots. Setting up a genuinely separate demo environment, seeded with realistic but fake data, felt like a project for later, so in the meantime the demo just used the real, live production app, logged in as a couple of accounts labeled internally as 'test users.'

How that quietly became a real problem

Those 'test' accounts weren't actually isolated from anything. They existed inside the same production database as every real customer's account, with the same underlying access rules, which meant that anything a demo happened to click through, a search feature, a list view, a shared report, could potentially surface real customer data if the query wasn't scoped tightly enough. Nobody had audited every feature specifically for what a demo account might accidentally reveal, because nobody had planned for the demo to run against production at all. It just ended up that way, one skipped setup step at a time.

What I actually found when I looked closely

One feature, a 'recently active accounts' widget meant to show internal activity for account management purposes, was visible on a dashboard that the demo account also had access to. It hadn't been scoped to exclude real customer names, and during at least one live demo, it's plausible a prospect briefly saw a glimpse of an actual customer's name in a list that was never meant to be shown outside the internal team. Nothing conclusively bad happened as far as anyone could tell, but the exposure existed, and it existed because a demo account was never really separated from the real data at all.

Why this is such an easy trap to fall into

Building a fully separate demo environment, with its own database seeded with realistic but entirely fake data, is genuinely more work than just logging into the real app with a special account. Under time pressure, the shortcut is completely understandable. It also means every feature in your entire app, including ones nobody thought to check specifically for demo purposes, is now something a prospect, sitting on a sales call, might stumble into seeing.

What actually changed after this

  • A genuinely separate demo environment got built, with its own database, seeded entirely with fake data that looks realistic but contains nothing real.
  • Demo accounts in the real production system, if any still needed to exist for other reasons, got explicitly reviewed for exactly what they can see across every feature, not assumed safe by default.
  • Anyone giving a live demo now double-checks, before every call, which environment they're actually logged into, since the two look nearly identical on purpose.

The instinct to skip building a separate demo environment because it feels like extra, non-urgent work is understandable. The actual cost of that shortcut is that every feature in your live app, reviewed or not, becomes something a prospect could potentially see during a sales call, which is a much wider blast radius than the shortcut felt like it was creating at the time.

Related reading

Harbova is a security service for apps built with AI tools. Start with a free scan, and if it finds something serious, we can fix it and prove it is closed.