Blog · Guides · 2026-09-08

How to Reproduce a Bug That Only Happens for One User

Klavity
TL;DRA bug that only happens for one user is rarely random — it is caused by state that differs between their account and yours: role and permissions, their specific data, feature-flag assignments, locale and timezone, or persisted client state like localStorage and cookies. To reproduce it, replicate that user's state instead of testing from your own clean account.

A bug that only happens for one user is almost never random. It is caused by state that differs between their account and yours — their role and permissions, the specific shape of their data, which feature flags or experiments they are assigned to, their locale and timezone, or persisted client-side state such as cookies, localStorage, or a cached service worker. To reproduce it, you replicate their state instead of testing from your own clean account, which by definition has none of those differences.

Why does a bug happen for only one user?

Your development and QA accounts are the cleanest accounts in the system. They have admin-ish permissions, freshly seeded data, default flag assignments, and an English/UTC-ish locale. Real users drift away from that baseline in five predictable directions — and each one is a place a bug can hide that you will never hit from your own login.

  • Role and permissions. A view a manager can open may 403 or render a broken empty state for a viewer-only seat. Code paths gated on a permission you always have are effectively untested.
  • Data shape. The user has 4,000 rows where you have 12, a name with an emoji, a null field your seed data never produces, or a record in a state (archived, disputed, refunded) your fixtures never create.
  • Feature flags and experiments. They are in the variant you are not. A flag combination that is impossible in your environment is live in theirs.
  • Locale, timezone, and currency. Date parsing, number formatting, right-to-left layout, and off-by-a-day errors all depend on settings your account never changes from the default.
  • Persisted client state. A stale cookie, an old value in localStorage, an outdated service worker, or a corrupt cache entry. Your incognito-fresh browser wipes all of these on every test.

How to reproduce a bug that only affects one user

Work through the five categories in order. The goal is to make your session look like theirs, one variable at a time, until the bug appears — then you know exactly which variable owns it.

  1. Capture their exact context first. The URL, the timestamp with timezone, their browser and OS, and a screenshot or recording with the console and network tab open. Everything below is guesswork without this, so collect it before you touch the code.
  2. Inherit their permissions. Use secure impersonation (a 'log in as' / view-as feature with an audit log) to load the app with the user's exact role and access. If the empty state, missing button, or error appears immediately, the bug is permission-gated and you are done.
  3. Reproduce against their data, not a seed account. Point at a copy of the affected records — restored to a staging environment, or the real ones if impersonation is read-safe. Bugs that depend on data volume, a specific status, or an unusual value only show up on real data.
  4. Match their flag assignments. Look up which feature flags and experiment variants the user is bucketed into and force the same assignment in your session. A bug that vanishes when you flip one flag has just named its own root cause.
  5. Match locale, timezone, and language. Set your browser and account to their settings. This is the fastest test for the whole class of date, currency, and formatting bugs — and the one people skip most often.
  6. Clear or import their client state. If nothing above reproduces it, the cause is on their machine: a stale cookie, an old localStorage value, or a cached service worker. Ask them to reproduce in a private window; if it disappears there, you have confirmed a client-state bug and can target the specific key or cache to clear.

How to stop one-user bugs from becoming 'cannot reproduce'

The single reason these bugs stall is that the report arrives without the state that caused them. "It's broken for me" tells you nothing; you cannot see the user's role, flags, timezone, or console from a text description. Two habits fix that at the source:

  • Capture state at the moment of the report, not after. The user's environment, permissions context, console errors, and failing network requests are only fully knowable while they are on the broken screen. Reconstructing them a day later over email is where the round-trips come from.
  • Make the affected user the reporter. The person hitting the bug is already in the exact state you need. Letting them file the report from inside the product — with URL, environment, console, and network attached automatically — hands you the reproduction recipe instead of making you rebuild it.

This is exactly what in-app, right-click bug reporting is for. Klavity Snap lets a user file a bug from the screen where it happened and attaches the environment, console, and network evidence automatically — so a one-user bug arrives with the state that reproduces it, not just a sentence describing it. For the deeper why-it-stalls background, see our guide to reducing 'cannot reproduce' tickets.

A quick checklist for the next one-user bug

  • Do I have their role, browser, OS, timezone, and a console screenshot?
  • Have I loaded the app as them, not as my admin account?
  • Am I testing against their data, or clean fixtures that hide the bug?
  • Have I matched their feature-flag and experiment assignments?
  • Have I checked whether it disappears in a private window (client state)?

Run those five, and "it only happens for one user" almost always resolves into a specific, fixable difference — usually within the first two.

Key takeaways

  • Treat a one-user bug as a state difference, not a fluke
  • Reproduce with the user's role, data, and flags — not a clean account
  • Capture client state: cookies, localStorage, service worker, cache
  • Match locale and timezone before you call it 'cannot reproduce'

FAQ

Why does a bug happen for only one user?

Because something about that user's state is different from yours. The usual suspects are their role or permissions, the exact shape of their data, which feature flags or experiments they are assigned to, their locale and timezone, and stale client-side state such as cookies, localStorage, or a cached service worker. Your test account has none of those differences, so the bug never fires for you.

How do I reproduce a bug I can't see on my own account?

Stop testing from your own account. Capture the affected user's state — role, feature flags, browser and OS, and any relevant client storage — then recreate it: use secure impersonation ('log in as') to inherit their permissions and data, set the same flag assignments, and match their locale and timezone. Reproduce against a copy of their data, not a clean seed account.

What information should I ask the user for?

Ask for the exact URL, the time it happened (with timezone), their browser and OS, and a screenshot or recording with the console and network tab open. An in-app report that captures those automatically removes the back-and-forth entirely.

Catch bugs the moment a human sees them

Klavity: right-click bug reports, AI personas that review your product, and self-healing tests.

Get started free