← Learning Centre
Landing Page Leaks

Stop False A/B Test Wins to Build Truly Scalable Landing Pages

Your test platform declared a winner. Variant B beat the control by 14%. You ship it. What you never checked: variant A - your control - stopped rendering its social proof section on mobile three days into the test. The pixel misfired on Safari. The H1 truncated. Variant B didn't win. The control lost. That distinction matters, because now variant B is your new control, and you have no idea what you're actually measuring.

What a Ghost Variant Is: The False Positive Win

A ghost variant is a control that has silently degraded during the test window. It is not visibly broken - nobody files a bug report, no monitoring alert fires - but one or more elements have failed in a way that suppresses conversions specifically for that variant. The challenger variant, running clean, appears to win. The test platform reports a statistically significant uplift. You ship.

The term comes from the fact that the control looks fine at a glance. Open it in Chrome on a desktop. Everything renders. But on mobile Safari, the trust badge image returns a 404. On a slow 4G connection, the conversion tracking script loads after the user has already bounced. The ghost is invisible unless you specifically go looking for it.

This is not a rare edge case. Any test running longer than a week across multiple traffic sources is exposed to it. CMS deployments happen. CDN configs get updated. Dependencies change. The control you started the test with is not necessarily the control that finished it.

How This Happens: Four Named Failure Modes

CDN cache poisoning during the test window. You update a component, purge the cache, the CDN rehydrates from origin - but only for one variant. The other variant's cached version is stale. Now the control is serving a three-week-old JavaScript bundle that conflicts with a library you updated. The symptom is a silent JS error that prevents your form submit handler from firing.

CMS content edits mid-test. Someone updates the hero headline for a campaign. They edit the page, not the variant. The test platform is A/B testing URLs, not snapshots. The control's H1 now reads differently than it did on day one. Your test is no longer measuring what you thought it was measuring. If the new headline is weaker, the control's conversion rate drops - not because your hypothesis was wrong, but because a content editor made a change nobody logged.

Script loading order on mobile. Your A/B test platform injects a snippet that loads asynchronously. On desktop, the rest of the page loads fast enough that the snippet resolves before user interaction. On mobile, on a congested network, the page is interactive before the snippet fires. The platform's conversion event never registers for those sessions. Your control's mobile conversion rate looks low. It's not - it's just not being counted.

HTTPS migration leftovers. You migrated to HTTPS six months ago. Most assets updated. One didn't: a social proof widget that pulls logos from a third-party CDN over HTTP. Modern browsers block mixed content. Desktop Chrome blocked it quietly at migration time; nobody noticed because the widget has a CSS fallback. But on the control variant, that blank space where five customer logos used to appear is suppressing conversions - and has been since you started the test.

Why Standard Analytics Won't Catch It

Your A/B testing platform - whether it's Optimizely, VWO, Google Optimize, or a homegrown split-test setup - measures one thing: did a session assigned to variant X result in a conversion event? It does not audit the page state at the moment of that session. It does not check whether the H1 rendered, whether the trust badge loaded, or whether the form submit handler was reachable. It counts events.

Google Analytics and Mixpanel are the same. They record what happened in a session, not why the page was in the state it was in when that session occurred. A session where the social proof section 404ed looks identical in your analytics dashboard to a session where it loaded perfectly. Both show a bounce. Neither tells you the cause.

Synthetic monitoring tools like Pingdom or UptimeRobot check availability - is the URL returning a 200? They do not check whether specific elements within the page rendered correctly. Your page returns a 200. The tracking pixel inside it silently failed. Pingdom reports green. Your control is a ghost.

The only tool that catches this is one that renders the page - both variants, across multiple viewport sizes and network conditions - and checks element-level health signals: payload size, H1 presence, image load status, meta tag completeness, and script execution order. That is not a monitoring product. That is a page audit.

The Compounding Damage: Baseline Rot

Shipping a false positive winner is bad. What happens next is worse. The variant you shipped - variant B, the accidental winner - is now your new control. Your next test will measure against it. If it also has a silent defect, your next winner will be even more degraded relative to your actual best possible page. You are not optimising upward. You are optimising sideways on a declining baseline.

