A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.
Our homepage test had been live since 8 August. The experiments list showed
it collecting. A month later it still had no result to show.The statistics were never the problem. The snippet on our own marketing site
is registered in our cookie banner’s analytics category, so it does not load
until a visitor accepts cookies. The experiment was assigned, configured and
running, and the only visitors it could ever reach were the ones who clicked
Accept.Our own dashboard was no help either. The list said Collecting while the
experiment page said Not collecting, one click apart. Both were correct.
The list meant “running, no result yet”; the detail page meant “we have not
seen this snippet load in 24 hours”. Same word, two meanings, and the screen
that knew was not the screen you looked at first.We fixed both this week. But the month is gone, and no amount of statistical
sophistication would have bought it back, because nothing upstream of the
statistics was working.
Six links, and every one inherits the one before it:If the research is weak, the hypothesis is arbitrary. If the implementation
is broken, the measurement is misleading. If the exposure or goal event is
wrong, no engine on the results page can rescue it. And if nobody agreed what
to do before launch, the decision becomes a negotiation around whichever
number looks best.This is why experiment quality is not only a statistics problem. The rest of
this section covers the statistics in detail. This page covers what has to be
true before they mean anything.
01 Research: start with a problem, not a variation
The fastest way to build a bad test is to begin with the change. Make the
button bigger. Add a testimonial. Rewrite the headline. Those can become
useful experiments, but none of them is a hypothesis yet, because none says
what is currently going wrong.A stronger starting point names the failure:
New visitors do not understand the difference between our plans. If the
comparison is clearer, more of them should pick one, without more refunds
or support contacts.
Now there is something to check before building anything. Are visitors
reaching the pricing section at all? Are they clicking things that are not
clickable? Does GA4 show a drop between plan views and checkout starts?Signals exists for this step. It reads page structure,
your GA4 funnel where you have connected it, and the first party heatmap
where one is available, then scores each idea against an
evidence contract and labels it Test ready,
Needs evidence, Below threshold or Unverified.Be clear about what that does and does not mean. It is not a prediction of
which variation wins. An idea marked Needs evidence is not a bad idea, it is
an idea whose supporting evidence has not cleared its gate, and the label
names the cheapest thing that would raise it.
A hypothesis you cannot lose is not a hypothesis. Before building, write down
the primary metric, the guardrails you refuse to damage, the minimum
detectable effect and, separately, the smallest improvement actually worth
shipping. Those last two are different numbers and both matter. See
minimum detectable effect.Write the decision rule at the same time. A rule agreed after the data
arrives is not a rule.
This is the link that can fail without anyone noticing.Assignment and application are two separate events. A visitor can be assigned
to variant B and never see it, because the JavaScript threw, a selector was
missing, or the component had not rendered yet. The assignment already
happened.ABTestly records it anyway, deliberately. Every variation’s code runs inside
its own try/catch, and a throw does not retract the exposure. That sounds
wrong until you ask who it protects: control has no variation JavaScript, so
control can never throw. Suppress the broken assignments and the loss lands
on one arm only, and you have manufactured a
sample ratio mismatch out of your own
error handling. The tidier number would be the dishonest one.Optimizely counts its impression on the decision as well, and its
documentation says impressions are processed when they are sent, rather than
when they occur. Assignment is the event. Whether the page changed is a
separate question, and until recently nobody we looked at answered it, ourselves included.We now do. The results page reports how many page loads a variation threw on,
as a count and never a percentage, because the
error is deduplicated per session while exposures are recorded per route
change, and a rate across those two granularities would understate the
problem on a single page app without limit.Before launch, check the things that break quietly:
Does assignment hold across route changes, not just first load?
Does the exposure fire only when the experience is genuinely shown?
Do the primary goal and guardrails record on both arms?
Does the original return cleanly when the test is paused?
One argument worth heading off starts with “GA4 does not match the
platform, so the test cannot be trusted”. That conclusion is too quick.The two are not counting the same population. The platform starts from
visitors who were eligible and assigned. GA4 starts from events that were
collected, processed and attributed. Consent, identity, assignment timing and
metric scope all move those apart, and none of that means either number is
broken.ABTestly keeps accepted exposures and goals in an
exact experiment ledger, and the snippet can push
the same experience_impression event into your existing dataLayer and GTM
setup. That makes the comparison useful, because both sides start from one
shared event instead of two loosely related reports.The question worth asking is why the populations differ. Not which dashboard
to make look right.
05 Analysis: significant and worth doing are different tests
A result can be significant and commercially pointless. It can also be
inconclusive and still tell you where to aim a better powered follow up.A winning primary metric is not enough on its own if revenue per visitor
falls, if the split is uneven, or if one unusually large order is carrying
the arm. That last one is real enough that revenue analysis applies an order
value cap, and the cap excludes rather than winsorises, so a single outlier
cannot quietly set the result.One deliberate design choice worth knowing: the verdict on the results page
is confidence only. Guardrails, sample ratio mismatch and delivery health are
not folded into it. They sit beside it. A trust signal that silently
moves a winner is a trust signal you cannot audit, so we show them together
and leave the judgement with you.
If the team has not agreed what a result means, the meeting decides instead
of the experiment.Record the decision and, more importantly, the transferable part: what you
now believe about your visitors that you did not believe last month. It is also
the easiest step to skip, because nothing forces it.
AI is genuinely useful across this chain. It can summarise research, draft an
implementation, suggest segments worth investigating and propose alternative
explanations for a result.It is also very good at making thin evidence sound confident. It will offer a
reason a result happened, and the reason will be fluent whether or not it is
true.So the useful test of an AI feature in experimentation is not how convincing
its output reads. It is whether it shows you what evidence it used, what it
assumed, what it could not verify, and what experiment would settle it. An
assistant that hands you a conclusion has moved the judgement call somewhere
you cannot inspect.
If this test returns a result tomorrow, will we know what it means, who it
applies to, and what we will do about it?If the answer is no, more traffic will not fix it. Somewhere upstream, a link
in the chain is weak, and the result will inherit it.Our homepage test is the version of this we learned the hard way. It ran for
a month, on our own site, built by the people who make the tool, and the
weak link was not the statistics. It was the cookie banner deciding who
the test could reach.
Last modified on September 10, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ABTestly","description":"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.","colors":{"primary":"#2563EB","light":"#60A5FA","dark":"#1D4FD8"},"logo":{"light":"https://mintcdn.com/abtestly/00G4YX1JcYDGimmE/logo/light.svg?fit=max\u0026auto=format\u0026n=00G4YX1JcYDGimmE\u0026q=85\u0026s=8e30c68a69d5838fd283382cc9a3041c","dark":"https://mintcdn.com/abtestly/00G4YX1JcYDGimmE/logo/dark.svg?fit=max\u0026auto=format\u0026n=00G4YX1JcYDGimmE\u0026q=85\u0026s=26be4c014a0ada510816b8a49547f52a"},"favicon":"https://mintcdn.com/abtestly/EO3uzUwEIRnQ3Ov9/favicon.svg?fit=max\u0026auto=format\u0026n=EO3uzUwEIRnQ3Ov9\u0026q=85\u0026s=c40e32c2a3477e6ce9dfe2fec2977576","background":{"color":{"light":"#f2ede1","dark":"#262935"}},"navbar":{"links":[{"href":"https://abtestly.com/pricing","label":"Pricing"},{"href":"mailto:support@abtestly.com","label":"Support"}],"primary":{"type":"button","label":"Open dashboard","href":"https://app.abtestly.com"}},"footer":{"socials":{"github":"https://github.com/abtestly"}},"seo":{"metatags":{"og:site_name":"ABTestly Documentation","og:type":"website","og:logo":"https://abtestly.com/assets/favicon.svg","og:image":"https://docs.abtestly.com/images/og-image.png","og:image:width":"1200","og:image:height":"630","og:image:alt":"ABTestly Documentation. Code-first A/B testing, documented.","twitter:card":"summary_large_image","twitter:image":"https://docs.abtestly.com/images/og-image.png","twitter:image:alt":"ABTestly Documentation. Code-first A/B testing, documented.","og:description":"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.","twitter:site":"@abtestly"},"indexing":"all"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"abtestly","hasAudioNarration":false,"actualSubdomain":"abtestly","customDomains":["docs.abtestly.com"],"gitSource":{"type":"github","owner":"maaislam","repo":"abtestly-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ab639727e9a03c18a5151a1","collectionId":"07e21d16-5bbf-465a-a29a-86ea6cdb120f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ab639727e9a03c18a5151a1"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ab639727e9a03c18a5151a1","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"Read results","count":13},{"language":"default","tag":"Build a test","count":10},{"language":"default","tag":"Developer reference","count":8},{"language":"default","tag":"Methodology","count":7},{"language":"default","tag":"Site settings","count":7},{"language":"default","tag":"Signals","count":6},{"language":"default","tag":"Target the right visitors","count":6},{"language":"default","tag":"Getting started","count":5},{"language":"default","tag":"Integrations","count":5},{"language":"default","tag":"Measure","count":5}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"signals-pipeline.css","content":"@keyframes abtPipeMergeFlow{to{stroke-dashoffset:-14}}@keyframes abtPipeBeat{0%,to{opacity:0;transform:scale(.965)}6%{opacity:.9;transform:scale(1.004)}11%{opacity:1;transform:scale(1.012)}18%{opacity:.55;transform:scale(1.022)}26%{opacity:0;transform:scale(1.032)}}@keyframes abtPipeArrowGlide{0%,26%,to{opacity:.4;transform:translateX(-3px);color:var(--ink-5)}7%{opacity:1;transform:translateX(2px);color:var(--brand)}16%{opacity:.6;transform:translateX(3px);color:var(--brand)}}@keyframes abtReturnFlow{0%,44%{top:calc(100% - 8px);opacity:0}52%{top:calc(100% - 8px);opacity:1}88%{top:0;opacity:1}95%,to{top:0;opacity:0}}@keyframes abtPlLoopBeat{0%,50%,90%,to{opacity:.45}60%,82%{opacity:.95}}@keyframes abtPlLoopDot{0%,52%{left:calc(100% - 18px);opacity:0}57%{left:calc(100% - 18px);opacity:1}80%{left:9px;opacity:1}86%,to{left:9px;opacity:0}}.abt-signals-pipeline{--canvas:#f7f3ee;--paper:#fefdfb;--paper-2:#faf8f4;--well:#f3eee8;--line:#e9e2db;--line-2:#f3eee8;--line-strong:#d8d0c5;--ink:#0d253d;--ink-2:#273951;--ink-3:#5e6d85;--ink-4:#8a93a3;--ink-5:#c9c1b4;--brand:#5e6ad2;--brand-600:#4d59c4;--brand-700:#4434d4;--brand-soft:#eceefb;--brand-soft-2:#f4f6fc;--brand-ring:rgba(94, 106, 210, 0.35);--neg:#c2410c;--neg-soft:#f6e4d9;--warn:#9b6829;--warn-ink:#7a4d18;--warn-soft:#f5e9d4;--shadow-xs:0 1px 2px rgba(13, 37, 61, 0.04);--shadow-md:0 4px 12px rgba(13, 37, 61, 0.06);--r-xs:5px;--r-sm:7px;--r-md:9px;--r-lg:11px;--r-xl:14px;--r-2xl:18px;--r-pill:999px;--t-base:160ms;--ease:cubic-bezier(0.2, 0.7, 0.2, 1);--ease-spring:cubic-bezier(0.34, 1.32, 0.46, 1);--font-sans:system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;--font-mono:ui-monospace, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;color-scheme:light;width:100%;margin:1.6rem 0}html.dark .abt-signals-pipeline{--canvas:#09101b;--paper:#191d24;--paper-2:#1e232b;--well:#15181f;--line:#272c34;--line-2:#1b1f26;--line-strong:#353c47;--ink:#e8eaee;--ink-2:#c2c7ce;--ink-3:#9298a2;--ink-4:#767d88;--ink-5:#3a4048;--brand:#7480e8;--brand-600:#8b95ef;--brand-700:#b6bdf8;--brand-soft:rgba(116, 128, 232, 0.16);--brand-soft-2:rgba(116, 128, 232, 0.08);--brand-ring:rgba(116, 128, 232, 0.45);--neg:#e79457;--neg-soft:rgba(231, 148, 87, 0.18);--warn:#d9a44c;--warn-ink:#ecc480;--warn-soft:rgba(217, 164, 76, 0.18);--shadow-xs:0 1px 2px rgba(0, 0, 0, 0.4);--shadow-md:0 4px 12px rgba(0, 0, 0, 0.5);color-scheme:dark}.abt-signals-pipeline *,.abt-signals-pipeline ::after,.abt-signals-pipeline ::before{box-sizing:border-box}.abt-signals-pipeline .audit{container-type:inline-size;border:1px solid var(--line);border-radius:var(--r-2xl);background:radial-gradient(130% 90% at 0% 0%,var(--brand-soft-2) 0%,transparent 44%),var(--paper);box-shadow:var(--shadow-md);padding:30px 30px 32px;overflow:hidden;font-family:var(--font-sans);color:var(--ink);-webkit-font-smoothing:antialiased}.abt-signals-pipeline .pipe-cap{display:flex;justify-content:space-between;gap:16px;margin-bottom:20px;flex-wrap:wrap}.abt-signals-pipeline .pipe-cap span{font-family:var(--font-mono);font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--brand-700);text-wrap:pretty}.abt-signals-pipeline .pipe-cap .r{color:var(--ink-4)}.abt-signals-pipeline .pipe-cap .r::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--ink-5)}.abt-signals-pipeline .pipe-diagram{display:flex;align-items:stretch}.abt-signals-pipeline .pipe-inputs{flex:0 0 232px;display:flex;flex-direction:column;gap:10px}.abt-signals-pipeline .pipe-inputs .pnode{flex:1;flex-direction:row;align-items:flex-start;gap:11px;padding:13px}.abt-signals-pipeline .pipe-inputs .pn-ic{margin-top:1px}.abt-signals-pipeline .pipe-inputs .pn-col{display:flex;flex-direction:column;gap:7px;min-width:0}.abt-signals-pipeline .pipe-inputs .pn-n{margin-top:2px}.abt-signals-pipeline .pipe-merge{flex:0 0 50px;align-self:stretch;color:var(--line-strong)}.abt-signals-pipeline .pipe-merge svg{width:100%;height:100%;display:block}.abt-signals-pipeline .pipe-merge .pm-v{display:none}.abt-signals-pipeline .pipe-merge path{fill:none;stroke:currentColor;stroke-width:1.5}.abt-signals-pipeline .pchain{flex:1 1 0;display:flex;align-items:center}.abt-signals-pipeline .pipe-arrow{display:flex;align-items:center;justify-content:center;color:var(--ink-5);padding:0 7px;flex:0 0 auto}.abt-signals-pipeline .pipe-arrow svg{width:19px;height:19px}.abt-signals-pipeline .pnode{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);padding:14px;box-shadow:var(--shadow-xs);display:flex;flex-direction:column;gap:9px;width:100%}.abt-signals-pipeline .pn-head{display:flex;align-items:center;gap:9px}.abt-signals-pipeline .pn-ic{width:30px;height:30px;flex:none;border-radius:var(--r-sm);background:var(--brand-soft);color:var(--brand);display:grid;place-items:center}.abt-signals-pipeline .pn-ic svg{width:16px;height:16px}.abt-signals-pipeline .pn-n{font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-4)}.abt-signals-pipeline .pn-t{font-size:13.5px;font-weight:500;color:var(--ink);letter-spacing:-.01em;line-height:1.25}.abt-signals-pipeline .pn-d{font-size:11.5px;line-height:1.45;color:var(--ink-3)}.abt-signals-pipeline .pnode.is-hub{border-color:var(--brand-ring);background:linear-gradient(180deg,var(--brand-soft-2),var(--paper) 72%)}.abt-signals-pipeline .pnode.is-fals .pn-ic{background:var(--neg-soft);color:var(--neg)}.abt-signals-pipeline .pn-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:1px;min-width:0}.abt-signals-pipeline .pchain,.abt-signals-pipeline .pn-col,.abt-signals-pipeline .pn-head,.abt-signals-pipeline .pnode{min-width:0}.abt-signals-pipeline .pn-d,.abt-signals-pipeline .pn-t{overflow-wrap:anywhere;text-wrap:pretty}.abt-signals-pipeline .pn-tag{font-family:var(--font-mono);font-size:9.5px;line-height:1.45;letter-spacing:.01em;color:var(--ink-3);background:var(--well);border:1px solid var(--line-2);border-radius:var(--r-xs);padding:2px 6px;white-space:normal;max-width:100%;overflow-wrap:anywhere}.abt-signals-pipeline .pn-tag.b{color:var(--brand-700);background:var(--brand-soft);border-color:transparent}.abt-signals-pipeline .pn-tag.q{color:var(--warn-ink);background:var(--warn-soft);border-color:transparent}.abt-signals-pipeline .pipe-foot{display:flex;justify-content:space-between;align-items:center;gap:14px 28px;flex-wrap:wrap;margin-top:20px;padding-top:16px;border-top:1px solid var(--line-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-4)}.abt-signals-pipeline .pipe-cap span,.abt-signals-pipeline .pipe-foot span{display:inline-flex;align-items:center;gap:7px}.abt-signals-pipeline .pipe-foot span::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--brand);flex:none}.abt-signals-pipeline .pipe-foot b{color:var(--ink-3);font-weight:500}.abt-signals-pipeline .pipe-return{display:none}@container (max-width: 980px){.abt-signals-pipeline .pipe-diagram{flex-direction:column;gap:10px;position:relative;padding-left:38px}.abt-signals-pipeline .pipe-inputs{flex:none;flex-direction:row}.abt-signals-pipeline .pipe-inputs .pnode{flex:1 1 0}.abt-signals-pipeline .pipe-merge{flex:none;height:36px;width:100%}.abt-signals-pipeline .pipe-merge .pm-h{display:none}.abt-signals-pipeline .pipe-merge .pm-v{display:block}.abt-signals-pipeline .pchain{flex:none}.abt-signals-pipeline .pipe-arrow{padding:2px 0;transform:rotate(90deg)}.abt-signals-pipeline .pipe-return{display:block;position:absolute;left:2px;top:20px;bottom:20px;width:28px;border:2px dashed var(--brand-ring);border-right:0;border-radius:var(--r-lg) 0 0 var(--r-lg);pointer-events:none}.abt-signals-pipeline .pipe-return::after{content:'';position:absolute;top:-5px;right:-8px;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:8px solid var(--brand)}.abt-signals-pipeline .pipe-return::before{content:'';position:absolute;left:-3px;top:0;width:8px;height:8px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 4px var(--brand-soft);opacity:0}}@container (max-width: 620px){.abt-signals-pipeline .pipe-inputs{flex-direction:column}}@media (prefers-reduced-motion:no-preference){.abt-signals-pipeline .audit .pipe-merge path{stroke:var(--brand);stroke-dasharray:5 9;animation:abtPipeMergeFlow 1.4s linear infinite}.abt-signals-pipeline .audit .pnode{position:relative}.abt-signals-pipeline .audit .pnode::after{content:'';position:absolute;inset:-2px;border-radius:13px;box-shadow:0 0 0 1.5px var(--brand-ring),0 12px 36px -6px var(--brand-ring);opacity:0;pointer-events:none;transform-origin:center;animation:abtPipeBeat 8.5s cubic-bezier(.37,0,.34,1) infinite}.abt-signals-pipeline .audit .pnode.is-fals::after{box-shadow:0 0 0 1.5px var(--neg),0 12px 36px -6px var(--neg-soft)}.abt-signals-pipeline .audit .pipe-inputs .pnode:nth-child(1)::after{animation-delay:0s}.abt-signals-pipeline .audit .pipe-inputs .pnode:nth-child(2)::after{animation-delay:.13s}.abt-signals-pipeline .audit .pipe-inputs .pnode:nth-child(3)::after{animation-delay:.26s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(3) .pnode::after{animation-delay:1.05s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(5) .pnode::after{animation-delay:1.95s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(7) .pnode::after{animation-delay:2.85s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(9) .pnode::after{animation-delay:3.75s}.abt-signals-pipeline .audit .pipe-arrow svg{animation:abtPipeArrowGlide 8.5s cubic-bezier(.37,0,.34,1) infinite;will-change:transform,opacity}.abt-signals-pipeline .audit .pipe-diagram>.pipe-arrow:nth-child(4) svg{animation-delay:1.5s}.abt-signals-pipeline .audit .pipe-diagram>.pipe-arrow:nth-child(6) svg{animation-delay:2.4s}.abt-signals-pipeline .audit .pipe-diagram>.pipe-arrow:nth-child(8) svg{animation-delay:3.3s}}.abt-signals-pipeline .pipe-loop{position:relative;height:54px;margin:16px 8px 2px}.abt-signals-pipeline .pl-bracket{position:absolute;left:10px;right:10px;top:13px;bottom:8px;border:2px dashed var(--brand);border-top:0;border-radius:0 0 18px 18px;opacity:.55}.abt-signals-pipeline .pl-arrow{position:absolute;left:4px;top:1px;width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:11px solid var(--brand)}.abt-signals-pipeline .pl-dot{position:absolute;bottom:4px;left:calc(100% - 18px);width:9px;height:9px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 4px var(--brand-soft);opacity:0;z-index:2}.abt-signals-pipeline .pl-from,.abt-signals-pipeline .pl-to{position:absolute;top:2px;font-family:var(--font-mono);font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-4);background:var(--paper);padding:0 6px}.abt-signals-pipeline .pl-from{right:12px}.abt-signals-pipeline .pl-to{left:24px}.abt-signals-pipeline .pl-tag{position:absolute;left:50%;top:46px;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11.5px;color:var(--brand-700);background:var(--paper);border:1px solid var(--brand-ring);border-radius:var(--r-pill);padding:6px 14px;box-shadow:var(--shadow-xs);white-space:nowrap}.abt-signals-pipeline .pl-tag svg{width:14px;height:14px;color:var(--brand)}@container (max-width: 980px){.abt-signals-pipeline .pipe-loop{height:auto;margin-top:16px;text-align:center}.abt-signals-pipeline .pl-arrow,.abt-signals-pipeline .pl-bracket,.abt-signals-pipeline .pl-dot,.abt-signals-pipeline .pl-from,.abt-signals-pipeline .pl-to{display:none}.abt-signals-pipeline .pl-tag{position:static;transform:none;white-space:normal}}@media (prefers-reduced-motion:no-preference){.abt-signals-pipeline .pl-bracket{animation:abtPlLoopBeat 8.5s ease-in-out infinite}.abt-signals-pipeline .pl-dot{animation:abtPlLoopDot 8.5s cubic-bezier(.45,.05,.3,1) infinite}.abt-signals-pipeline .pipe-return::before{animation:abtReturnFlow 8.5s cubic-bezier(.45,.05,.3,1) infinite}}.abt-signals-pipeline a.pnode{text-decoration:none;color:inherit;cursor:pointer}.abt-signals-pipeline .pipe-diagram .pnode:focus-within,.abt-signals-pipeline .pipe-diagram .pnode:hover{border-color:var(--brand-ring);box-shadow:var(--shadow-md)}.abt-signals-pipeline .pipe-diagram .pnode:focus-visible{outline:2px solid var(--brand);outline-offset:2px}@media (prefers-reduced-motion:no-preference){.abt-signals-pipeline .pipe-diagram .pnode{transition:border-color .16s var(--ease),box-shadow .16s var(--ease)}}.sig-anchor{display:block;height:0;scroll-margin-top:5rem}"}],"page":{"pagePath":"methodology/underneath-the-statistics","slug":"/methodology/underneath-the-statistics","pageMetadata":{"title":"Underneath the statistics","sidebarTitle":"Underneath the statistics","description":"A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.","href":"/methodology/underneath-the-statistics"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,blockquote:`blockquote`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,OptimizedImage}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Our homepage test had been live since 8 August. The experiments list showed\nit collecting. A month later it still had no result to show.`}),`\n`,_jsx(_components.p,{children:`The statistics were never the problem. The snippet on our own marketing site\nis registered in our cookie banner’s analytics category, so it does not load\nuntil a visitor accepts cookies. The experiment was assigned, configured and\nrunning, and the only visitors it could ever reach were the ones who clicked\nAccept.`}),`\n`,_jsxs(_components.p,{children:[`Our own dashboard was no help either. The list said `,_jsx(_components.strong,{children:`Collecting`}),` while the\nexperiment page said `,_jsx(_components.strong,{children:`Not collecting`}),`, one click apart. Both were correct.\nThe list meant “running, no result yet”; the detail page meant “we have not\nseen this snippet load in 24 hours”. Same word, two meanings, and the screen\nthat knew was not the screen you looked at first.`]}),`\n`,_jsx(_components.p,{children:`We fixed both this week. But the month is gone, and no amount of statistical\nsophistication would have bought it back, because nothing upstream of the\nstatistics was working.`}),`\n`,_jsx(Heading,{level:`2`,id:`a-result-is-a-chain`,children:`A result is a chain`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=db59d274f1359d1ecf9f6b5070cceae1`,alt:`The six links a trustworthy experiment depends on`,\"data-og-width\":`3200`,width:`3200`,\"data-og-height\":`1640`,height:`1640`,\"data-path\":`images/methodology-trust-chain.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?w=280\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=b5c9b743dc2483ccf08ca338f905e109 280w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?w=560\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=c60008a92374c7dae94657203e915bc8 560w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?w=840\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=56acc9880b2f8c253bb2f63f9cb3a56f 840w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?w=1100\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=7a3b35e15d34ad160753751dc293dfba 1100w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?w=1650\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=7b648da86fdd795c85cc9975e6d8e5a7 1650w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-trust-chain.png?w=2500\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=b6c912eb5651f1a412bf7b6070f8f120 2500w`}),`\n`,_jsx(_components.p,{children:`Six links, and every one inherits the one before it:`}),`\n`,_jsx(_components.p,{children:`If the research is weak, the hypothesis is arbitrary. If the implementation\nis broken, the measurement is misleading. If the exposure or goal event is\nwrong, no engine on the results page can rescue it. And if nobody agreed what\nto do before launch, the decision becomes a negotiation around whichever\nnumber looks best.`}),`\n`,_jsx(_components.p,{children:`This is why experiment quality is not only a statistics problem. The rest of\nthis section covers the statistics in detail. This page covers what has to be\ntrue before they mean anything.`}),`\n`,_jsx(Heading,{level:`2`,id:`01-research-start-with-a-problem-not-a-variation`,children:`01 Research: start with a problem, not a variation`}),`\n`,_jsx(_components.p,{children:`The fastest way to build a bad test is to begin with the change. Make the\nbutton bigger. Add a testimonial. Rewrite the headline. Those can become\nuseful experiments, but none of them is a hypothesis yet, because none says\nwhat is currently going wrong.`}),`\n`,_jsx(_components.p,{children:`A stronger starting point names the failure:`}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:`New visitors do not understand the difference between our plans. If the\ncomparison is clearer, more of them should pick one, without more refunds\nor support contacts.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Now there is something to check before building anything. Are visitors\nreaching the pricing section at all? Are they clicking things that are not\nclickable? Does GA4 show a drop between plan views and checkout starts?`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/signals/overview`,children:`Signals`}),` exists for this step. It reads page structure,\nyour GA4 funnel where you have connected it, and the first party heatmap\nwhere one is available, then scores each idea against an\n`,_jsx(_components.a,{href:`/signals/evidence-contract`,children:`evidence contract`}),` and labels it `,_jsx(_components.strong,{children:`Test ready`}),`,\n`,_jsx(_components.strong,{children:`Needs evidence`}),`, `,_jsx(_components.strong,{children:`Below threshold`}),` or `,_jsx(_components.strong,{children:`Unverified`}),`.`]}),`\n`,_jsx(_components.p,{children:`Be clear about what that does and does not mean. It is not a prediction of\nwhich variation wins. An idea marked Needs evidence is not a bad idea, it is\nan idea whose supporting evidence has not cleared its gate, and the label\nnames the cheapest thing that would raise it.`}),`\n`,_jsx(Heading,{level:`2`,id:`02-hypothesis-something-a-result-can-contradict`,children:`02 Hypothesis: something a result can contradict`}),`\n`,_jsxs(_components.p,{children:[`A hypothesis you cannot lose is not a hypothesis. Before building, write down\nthe primary metric, the guardrails you refuse to damage, the minimum\ndetectable effect and, separately, the smallest improvement actually worth\nshipping. Those last two are different numbers and both matter. See\n`,_jsx(_components.a,{href:`/methodology/minimum-detectable-effect`,children:`minimum detectable effect`}),`.`]}),`\n`,_jsx(_components.p,{children:`Write the decision rule at the same time. A rule agreed after the data\narrives is not a rule.`}),`\n`,_jsx(Heading,{level:`2`,id:`03-implementation-assignment-is-not-application`,children:`03 Implementation: assignment is not application`}),`\n`,_jsx(_components.p,{children:`This is the link that can fail without anyone noticing.`}),`\n`,_jsx(_components.p,{children:`Assignment and application are two separate events. A visitor can be assigned\nto variant B and never see it, because the JavaScript threw, a selector was\nmissing, or the component had not rendered yet. The assignment already\nhappened.`}),`\n`,_jsxs(_components.p,{children:[`ABTestly records it anyway, deliberately. Every variation’s code runs inside\nits own try/catch, and a throw does not retract the exposure. That sounds\nwrong until you ask who it protects: control has no variation JavaScript, so\ncontrol can never throw. Suppress the broken assignments and the loss lands\non one arm only, and you have manufactured a\n`,_jsx(_components.a,{href:`/methodology/sample-ratio-mismatch`,children:`sample ratio mismatch`}),` out of your own\nerror handling. The tidier number would be the dishonest one.`]}),`\n`,_jsx(_components.p,{children:`Optimizely counts its impression on the decision as well, and its\ndocumentation says impressions are processed when they are sent, rather than\nwhen they occur. Assignment is the event. Whether the page changed is a\nseparate question, and until recently nobody we looked at answered it, ourselves included.`}),`\n`,_jsxs(_components.p,{children:[`We now do. The results page reports how many page loads a variation threw on,\nas `,_jsx(_components.a,{href:`/results/variation-errors`,children:`a count and never a percentage`}),`, because the\nerror is deduplicated per session while exposures are recorded per route\nchange, and a rate across those two granularities would understate the\nproblem on a single page app without limit.`]}),`\n`,_jsx(_components.p,{children:`Before launch, check the things that break quietly:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Does assignment hold across route changes, not just first load?`}),`\n`,_jsx(_components.li,{children:`Does the exposure fire only when the experience is genuinely shown?`}),`\n`,_jsx(_components.li,{children:`Do the primary goal and guardrails record on both arms?`}),`\n`,_jsx(_components.li,{children:`Does the original return cleanly when the test is paused?`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`04-measurement-do-not-force-two-systems-to-agree`,children:`04 Measurement: do not force two systems to agree`}),`\n`,_jsx(_components.p,{children:`One argument worth heading off starts with “GA4 does not match the\nplatform, so the test cannot be trusted”. That conclusion is too quick.`}),`\n`,_jsx(_components.p,{children:`The two are not counting the same population. The platform starts from\nvisitors who were eligible and assigned. GA4 starts from events that were\ncollected, processed and attributed. Consent, identity, assignment timing and\nmetric scope all move those apart, and none of that means either number is\nbroken.`}),`\n`,_jsxs(_components.p,{children:[`ABTestly keeps accepted exposures and goals in an\n`,_jsx(_components.a,{href:`/results/exact-ledger`,children:`exact experiment ledger`}),`, and the snippet can push\nthe same `,_jsx(_components.code,{children:`experience_impression`}),` event into your existing dataLayer and GTM\nsetup. That makes the comparison useful, because both sides start from one\nshared event instead of two loosely related reports.`]}),`\n`,_jsx(_components.p,{children:`The question worth asking is why the populations differ. Not which dashboard\nto make look right.`}),`\n`,_jsx(Heading,{level:`2`,id:`05-analysis-significant-and-worth-doing-are-different-tests`,children:`05 Analysis: significant and worth doing are different tests`}),`\n`,_jsx(_components.p,{children:`A result can be significant and commercially pointless. It can also be\ninconclusive and still tell you where to aim a better powered follow up.`}),`\n`,_jsx(_components.p,{children:`A winning primary metric is not enough on its own if revenue per visitor\nfalls, if the split is uneven, or if one unusually large order is carrying\nthe arm. That last one is real enough that revenue analysis applies an order\nvalue cap, and the cap excludes rather than winsorises, so a single outlier\ncannot quietly set the result.`}),`\n`,_jsxs(_components.p,{children:[`One deliberate design choice worth knowing: the verdict on the results page\nis confidence only. Guardrails, sample ratio mismatch and delivery health are\n`,_jsx(_components.strong,{children:`not`}),` folded into it. They sit beside it. A trust signal that silently\nmoves a winner is a trust signal you cannot audit, so we show them together\nand leave the judgement with you.`]}),`\n`,_jsx(Heading,{level:`2`,id:`06-decision-written-down-before-the-data`,children:`06 Decision: written down before the data`}),`\n`,_jsx(_components.p,{children:`If the team has not agreed what a result means, the meeting decides instead\nof the experiment.`}),`\n`,_jsx(_components.p,{children:`Record the decision and, more importantly, the transferable part: what you\nnow believe about your visitors that you did not believe last month. It is also\nthe easiest step to skip, because nothing forces it.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=1572b23efe05434178505472d19cf421`,alt:`The result is an input to the next hypothesis, not an ending`,\"data-og-width\":`3200`,width:`3200`,\"data-og-height\":`1640`,height:`1640`,\"data-path\":`images/methodology-learning-loop.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?w=280\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=734a2b7909e9d82eb71ef8c91699aa85 280w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?w=560\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=e7e29913c51a507285e4a613393a2090 560w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?w=840\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=294a159adabaffd5ea5032d64e6d69a4 840w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?w=1100\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=625ee345ece6d3d65fc9eb432bc841cd 1100w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?w=1650\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=a1251dd9635fa8e9d69d716430007867 1650w, https://mintcdn.com/abtestly/8DSl_FeX8BGp3SwF/images/methodology-learning-loop.png?w=2500\u0026fit=max\u0026auto=format\u0026n=8DSl_FeX8BGp3SwF\u0026q=85\u0026s=163d886abff1c2bcdea193ea790b053d 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`where-ai-helps-and-where-it-does-not`,children:`Where AI helps, and where it does not`}),`\n`,_jsx(_components.p,{children:`AI is genuinely useful across this chain. It can summarise research, draft an\nimplementation, suggest segments worth investigating and propose alternative\nexplanations for a result.`}),`\n`,_jsx(_components.p,{children:`It is also very good at making thin evidence sound confident. It will offer a\nreason a result happened, and the reason will be fluent whether or not it is\ntrue.`}),`\n`,_jsx(_components.p,{children:`So the useful test of an AI feature in experimentation is not how convincing\nits output reads. It is whether it shows you what evidence it used, what it\nassumed, what it could not verify, and what experiment would settle it. An\nassistant that hands you a conclusion has moved the judgement call somewhere\nyou cannot inspect.`}),`\n`,_jsx(Heading,{level:`2`,id:`the-question-worth-asking-before-launch`,children:`The question worth asking before launch`}),`\n`,_jsx(_components.p,{children:`If this test returns a result tomorrow, will we know what it means, who it\napplies to, and what we will do about it?`}),`\n`,_jsx(_components.p,{children:`If the answer is no, more traffic will not fix it. Somewhere upstream, a link\nin the chain is weak, and the result will inherit it.`}),`\n`,_jsx(_components.p,{children:`Our homepage test is the version of this we learned the hard way. It ran for\na month, on our own site, built by the people who make the tool, and the\nweak link was not the statistics. It was the cookie banner deciding who\nthe test could reach.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Underneath the statistics","sidebarTitle":"Underneath the statistics","description":"A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.","href":"/methodology/underneath-the-statistics"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"A result is a chain","slug":"a-result-is-a-chain","depth":2,"children":[]},{"title":"01 Research: start with a problem, not a variation","slug":"01-research-start-with-a-problem-not-a-variation","depth":2,"children":[]},{"title":"02 Hypothesis: something a result can contradict","slug":"02-hypothesis-something-a-result-can-contradict","depth":2,"children":[]},{"title":"03 Implementation: assignment is not application","slug":"03-implementation-assignment-is-not-application","depth":2,"children":[]},{"title":"04 Measurement: do not force two systems to agree","slug":"04-measurement-do-not-force-two-systems-to-agree","depth":2,"children":[]},{"title":"05 Analysis: significant and worth doing are different tests","slug":"05-analysis-significant-and-worth-doing-are-different-tests","depth":2,"children":[]},{"title":"06 Decision: written down before the data","slug":"06-decision-written-down-before-the-data","depth":2,"children":[]},{"title":"Where AI helps, and where it does not","slug":"where-ai-helps-and-where-it-does-not","depth":2,"children":[]},{"title":"The question worth asking before launch","slug":"the-question-worth-asking-before-launch","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/abtestly/2b7ba09c10a131d7/chat-widget.js","/_mintlify/custom/abtestly/99bdab09a5894d14/consent.js","/_mintlify/custom/abtestly/247c45f8fadb8f9c/docs-code-copy.js","/_mintlify/custom/abtestly/8b522d54658179ab/ga4-init.js"],"subdomain":"abtestly","siteName":"ABTestly","title":"Underneath the statistics - ABTestly","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-10T09:58:58.003Z","gitLastModified":"2026-09-10T09:58:02.000Z","originalFileLocation":"methodology/underneath-the-statistics.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ABTestly\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Underneath the statistics - ABTestly\">\u003cmeta data-mint-head property=\"og:description\" content=\"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ABTestly Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.abtestly.com/methodology/underneath-the-statistics\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.abtestly.com/images/og-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Underneath the statistics - ABTestly\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.abtestly.com/images/og-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ABTestly\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2563EB\">\u003cmeta data-mint-head name=\"og:logo\" content=\"https://abtestly.com/assets/favicon.svg\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"ABTestly Documentation. Code-first A/B testing, documented.\">\u003cmeta data-mint-head name=\"twitter:image:alt\" content=\"ABTestly Documentation. Code-first A/B testing, documented.\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.abtestly.com/methodology/underneath-the-statistics\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/methodology/underneath-the-statistics.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.abtestly.com/#organization\",\"name\":\"ABTestly\",\"url\":\"https://docs.abtestly.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/abtestly/00G4YX1JcYDGimmE/logo/light.svg?fit=max\u0026auto=format\u0026n=00G4YX1JcYDGimmE\u0026q=85\u0026s=8e30c68a69d5838fd283382cc9a3041c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.abtestly.com#website\",\"name\":\"ABTestly\",\"url\":\"https://docs.abtestly.com\",\"publisher\":{\"@id\":\"https://docs.abtestly.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.abtestly.com/methodology/underneath-the-statistics#webpage\",\"url\":\"https://docs.abtestly.com/methodology/underneath-the-statistics\",\"name\":\"Underneath the statistics\",\"description\":\"A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.\",\"dateModified\":\"2026-09-10T09:58:02.000Z\",\"isPartOf\":{\"@id\":\"https://docs.abtestly.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.abtestly.com/methodology/underneath-the-statistics#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.abtestly.com/methodology/underneath-the-statistics#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Methodology\",\"item\":\"https://docs.abtestly.com/methodology/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Underneath the statistics\",\"item\":\"https://docs.abtestly.com/methodology/underneath-the-statistics\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.abtestly.com/methodology/underneath-the-statistics#article\",\"headline\":\"Underneath the statistics\",\"name\":\"Underneath the statistics\",\"description\":\"A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion.\",\"url\":\"https://docs.abtestly.com/methodology/underneath-the-statistics\",\"mainEntityOfPage\":{\"@id\":\"https://docs.abtestly.com/methodology/underneath-the-statistics#webpage\"},\"image\":\"https://docs.abtestly.com/images/og-image.png\",\"dateModified\":\"2026-09-10T09:58:02.000Z\",\"publisher\":{\"@id\":\"https://docs.abtestly.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.abtestly.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ABTestly\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ABTestly","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"ABTestly Documentation: Code-first A/B Testing","sidebarTitle":"Introduction","href":"/introduction"},{"title":"Run your first A/B test in about fifteen minutes","sidebarTitle":"Quickstart","href":"/quickstart"},{"title":"How ABTestly works","href":"/concepts/how-it-works"},{"title":"Documentation index","href":"/index"},{"title":"Documentation changelog","href":"/changelog"}]},{"group":"Install","pages":[{"title":"Install the snippet","href":"/install/snippet"},{"title":"Verify the snippet is working","href":"/install/verify"},{"title":"Single-page apps","href":"/install/spa"},{"title":"Consent \u0026 deferred mode","href":"/install/consent"},{"title":"Visitor opt-out","href":"/install/opt-out"}]},{"group":"Build a test","pages":[{"title":"Create an experiment","href":"/build/create"},{"title":"JavaScript and CSS variations","sidebarTitle":"Variations","href":"/build/variations"},{"title":"Review changes before you save","sidebarTitle":"Review changes","href":"/build/review-changes"},{"title":"Code history","href":"/build/code-history"},{"title":"Code check","href":"/build/code-check"},{"title":"Dev libraries","href":"/build/dev-libraries"},{"title":"Split URL redirect tests","sidebarTitle":"Redirect tests","href":"/build/redirect-tests"},{"title":"Clone an experiment","href":"/build/clone"},{"title":"Schedule an experiment","href":"/build/schedule"},{"title":"Autosave and drafts","href":"/build/autosave"}]},{"group":"Target the right visitors","pages":[{"title":"Targeting overview","href":"/targeting/overview"},{"title":"URL rules","href":"/targeting/url-rules"},{"title":"Audiences","href":"/targeting/audiences"},{"title":"Geo targeting","href":"/targeting/geo"},{"title":"Saved Locations \u0026 Audiences","href":"/targeting/saved-lists"},{"title":"Activation triggers","href":"/targeting/activation-triggers"}]},{"group":"Mutual exclusion groups","pages":[{"title":"Exclusion groups overview","href":"/exclusion-groups/overview"},{"title":"How allocation works","href":"/exclusion-groups/how-it-works"},{"title":"Long-term holdouts","href":"/exclusion-groups/holdouts"},{"title":"Managing membership","href":"/exclusion-groups/managing"}]},{"group":"Measure","pages":[{"title":"A/B test goals in ABTestly","sidebarTitle":"Goals overview","href":"/goals/overview"},{"title":"A/B test conversion goals: clicks, forms, revenue and custom events","sidebarTitle":"Goal types","href":"/goals/types"},{"title":"System default goals","sidebarTitle":"System defaults","href":"/goals/system-defaults"},{"title":"A/B test guardrail metrics and primary goals","sidebarTitle":"Primary vs guardrail","href":"/goals/primary-vs-guardrail"},{"title":"A/B test goal tracking health","sidebarTitle":"Goal firing health","href":"/goals/health"}]},{"group":"Read results","pages":[{"title":"Reading a result","href":"/results/reading-a-result"},{"title":"The three statistics engines","href":"/results/engines"},{"title":"Revenue metrics","href":"/results/revenue-metrics"},{"title":"Segments","href":"/results/segments"},{"title":"Change the baseline","href":"/results/baseline"},{"title":"Time to decision","href":"/results/time-to-decision"},{"title":"Business impact projection","href":"/results/business-impact"},{"title":"Compare LCP between A/B test variants","sidebarTitle":"Speed guardrail","href":"/results/speed-guardrail"},{"title":"The Exact Experiment Ledger","href":"/results/exact-ledger"},{"title":"Detect sample ratio mismatch and broken experiment allocation","sidebarTitle":"Sample ratio mismatch","href":"/results/srm"},{"title":"Editing a running A/B test without invalidating the results","sidebarTitle":"Editing a running test","href":"/results/editing-a-running-test"},{"title":"What the affected page loads count on your results means","sidebarTitle":"Variation errors","href":"/results/variation-errors"},{"title":"Exports","href":"/results/exports"}]},{"group":"Methodology","pages":[{"title":"Methodology","sidebarTitle":"Overview","description":"How ABTestly computes the numbers you make decisions from. Every formula on these pages is the one that runs in production, quoted from the function that runs it.","href":"/methodology/overview"},{"title":"Underneath the statistics","sidebarTitle":"Underneath the statistics","href":"/methodology/underneath-the-statistics"},{"title":"Minimum detectable effect","sidebarTitle":"Minimum detectable effect","description":"MDE is an input you declare, not a result you receive. The exact sample-size formula we run, a worked example to the visitor, and the sizes our own function returns across common baselines.","href":"/methodology/minimum-detectable-effect"},{"title":"Test duration","sidebarTitle":"Test duration","href":"/methodology/test-duration"},{"title":"The peeking problem","sidebarTitle":"Peeking","href":"/methodology/peeking"},{"title":"Confidence intervals","sidebarTitle":"Confidence intervals","href":"/methodology/confidence-intervals"},{"title":"Sample ratio mismatch","sidebarTitle":"Sample ratio mismatch","href":"/methodology/sample-ratio-mismatch"}]},{"group":"Signals","pages":[{"title":"Signals overview","href":"/signals/overview"},{"title":"Scan a page","href":"/signals/scan-a-page"},{"title":"Connect Google Analytics","href":"/signals/connect-google-analytics"},{"title":"Prioritize A/B test ideas: PXL scores and evidence","sidebarTitle":"Read a scan","href":"/signals/read-a-scan"},{"title":"Signals evidence contract","href":"/signals/evidence-contract"},{"title":"Build a test from an idea","href":"/signals/build-a-test"}]},{"group":"Preview \u0026 QA","pages":[{"title":"Preview links","href":"/preview/preview-modal"},{"title":"Forced variation","href":"/preview/forced-variation"},{"title":"QA session links and the QA overlay","sidebarTitle":"QA session links","href":"/preview/qa-overlay"},{"title":"Dev debugger","href":"/preview/dev-debugger"}]},{"group":"Site settings","pages":[{"title":"General settings","href":"/settings/general"},{"title":"Snippet panel","href":"/settings/snippet-panel"},{"title":"Analytics adapters","href":"/settings/analytics-adapters"},{"title":"SPA support panel","href":"/settings/spa-panel"},{"title":"Global JS","href":"/settings/global-js"},{"title":"Blocked IPs","href":"/settings/blocked-ips"},{"title":"Danger zone","href":"/settings/danger-zone"}]},{"group":"Team \u0026 access","pages":[{"title":"Members and roles","href":"/team/members-and-roles"},{"title":"Permissions catalog","href":"/team/permissions-catalog"},{"title":"Activity log","href":"/team/activity-log"}]},{"group":"Assets","pages":[{"title":"Upload an asset","href":"/assets/upload"},{"title":"How assets are served","href":"/assets/serving"},{"title":"Recycle bin","href":"/assets/recycle-bin"}]},{"group":"Integrations","pages":[{"title":"GA4 dataLayer integration","href":"/integrations/ga4-datalayer"},{"title":"GA4 export","href":"/ga4-export"},{"title":"GA4 BigQuery analysis","href":"/ga4-bigquery"},{"title":"Product analytics","href":"/product-analytics"},{"title":"Google Tag Manager","href":"/integrations/gtm"}]},{"group":"Billing","pages":[{"title":"ABTestly plans: limits, upgrades, downgrades and cancellation","sidebarTitle":"Plans \u0026 pricing","href":"/plans"},{"title":"The 14 day free trial","href":"/billing/trial"},{"title":"What is a Monthly Tracked User (MTU)","href":"/billing/mtu"},{"title":"Refunds and cancellation","href":"/billing/refunds"}]},{"group":"Trust \u0026 compliance","pages":[{"title":"Trust and compliance","href":"/trust-and-compliance"}]},{"group":"Developer reference","pages":[{"title":"window.abtestly API","href":"/developer/window-abtestly-api"},{"title":"REST API","href":"/developer/rest-api"},{"title":"Beacon protocol","href":"/developer/beacon-protocol"},{"title":"Bucketing model","href":"/developer/bucketing"},{"title":"Runtime bindings","href":"/developer/runtime-bindings"},{"title":"SPA lifecycle","href":"/developer/spa-lifecycle"},{"title":"Errors and telemetry","href":"/developer/errors-and-telemetry"},{"title":"Rate limits","href":"/developer/rate-limits"}]},{"group":"Troubleshooting","pages":[{"title":"ABTestly Script Not Working: Installation Troubleshooting","sidebarTitle":"Snippet not firing","href":"/troubleshooting/snippet-not-firing"},{"title":"Why A/B Test Results Look Wrong: SRM, Revenue and Attribution","sidebarTitle":"Numbers look wrong","href":"/troubleshooting/numbers-look-off"},{"title":"Troubleshoot CMP Consent and Deferred A/B Testing","sidebarTitle":"Consent not granting","href":"/troubleshooting/consent-stuck"},{"title":"Exclude Internal and QA Traffic from A/B Tests","sidebarTitle":"Own visits blocked","href":"/troubleshooting/blocked-ip"},{"title":"A/B Testing Diagnostic Reference: Error Codes and Debug Report","sidebarTitle":"Diagnostic reference","href":"/troubleshooting/diagnostic-reference"}]}]},"title":"Underneath the statistics - ABTestly","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-CaUwvYH3.js","lightbox-handle-r17bVUz3.js"]}