Over six to twelve months of continuous testing, this compounds. Teams running high-velocity A/B programs often report that their conversion rate has been flat for two years despite shipping dozens of winners. Ghost variants are frequently the cause. The testing cadence is healthy. The baseline hygiene is not.

There is also a team-level cost. Engineers and designers spend weeks building variants, writing copy, setting up tracking. When the result is a ghost positive, that work produces no real signal. You cannot learn from a test where the control was broken. The experimental infrastructure is sound; the page underneath it is not.

How to Detect a Ghost Variant Before You Declare a Winner

The protocol is simple and should be non-negotiable before any test call: audit both variants, not just the winner.

Check for payload differences between variants. If variant A's HTML payload is 40kb and variant B's is 38kb, and you did not deliberately remove content, something is missing from one of them. A payload diff between variants is often the first signal that a rendering failure has occurred silently.

Render both variants on mobile Safari and Chrome. Take a full-page screenshot. Eyeball the visual diff. Trust badge missing? Form button outside the viewport? H1 truncated with an ellipsis? These are things no analytics tool will surface, but a two-minute visual audit will catch immediately.

Verify tracking pixel parity. Open both variant URLs in a network inspector. Count the pixel fires. If the control fires three pixels and the challenger fires four - or vice versa - your conversion data is not measuring the same thing. You cannot declare a winner from asymmetric tracking.

Audit metadata and Open Graph tags. A CDN cache flush can wipe a page's meta description or og:image. If a significant portion of your traffic comes from social shares or email, missing metadata changes the click-through population before they even reach the variant. The test is already compromised before visitors even reach the variant.

Check H1 uniqueness and render fidelity. An H1 that truncates on mobile - because a CSS update removed overflow-wrap: break-word - is still technically present in the DOM. Your SEO tools report it as present. But visually, users see a broken headline that ends mid-sentence. That is a rendering failure, not a content failure. Auditing the DOM alone does not catch it.

What to Do If You Think You Have a Ghost Variant

Do not ship the winner. Stop the test.

Audit the control - the original variant A - against a known-clean version of the page. If you have a Git history or a CMS version history, pull up the page state from the day the test started and compare it to the current control. Look for payload differences, element-level changes, and tracking discrepancies.

If you find a defect, fix it. Then restart the test from a clean baseline - both variants freshly deployed, both audited before traffic is split. Do not attempt to statistically adjust for the ghost period. The contaminated data cannot be salvaged; it will only introduce noise into your analysis. Cut it and start clean.

If you cannot find a specific defect but the numbers looked suspiciously clean - very fast statistical significance, conversion lift concentrated on one device category, or a sudden uplift spike mid-test - treat it as a ghost until proven otherwise. A healthy skepticism about easy wins is not pessimism; it is the correct Bayesian prior when you know how frequently pages degrade silently.

Going forward, make pre-declaration audits a blocking step in your testing process. The test platform cannot do this for you. It has to be an explicit check, run on both URLs, before any result is called.

Frequently asked questions

What is a ghost variant in an A/B test?

A ghost variant is a control that has silently degraded during the test window, such as a missing pixel, a truncated H1, or a social proof block that 404s on mobile. It looks fine at a glance, but the failure suppresses conversions for that variant, so the challenger appears to win by default.

Why do standard analytics tools miss a ghost variant?

A/B testing platforms and analytics tools record whether a conversion event fired, not whether the page rendered correctly at that moment. A session where the social proof section 404ed looks identical to one where it loaded, so the cause of the bounce is invisible.

How do I detect a ghost variant before declaring a winner?

Audit both variants, not just the winner. Compare payload sizes between variants, render both on mobile Safari and Chrome, verify tracking pixel parity, and check metadata and H1 render fidelity. A payload or visual diff is often the first signal of a silent rendering failure.

What should I do if I think my test has a ghost variant?

Do not ship the winner. Stop the test, audit the control against a known-clean version from the day the test started, and fix any defect you find. Then restart from a clean baseline with both variants freshly deployed and audited, rather than trying to salvage the contaminated data.

Audit Both Variants Before You Declare a Winner

Before you declare a winner, audit both variants. The Nebula audit catches rendering failures, payload bloat, and metadata mismatches in under two minutes: giving you the element-level health signals your test platform was never designed to surface.

Related Articles