<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Datsnip Docs Blog</title>
        <link>https://docs.datsnip.com/blog</link>
        <description>Datsnip Docs Blog</description>
        <lastBuildDate>Mon, 18 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[A/B Testing Webflow Sites: No-Code Experiments Without Exporting]]></title>
            <link>https://docs.datsnip.com/blog/ab-testing-webflow</link>
            <guid>https://docs.datsnip.com/blog/ab-testing-webflow</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Run A/B tests on your Webflow site without code exports, custom JavaScript, or leaving Webflow's hosting. A complete guide with examples.]]></description>
            <content:encoded><![CDATA[<p>Webflow is the most popular no-code website builder for marketing teams, but Webflow doesn't have A/B testing built in. Testing button colors, hero headlines, or completely different layouts requires a third-party tool.</p>
<p>The good news: GhostSnip works with Webflow without any code exports, API integrations, or changes to your Webflow project structure. One snippet in Project Settings is all you need.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-testing-webflow-sites-is-tricky">Why Testing Webflow Sites Is Tricky<a href="https://docs.datsnip.com/blog/ab-testing-webflow#why-testing-webflow-sites-is-tricky" class="hash-link" aria-label="Direct link to Why Testing Webflow Sites Is Tricky" title="Direct link to Why Testing Webflow Sites Is Tricky" translate="no">​</a></h2>
<p>Most A/B testing tools work by modifying the DOM with JavaScript. On Webflow, this creates two challenges:</p>
<ol>
<li class="">
<p><strong>Class naming</strong>: Webflow generates CSS classes from your custom class names. They're readable (<code>.hero-button</code>, <code>.pricing-card</code>) but you need to know where to look for them.</p>
</li>
<li class="">
<p><strong>CMS-generated content</strong>: Dynamic content from Webflow Collections has dynamically-generated IDs. Use class-based selectors, not IDs.</p>
</li>
</ol>
<p>GhostSnip's visual editor solves both by letting you point-and-click on elements in your live Webflow site — it finds the right class automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1--install-the-snippet">Step 1 — Install the Snippet<a href="https://docs.datsnip.com/blog/ab-testing-webflow#step-1--install-the-snippet" class="hash-link" aria-label="Direct link to Step 1 — Install the Snippet" title="Direct link to Step 1 — Install the Snippet" translate="no">​</a></h2>
<ol>
<li class="">Open your Webflow project → <strong>Project Settings → Custom Code</strong></li>
<li class="">Paste in the <strong>Head code</strong> section:</li>
</ol>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">_gs_af</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector" style="color:#00009f">html</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">hidden</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css property" style="color:#36acaa">pointer-events</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">none</span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">noscript</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector id" style="color:#00009f">#_gs_af</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">visible</span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">noscript</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript function" style="color:#d73a49">setTimeout</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> e</span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">getElementById</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'_gs_af'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript keyword control-flow" style="color:#00009f">if</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">e</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript">e</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">remove</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript number" style="color:#36acaa">3000</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript parameter">w</span><span class="token script language-javascript parameter punctuation" style="color:#393A34">,</span><span class="token script language-javascript parameter">d</span><span class="token script language-javascript parameter punctuation" style="color:#393A34">,</span><span class="token script language-javascript parameter">k</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  w</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">_sf</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property" style="color:#36acaa">siteId</span><span class="token script language-javascript operator" style="color:#393A34">:</span><span class="token script language-javascript"> k</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property" style="color:#36acaa">ingestUrl</span><span class="token script language-javascript operator" style="color:#393A34">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'https://api.datsnip.com'</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> s </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> d</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">createElement</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'script'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"> s</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript number" style="color:#36acaa">1</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  s</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">src</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'https://api.datsnip.com/sdk/tracker.js'</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  d</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">head</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">appendChild</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">s</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript dom variable" style="color:#36acaa">window</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'YOUR_SITE_ID'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<ol start="3">
<li class=""><strong>Save + Publish</strong> your Webflow site</li>
</ol>
<p>Your Site ID is in <strong>GhostSnip Dashboard → Settings → Snippet</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2--create-an-experiment">Step 2 — Create an Experiment<a href="https://docs.datsnip.com/blog/ab-testing-webflow#step-2--create-an-experiment" class="hash-link" aria-label="Direct link to Step 2 — Create an Experiment" title="Direct link to Step 2 — Create an Experiment" translate="no">​</a></h2>
<ol>
<li class="">In the GhostSnip dashboard, go to <strong>Experiments → New experiment</strong></li>
<li class="">Enter a name and your Webflow URL (e.g., <code>https://yoursite.webflow.io/pricing</code>)</li>
<li class="">Click <strong>Open visual editor</strong></li>
</ol>
<p>The visual editor loads your live Webflow site. Click any element to select it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-5-best-tests-to-run-on-webflow-sites">The 5 Best Tests to Run on Webflow Sites<a href="https://docs.datsnip.com/blog/ab-testing-webflow#the-5-best-tests-to-run-on-webflow-sites" class="hash-link" aria-label="Direct link to The 5 Best Tests to Run on Webflow Sites" title="Direct link to The 5 Best Tests to Run on Webflow Sites" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-hero-cta--text-and-color">1. Hero CTA — Text and Color<a href="https://docs.datsnip.com/blog/ab-testing-webflow#1-hero-cta--text-and-color" class="hash-link" aria-label="Direct link to 1. Hero CTA — Text and Color" title="Direct link to 1. Hero CTA — Text and Color" translate="no">​</a></h3>
<p>The single most impactful test on any Webflow marketing site.</p>
<p><strong>How to set it up</strong>:</p>
<ul>
<li class="">Open visual editor → click your CTA button</li>
<li class="">The selector will be something like <code>.hero-button</code> or <code>.w-button.primary-cta</code></li>
<li class="">Test: "Start free trial" vs "Try for free" vs "Get started free"</li>
<li class="">Also test: button background color</li>
</ul>
<p><strong>Expected lift</strong>: 8–20% in click rate</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-headline-messaging">2. Headline Messaging<a href="https://docs.datsnip.com/blog/ab-testing-webflow#2-headline-messaging" class="hash-link" aria-label="Direct link to 2. Headline Messaging" title="Direct link to 2. Headline Messaging" translate="no">​</a></h3>
<p>Test different value proposition framing.</p>
<p><strong>Example variants</strong>:</p>
<ul>
<li class="">Feature-focused: "The A/B testing platform that ships with anti-flicker and Bayesian stats built in"</li>
<li class="">Benefit-focused: "Run better A/B experiments. Ship changes that move the needle."</li>
<li class="">Social proof: "Join 2,400 teams already running smarter A/B tests"</li>
</ul>
<p><strong>Expected lift</strong>: 10–25% in scroll depth / engagement</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-pricing-page--plan-highlighting">3. Pricing Page — Plan Highlighting<a href="https://docs.datsnip.com/blog/ab-testing-webflow#3-pricing-page--plan-highlighting" class="hash-link" aria-label="Direct link to 3. Pricing Page — Plan Highlighting" title="Direct link to 3. Pricing Page — Plan Highlighting" translate="no">​</a></h3>
<p>If you have a Webflow pricing page with multiple plan cards:</p>
<ul>
<li class="">Test which plan is visually highlighted ("Most Popular" badge)</li>
<li class="">Test the CTA text on each plan card</li>
<li class="">Test showing annual vs monthly by default</li>
</ul>
<p><strong>Expected lift</strong>: 10–30% in trial start rate</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-navigation-cta">4. Navigation CTA<a href="https://docs.datsnip.com/blog/ab-testing-webflow#4-navigation-cta" class="hash-link" aria-label="Direct link to 4. Navigation CTA" title="Direct link to 4. Navigation CTA" translate="no">​</a></h3>
<p>Your navbar's CTA is shown on every page — it's the highest-volume A/B test opportunity you have.</p>
<p>Test:</p>
<ul>
<li class="">"Get started" vs "Start free trial" vs "Try for free"</li>
<li class="">Button vs link styling in the nav</li>
<li class="">Adding or removing the nav CTA entirely (if you have a prominent hero CTA)</li>
</ul>
<p><strong>Expected lift</strong>: 5–15% in trial starts from nav clicks</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-entire-page-redesign-redirect-test">5. Entire Page Redesign (Redirect Test)<a href="https://docs.datsnip.com/blog/ab-testing-webflow#5-entire-page-redesign-redirect-test" class="hash-link" aria-label="Direct link to 5. Entire Page Redesign (Redirect Test)" title="Direct link to 5. Entire Page Redesign (Redirect Test)" translate="no">​</a></h3>
<p>For major redesigns — new layout, new Webflow template, new sections:</p>
<ol>
<li class="">Build the new design as a separate Webflow page (e.g., <code>/pricing-v2</code>)</li>
<li class="">Publish it</li>
<li class="">In GhostSnip's visual editor, use the <strong>Redirect</strong> tab</li>
<li class="">Redirect 50% of <code>/pricing</code> visitors to <code>/pricing-v2</code></li>
</ol>
<p>This lets you test completely different Webflow designs without merging or deploying.</p>
<p><a class="" href="https://docs.datsnip.com/docs/experiments/redirect-testing">Split URL testing guide →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tracking-webflow-form-submissions">Tracking Webflow Form Submissions<a href="https://docs.datsnip.com/blog/ab-testing-webflow#tracking-webflow-form-submissions" class="hash-link" aria-label="Direct link to Tracking Webflow Form Submissions" title="Direct link to Tracking Webflow Form Submissions" translate="no">​</a></h2>
<p>Add this to your form's page in <strong>Page Settings → Before <code>&lt;/body&gt;</code> tag</strong>:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> form </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">querySelector</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'.w-form form'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword control-flow" style="color:#00009f">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">form</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">    form</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">addEventListener</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'submit'</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">      </span><span class="token script language-javascript keyword control-flow" style="color:#00009f">if</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript dom variable" style="color:#36acaa">window</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">ghostsnip</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">        </span><span class="token script language-javascript dom variable" style="color:#36acaa">window</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">ghostsnip</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">track</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'form_submitted'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">      </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>Use <code>form_submitted</code> as your experiment goal type (Custom event).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-webflow-css-selectors-reference">Common Webflow CSS Selectors Reference<a href="https://docs.datsnip.com/blog/ab-testing-webflow#common-webflow-css-selectors-reference" class="hash-link" aria-label="Direct link to Common Webflow CSS Selectors Reference" title="Direct link to Common Webflow CSS Selectors Reference" translate="no">​</a></h2>
<table><thead><tr><th>Element</th><th>Webflow Class</th></tr></thead><tbody><tr><td>All Webflow buttons</td><td><code>.w-button</code></td></tr><tr><td>Navigation links</td><td><code>.w-nav-link</code></td></tr><tr><td>Form submit button</td><td><code>.w-button[type="submit"]</code></td></tr><tr><td>Rich text blocks</td><td><code>.w-richtext</code></td></tr><tr><td>Any custom class "hero-cta"</td><td><code>.hero-cta</code></td></tr><tr><td>Webflow CMS collection items</td><td><code>.w-dyn-item</code></td></tr></tbody></table>
<p>When using the visual editor, you don't need to know these — just click the element and GhostSnip finds the selector. These are useful if you're writing manual experiments via the API.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-ghostsnip-work-with-webflow-cms">Does GhostSnip Work With Webflow CMS?<a href="https://docs.datsnip.com/blog/ab-testing-webflow#does-ghostsnip-work-with-webflow-cms" class="hash-link" aria-label="Direct link to Does GhostSnip Work With Webflow CMS?" title="Direct link to Does GhostSnip Work With Webflow CMS?" translate="no">​</a></h2>
<p>Yes. Experiments target URL patterns. Use <code>/blog/*</code> to run an experiment on all Collection page templates. The same visual editor changes apply to every CMS item matching that URL pattern.</p>
<p>Note: If your CMS collection generates different DOM structures for different items (e.g., items with vs without featured images), test selectors that exist on every item.</p>
<p><a href="https://app.ghostsnip.com/" target="_blank" rel="noopener noreferrer" class="">Start your first Webflow experiment →</a></p>]]></content:encoded>
            <category>webflow</category>
            <category>ab-testing</category>
            <category>no-code</category>
        </item>
        <item>
            <title><![CDATA[A/B Testing Your SaaS Pricing Page: The 8 Tests That Actually Matter]]></title>
            <link>https://docs.datsnip.com/blog/ab-testing-saas-pricing</link>
            <guid>https://docs.datsnip.com/blog/ab-testing-saas-pricing</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Most SaaS pricing page tests fail because they test the wrong things. Here's what the data says about pricing page optimization — and how to run statistically valid tests.]]></description>
            <content:encoded><![CDATA[<p>Your SaaS pricing page is doing one of three things: converting visitors to trials or customers, sending them to competitors, or confusing them into bouncing.</p>
<p>A/B testing your pricing page is different from testing product pages or checkout flows. The purchase intent is mixed (some visitors are early-stage browsers, some are ready to buy), the decision is high-stakes, and the social dynamics are complex (pricing anchoring, plan comparison, annual vs monthly framing).</p>
<p>Here are the 8 tests that have the highest lift in SaaS pricing page data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-annual-vs-monthly--which-default">1. Annual vs Monthly — Which Default?<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#1-annual-vs-monthly--which-default" class="hash-link" aria-label="Direct link to 1. Annual vs Monthly — Which Default?" title="Direct link to 1. Annual vs Monthly — Which Default?" translate="no">​</a></h2>
<p><strong>The test</strong>: Show annual pricing as the default vs monthly pricing as the default</p>
<p><strong>What most tools do</strong>: Default to monthly (lower sticker price), offer annual as a discount</p>
<p><strong>The counter-intuitive winner</strong>: Annual default (in most tests) — because:</p>
<ol>
<li class="">It surfaces the annual discount prominently</li>
<li class="">Anchors the perceived value at the full price, making the discount feel larger</li>
<li class="">Annual plans have dramatically lower churn — a self-selecting signal</li>
</ol>
<p><strong>Expected lift</strong>: 15–40% increase in annual plan selection rate when defaulting to annual</p>
<p><strong>Implementation in GhostSnip</strong>: Toggle the <code>checked</code> state on the annual/monthly toggle, update displayed prices with JavaScript.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-number-of-plans-2-vs-3-vs-4">2. Number of Plans: 2 vs 3 vs 4<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#2-number-of-plans-2-vs-3-vs-4" class="hash-link" aria-label="Direct link to 2. Number of Plans: 2 vs 3 vs 4" title="Direct link to 2. Number of Plans: 2 vs 3 vs 4" translate="no">​</a></h2>
<p><strong>The test</strong>: How many plan tiers to display</p>
<p><strong>The data</strong>: 3 plans is the most-studied configuration and has the strongest body of evidence:</p>
<ul>
<li class="">2 plans: Forces a binary choice, removes the "safe" middle option</li>
<li class="">3 plans: Creates a "compromise effect" — the middle option gets disproportionate share</li>
<li class="">4 plans: Introduces choice paralysis; Pro/Business distinction often unclear</li>
</ul>
<p><strong>Recommendation</strong>: If you're on 4 plans, test removing the lowest-value tier. If you're on 2 plans, test adding a middle tier.</p>
<p><strong>Expected lift</strong>: 10–25% in plan conversion rate</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-price-anchoring--highlighted-plan">3. Price Anchoring — Highlighted Plan<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#3-price-anchoring--highlighted-plan" class="hash-link" aria-label="Direct link to 3. Price Anchoring — Highlighted Plan" title="Direct link to 3. Price Anchoring — Highlighted Plan" translate="no">​</a></h2>
<p><strong>The test</strong>: Which plan is visually highlighted (larger card, "Most popular" badge)</p>
<p><strong>Common default</strong>: Highlight the middle plan<br>
<strong>Variant</strong>: Highlight the plan one tier above your most common signup</p>
<p><strong>Why this works</strong>: The highlighted plan serves as an anchor. People use it as the "safe" choice. If you highlight a higher plan, you shift the average plan upward.</p>
<p><strong>Expected lift</strong>: 8–20% increase in average revenue per new signup</p>
<p><strong>Implementation</strong>: Change which plan has the highlighted CSS class and "Most Popular" badge.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-free-trial-vs-free-tier">4. Free Trial vs Free Tier<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#4-free-trial-vs-free-tier" class="hash-link" aria-label="Direct link to 4. Free Trial vs Free Tier" title="Direct link to 4. Free Trial vs Free Tier" translate="no">​</a></h2>
<p><strong>The test</strong>: "Start free trial" (time-limited, full features) vs "Start free" (permanent, limited features)</p>
<p><strong>This depends heavily on your product</strong>:</p>
<ul>
<li class=""><strong>Freemium-first products</strong> (Notion, Figma): Free tier drives long-term acquisition</li>
<li class=""><strong>High-touch sales products</strong>: Time-limited trial creates urgency and a clear conversion point</li>
</ul>
<p><strong>What to test</strong>: If you currently have a free trial, test a "free forever" plan with limited seats/usage. If you have freemium, test a time-limited full-access trial.</p>
<p><strong>Signal to watch</strong>: Not just trial-to-paid conversion, but total revenue per visitor (a lower trial rate can be offset by higher activation quality).</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-cta-button--text-and-color">5. CTA Button — Text and Color<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#5-cta-button--text-and-color" class="hash-link" aria-label="Direct link to 5. CTA Button — Text and Color" title="Direct link to 5. CTA Button — Text and Color" translate="no">​</a></h2>
<p><strong>The test</strong>: Button text, color, and size</p>
<p><strong>High-performing variants</strong>:</p>
<ul>
<li class="">"Get started free" vs "Start my trial" vs "Start 14-day trial"</li>
<li class="">Primary brand color vs high-contrast (e.g., orange on a blue page)</li>
<li class="">Larger button with more padding</li>
</ul>
<p><strong>Expected lift</strong>: 5–15% in CTA click rate</p>
<p><strong>Pattern from data</strong>: Including "free" in the CTA text increases clicks. Including a time period ("14-day") increases perceived commitment but reduces anxiety about the billing moment.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-social-proof-format">6. Social Proof Format<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#6-social-proof-format" class="hash-link" aria-label="Direct link to 6. Social Proof Format" title="Direct link to 6. Social Proof Format" translate="no">​</a></h2>
<p><strong>The test</strong>: Customer logos vs review scores vs testimonial quotes</p>
<p><strong>Control</strong>: Company logos ("Trusted by...")<br>
<strong>Variants</strong>:</p>
<ul>
<li class=""><code>G2: 4.8/5 from 420 reviews</code></li>
<li class="">3 short customer quotes with photos and company name</li>
<li class="">"Join 2,400 teams" with small avatar stack</li>
</ul>
<p><strong>Expected lift</strong>: 10–20% in trial start rate</p>
<p><strong>Pattern</strong>: Review scores from recognized platforms (G2, Capterra) outperform unattributed testimonials. Avatar stacks with "Join X teams" perform well for product-led growth products.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-faq-positioning-and-content">7. FAQ Positioning and Content<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#7-faq-positioning-and-content" class="hash-link" aria-label="Direct link to 7. FAQ Positioning and Content" title="Direct link to 7. FAQ Positioning and Content" translate="no">​</a></h2>
<p><strong>The test</strong>: FAQ section placement and specific objection-handling</p>
<p><strong>Control</strong>: FAQ at the very bottom of the page (most visitors don't reach it)<br>
<strong>Variant</strong>: FAQ accordion below the pricing table (before the footer)</p>
<p><strong>Top objections to address</strong> (based on conversion research):</p>
<ul>
<li class="">"Can I cancel anytime?" — Reduces churn anxiety</li>
<li class="">"What happens when my trial ends?" — Addresses billing surprise fear</li>
<li class="">"Do you offer discounts for startups/nonprofits?" — Captures price-sensitive segments</li>
<li class="">"Is there a setup fee?" — Common fear for SMBs</li>
</ul>
<p><strong>Expected lift</strong>: 8–18% in trial start rate when FAQ addresses the right objections</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-annual-discount--percentage-vs-dollar-amount">8. Annual Discount — Percentage vs Dollar Amount<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#8-annual-discount--percentage-vs-dollar-amount" class="hash-link" aria-label="Direct link to 8. Annual Discount — Percentage vs Dollar Amount" title="Direct link to 8. Annual Discount — Percentage vs Dollar Amount" translate="no">​</a></h2>
<p><strong>The test</strong>: "Save 20%" vs "Save $120/year" vs "2 months free"</p>
<p><strong>The psychology</strong>:</p>
<ul>
<li class="">High-priced plans: Dollar amounts feel more concrete (<code>Save $240/year</code> vs <code>Save 20%</code>)</li>
<li class="">Low-priced plans: Months free feels most tangible (<code>2 months free</code> vs <code>Save $16</code>)</li>
<li class="">Startup/SMB target: Percentage discount can signal generosity</li>
</ul>
<p><strong>Expected lift</strong>: 5–15% in annual plan selection rate</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-pricing-page-experiments-in-ghostsnip">Setting Up Pricing Page Experiments in GhostSnip<a href="https://docs.datsnip.com/blog/ab-testing-saas-pricing#setting-up-pricing-page-experiments-in-ghostsnip" class="hash-link" aria-label="Direct link to Setting Up Pricing Page Experiments in GhostSnip" title="Direct link to Setting Up Pricing Page Experiments in GhostSnip" translate="no">​</a></h2>
<p>The pricing page has the highest revenue impact per visitor of any page on your site. Track it accordingly:</p>
<p><strong>Goal type for pricing tests</strong>: Combination of:</p>
<ol>
<li class="">Page visit goal: <code>/onboarding</code> or <code>/dashboard</code> (trial activation)</li>
<li class="">Custom event goal: <code>subscription_started</code> with revenue amount</li>
</ol>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// In your trial activation or payment success flow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">ghostsnip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">track</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'subscription_started'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">revenue</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> selectedPlan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">monthlyPrice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">plan</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> selectedPlan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">billingCycle</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'monthly'</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// or 'annual'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>With revenue tracking, you'll see not just conversion rate but average revenue per visitor — critical for pricing tests where a lift in lower-tier signups can actually hurt revenue per visitor.</p>
<p><a href="https://app.ghostsnip.com/" target="_blank" rel="noopener noreferrer" class="">Get started with GhostSnip →</a></p>]]></content:encoded>
            <category>saas</category>
            <category>pricing</category>
            <category>ab-testing</category>
            <category>conversion</category>
        </item>
        <item>
            <title><![CDATA[10 A/B Tests Every E-Commerce Store Should Run (With Expected Lifts)]]></title>
            <link>https://docs.datsnip.com/blog/ab-testing-ecommerce</link>
            <guid>https://docs.datsnip.com/blog/ab-testing-ecommerce</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The highest-ROI A/B tests for e-commerce stores — product pages, checkout, cart abandonment, and pricing. Includes expected conversion lift ranges from industry data.]]></description>
            <content:encoded><![CDATA[<p>E-commerce conversion optimization has more data behind it than any other category of A/B testing. Millions of experiments have been run on product pages, cart flows, and checkout forms across every industry.</p>
<p>Here are the 10 highest-ROI tests to run first, ordered by expected impact.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-product-page--above-the-fold-cta">1. Product Page — Above-the-Fold CTA<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#1-product-page--above-the-fold-cta" class="hash-link" aria-label="Direct link to 1. Product Page — Above-the-Fold CTA" title="Direct link to 1. Product Page — Above-the-Fold CTA" translate="no">​</a></h2>
<p><strong>What to test</strong>: "Add to Cart" button — size, color, position, text</p>
<p><strong>Control</strong>: Standard "Add to Cart" button, medium size, below product title<br>
<strong>Variants</strong>:</p>
<ul>
<li class="">Larger button (40% more height), higher contrast color</li>
<li class="">Sticky "Add to Cart" that follows the user as they scroll</li>
<li class="">Text variation: "Add to Bag" / "Buy Now" / "Get Yours"</li>
</ul>
<p><strong>Expected lift</strong>: 5–25% in add-to-cart rate</p>
<p><strong>Why it works</strong>: The CTA is the primary conversion action. Size and contrast directly affect click-through. "Add to Bag" outperforms "Add to Cart" on fashion sites in most tests; "Buy Now" outperforms for impulse purchases under $50.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-checkout--number-of-steps">2. Checkout — Number of Steps<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#2-checkout--number-of-steps" class="hash-link" aria-label="Direct link to 2. Checkout — Number of Steps" title="Direct link to 2. Checkout — Number of Steps" translate="no">​</a></h2>
<p><strong>What to test</strong>: Single-page checkout vs multi-step checkout</p>
<p><strong>Control</strong>: 3-step checkout (cart → shipping → payment)<br>
<strong>Variant</strong>: Single-page checkout with all fields visible</p>
<p><strong>Expected lift</strong>: 15–35% in checkout completion</p>
<p><strong>Why it works</strong>: Every additional page in checkout adds friction and dropout. Single-page checkout eliminates the "loading between steps" UX and shows the full scope of what's required — reducing surprise at the final step.</p>
<p><strong>Caveat</strong>: This requires more engineering work than most tests. But the payoff (15–35% lift) makes it the highest-ROI test on this list.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-cart-page--trust-signals">3. Cart Page — Trust Signals<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#3-cart-page--trust-signals" class="hash-link" aria-label="Direct link to 3. Cart Page — Trust Signals" title="Direct link to 3. Cart Page — Trust Signals" translate="no">​</a></h2>
<p><strong>What to test</strong>: Security badges, guarantee text, and social proof near the checkout button</p>
<p><strong>Variants</strong>:</p>
<ul>
<li class="">"🔒 Secure checkout" badge + SSL seal</li>
<li class="">"30-day return guarantee" text</li>
<li class="">"⭐⭐⭐⭐⭐ 4.9/5 from 8,400 customers" near checkout button</li>
</ul>
<p><strong>Expected lift</strong>: 5–15% in cart-to-checkout rate</p>
<p><strong>Why it works</strong>: Cart abandonment often comes from anxiety, not decision fatigue. Trust signals at the last decision point address the most common hesitations.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-product-page--image-gallery">4. Product Page — Image Gallery<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#4-product-page--image-gallery" class="hash-link" aria-label="Direct link to 4. Product Page — Image Gallery" title="Direct link to 4. Product Page — Image Gallery" translate="no">​</a></h2>
<p><strong>What to test</strong>: Number of images, types of images, gallery layout</p>
<p><strong>Variants</strong>:</p>
<ul>
<li class="">Lifestyle images (product in use) vs product-on-white</li>
<li class="">Video demo as first gallery item</li>
<li class="">Zoom functionality on hover</li>
</ul>
<p><strong>Expected lift</strong>: 10–20% in add-to-cart rate</p>
<p><strong>Why it works</strong>: Online shoppers can't touch the product. Images are the primary trust-building mechanism. Lifestyle images (showing the product being used in context) consistently outperform studio shots on fashion and home goods.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-product-page--social-proof">5. Product Page — Social Proof<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#5-product-page--social-proof" class="hash-link" aria-label="Direct link to 5. Product Page — Social Proof" title="Direct link to 5. Product Page — Social Proof" translate="no">​</a></h2>
<p><strong>What to test</strong>: Reviews quantity, rating display, and review content selection</p>
<p><strong>Variants</strong>:</p>
<ul>
<li class="">Show "4,283 reviews" vs just the star rating</li>
<li class="">Pin the most helpful 1-star review at the top (counterintuitive, but increases trust)</li>
<li class="">Show review count near the CTA button</li>
</ul>
<p><strong>Expected lift</strong>: 8–18% in add-to-cart rate</p>
<p><strong>Why it works</strong>: The number of reviews is often more persuasive than the average rating. 500 reviews at 4.6 stars typically outperforms 20 reviews at 5.0 stars.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-cart-page--upsellcross-sell-placement">6. Cart Page — Upsell/Cross-sell Placement<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#6-cart-page--upsellcross-sell-placement" class="hash-link" aria-label="Direct link to 6. Cart Page — Upsell/Cross-sell Placement" title="Direct link to 6. Cart Page — Upsell/Cross-sell Placement" translate="no">​</a></h2>
<p><strong>What to test</strong>: "Frequently bought together" position and format</p>
<p><strong>Variants</strong>:</p>
<ul>
<li class="">Inline in cart vs popup modal</li>
<li class="">Before vs after the cart summary</li>
<li class="">"Complete the look" (apparel) vs "Add accessories" (electronics)</li>
</ul>
<p><strong>Expected lift</strong>: 5–12% in average order value</p>
<p><strong>Why it works</strong>: Cart page visitors have demonstrated intent to buy. Cross-sell to them at peak buying intent, not on the product page where purchase is uncertain.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-shipping-threshold--display-and-messaging">7. Shipping Threshold — Display and Messaging<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#7-shipping-threshold--display-and-messaging" class="hash-link" aria-label="Direct link to 7. Shipping Threshold — Display and Messaging" title="Direct link to 7. Shipping Threshold — Display and Messaging" translate="no">​</a></h2>
<p><strong>What to test</strong>: How prominently you show the free shipping threshold</p>
<p><strong>Control</strong>: "Free shipping on orders over $75" in footer<br>
<strong>Variants</strong>:</p>
<ul>
<li class="">Progress bar in cart: "Add $12 more for free shipping" with visual fill</li>
<li class="">Persistent banner on product pages</li>
<li class="">Threshold amount change ($50 vs $75 vs $100)</li>
</ul>
<p><strong>Expected lift</strong>: 8–20% in average order value</p>
<p><strong>Why it works</strong>: Free shipping threshold messaging is the single most underoptimized conversion lever in e-commerce. Most stores mention it once in the footer. A prominent progress bar creates a goal-completion motivation that dramatically increases basket size.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-email-capture--incentive-type">8. Email Capture — Incentive Type<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#8-email-capture--incentive-type" class="hash-link" aria-label="Direct link to 8. Email Capture — Incentive Type" title="Direct link to 8. Email Capture — Incentive Type" translate="no">​</a></h2>
<p><strong>What to test</strong>: What you offer in exchange for email signup</p>
<p><strong>Variants</strong>:</p>
<ul>
<li class="">10% off first order</li>
<li class="">Free shipping on first order</li>
<li class="">Access to a sale (exclusive early access)</li>
<li class="">No incentive, just "Stay updated"</li>
</ul>
<p><strong>Expected lift</strong>: 20–40% in email capture rate</p>
<p><strong>Why it works</strong>: "10% off" is the default choice for 90% of stores. Because of this saturation, "free shipping" often outperforms it — it feels more tangible. "Early sale access" outperforms all on fashion/luxury.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-search--product--filter-experience">9. Search → Product — Filter Experience<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#9-search--product--filter-experience" class="hash-link" aria-label="Direct link to 9. Search → Product — Filter Experience" title="Direct link to 9. Search → Product — Filter Experience" translate="no">​</a></h2>
<p><strong>What to test</strong>: Search results page filtering UI</p>
<p><strong>Variants</strong>:</p>
<ul>
<li class="">Faceted filters in sidebar vs chips at top</li>
<li class="">"Most Popular" vs "Best Match" default sort</li>
<li class="">Price range slider vs checkbox ranges</li>
</ul>
<p><strong>Expected lift</strong>: 10–25% in search-to-purchase rate</p>
<p><strong>Why it works</strong>: Poor filter UX is the top reason search users don't find what they're looking for. If 30% of your traffic enters through site search, filter UX improvements have an outsized impact.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-post-purchase--re-engagement">10. Post-Purchase — Re-engagement<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#10-post-purchase--re-engagement" class="hash-link" aria-label="Direct link to 10. Post-Purchase — Re-engagement" title="Direct link to 10. Post-Purchase — Re-engagement" translate="no">​</a></h2>
<p><strong>What to test</strong>: What you show on the order confirmation page</p>
<p><strong>Control</strong>: Basic order summary<br>
<strong>Variants</strong>:</p>
<ul>
<li class="">Product recommendation widget (complementary items)</li>
<li class="">Referral offer ("Give a friend 15% off, get 15% off your next order")</li>
<li class="">Account creation CTA with benefit framing ("Save your details for faster checkout next time")</li>
</ul>
<p><strong>Expected lift</strong>: 5–15% increase in second purchase rate (measured 30 days later)</p>
<p><strong>Why it works</strong>: Immediately post-purchase is peak brand affinity. Customers are happy and engaged. Most stores show a receipt — a missed opportunity to drive the next action.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-revenue-tracking-for-e-commerce-tests">Setting Up Revenue Tracking for E-Commerce Tests<a href="https://docs.datsnip.com/blog/ab-testing-ecommerce#setting-up-revenue-tracking-for-e-commerce-tests" class="hash-link" aria-label="Direct link to Setting Up Revenue Tracking for E-Commerce Tests" title="Direct link to Setting Up Revenue Tracking for E-Commerce Tests" translate="no">​</a></h2>
<p>To measure impact on actual revenue (not just CVR), add revenue tracking to your checkout:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// On order confirmation page</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">ghostsnip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">track</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'purchase'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">revenue</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">89.99</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">currency</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'USD'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">orderId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ord_123'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>GhostSnip will automatically show <strong>revenue per visitor</strong> for each variant in your results — so you can see if a CVR lift comes with a basket size trade-off.</p>
<p><a class="" href="https://docs.datsnip.com/docs/experiments/revenue-tracking">Revenue tracking setup guide →</a></p>]]></content:encoded>
            <category>ecommerce</category>
            <category>ab-testing</category>
            <category>conversion-optimization</category>
        </item>
        <item>
            <title><![CDATA[Split URL Testing: When to Use Redirect Tests Instead of DOM Changes]]></title>
            <link>https://docs.datsnip.com/blog/split-url-testing</link>
            <guid>https://docs.datsnip.com/blog/split-url-testing</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[When DOM patches aren't enough, split URL testing lets you test completely different page designs. Here's how it works, when to use it, and how to avoid the common pitfalls.]]></description>
            <content:encoded><![CDATA[<p>Most A/B tests change a headline or button color. But sometimes you need to test something more fundamental — a completely different page layout, a redesigned pricing structure, or a checkout flow rebuilt from scratch.</p>
<p>For those cases, DOM patches won't cut it. You need <strong>split URL testing</strong> (also called redirect testing).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-split-url-testing">What Is Split URL Testing?<a href="https://docs.datsnip.com/blog/split-url-testing#what-is-split-url-testing" class="hash-link" aria-label="Direct link to What Is Split URL Testing?" title="Direct link to What Is Split URL Testing?" translate="no">​</a></h2>
<p>Split URL testing routes different visitors to completely different URLs. Instead of modifying the current page with JavaScript, you:</p>
<ul>
<li class=""><strong>Control group</strong>: Sees <code>/pricing</code> (current page)</li>
<li class=""><strong>Variant group</strong>: Gets redirected to <code>/pricing-v2</code> (new design)</li>
</ul>
<p>Both pages are fully separate — different layouts, different copy, different frameworks if needed. The A/B testing tool handles the routing and tracks which variant each visitor saw.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dom-changes-vs-split-url-testing">DOM Changes vs Split URL Testing<a href="https://docs.datsnip.com/blog/split-url-testing#dom-changes-vs-split-url-testing" class="hash-link" aria-label="Direct link to DOM Changes vs Split URL Testing" title="Direct link to DOM Changes vs Split URL Testing" translate="no">​</a></h2>
<table><thead><tr><th></th><th>DOM Changes</th><th>Split URL Testing</th></tr></thead><tbody><tr><td><strong>How variant is applied</strong></td><td>JavaScript modifies elements</td><td>Redirect to different URL</td></tr><tr><td><strong>Complexity of change</strong></td><td>Words, colors, layout tweaks</td><td>Complete redesigns</td></tr><tr><td><strong>Dev work</strong></td><td>None</td><td>New page must be built and live</td></tr><tr><td><strong>Analytics complexity</strong></td><td>Simple</td><td>Both URLs generate traffic</td></tr><tr><td><strong>Flicker risk</strong></td><td>Moderate</td><td>Low (redirect happens fast)</td></tr><tr><td><strong>SPA support</strong></td><td>Requires MutationObserver</td><td>Works naturally</td></tr></tbody></table>
<p>Use DOM changes for: headlines, CTAs, button colors, element visibility, copy variations.</p>
<p>Use split URLs for: completely different page layouts, testing a Webflow build vs your coded page, checkout flow redesigns, pricing model changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-infinite-loop-problem-and-how-to-solve-it">The Infinite Loop Problem (and How to Solve It)<a href="https://docs.datsnip.com/blog/split-url-testing#the-infinite-loop-problem-and-how-to-solve-it" class="hash-link" aria-label="Direct link to The Infinite Loop Problem (and How to Solve It)" title="Direct link to The Infinite Loop Problem (and How to Solve It)" translate="no">​</a></h2>
<p>The most common technical mistake with split URL testing is creating an infinite redirect loop.</p>
<p>Here's what happens:</p>
<ol>
<li class="">Visitor lands on <code>/pricing</code> → assigned to Variant A → redirected to <code>/pricing-v2</code></li>
<li class=""><code>/pricing-v2</code> loads → SDK runs → experiment evaluates <code>/pricing-v2</code> URL</li>
<li class="">If <code>/pricing-v2</code> matches the experiment URL and Variant A still fires → redirected to <code>/pricing-v2</code> again</li>
<li class="">Infinite loop</li>
</ol>
<p>The fix: <strong>Session storage guard</strong></p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> guardKey </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">_redir_</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">experimentId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">_</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">variantId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token dom variable" style="color:#36acaa">sessionStorage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">guardKey</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Already redirected — we're on the destination page</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">sessionStorage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setItem</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">guardKey</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">location</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">redirectUrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Use replace(), not assign()</span><br></div></code></pre></div></div>
<p>The guard key includes both <code>experimentId</code> and <code>variantId</code> so multiple simultaneous redirect experiments don't interfere with each other.</p>
<p>Using <code>location.replace()</code> instead of <code>location.assign()</code> prevents a new browser history entry, so the back button works normally.</p>
<p>GhostSnip implements this guard automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-seo-correctly">Setting Up SEO Correctly<a href="https://docs.datsnip.com/blog/split-url-testing#setting-up-seo-correctly" class="hash-link" aria-label="Direct link to Setting Up SEO Correctly" title="Direct link to Setting Up SEO Correctly" translate="no">​</a></h2>
<p>When both URLs are publicly accessible, search engines will index both. To avoid duplicate content issues:</p>
<p><strong>Option 1: Noindex on the variant URL</strong> (simplest)</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- On /pricing-v2 while testing --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">robots</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">noindex, nofollow</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>Remove this meta tag if/when you make the variant the permanent page.</p>
<p><strong>Option 2: Canonical tag</strong></p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- On /pricing-v2 --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">link</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">rel</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">canonical</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">https://yoursite.com/pricing</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>This tells search engines the original URL is the canonical version.</p>
<p><strong>Option 3: Password-protect the variant URL</strong></p>
<p>If your platform supports it, require authentication to access the variant URL during testing. This keeps it out of search indexes entirely.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="analytics-considerations">Analytics Considerations<a href="https://docs.datsnip.com/blog/split-url-testing#analytics-considerations" class="hash-link" aria-label="Direct link to Analytics Considerations" title="Direct link to Analytics Considerations" translate="no">​</a></h2>
<p>With split URL testing, both pages appear as separate URLs in your analytics:</p>
<ul>
<li class=""><code>/pricing</code>: Control group traffic</li>
<li class=""><code>/pricing-v2</code>: Variant group traffic</li>
</ul>
<p>Metrics per page will look odd (each page only gets ~50% of what you'd expect). This is correct — don't try to fix it.</p>
<p>For goal tracking: GhostSnip uses <code>sessionStorage</code> to track which experiment variant the visitor was assigned to, so conversion events on <code>/pricing-v2</code> are correctly attributed to your variant regardless of which URL they occur on.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-by-step-running-a-split-url-test-in-ghostsnip">Step-by-Step: Running a Split URL Test in GhostSnip<a href="https://docs.datsnip.com/blog/split-url-testing#step-by-step-running-a-split-url-test-in-ghostsnip" class="hash-link" aria-label="Direct link to Step-by-Step: Running a Split URL Test in GhostSnip" title="Direct link to Step-by-Step: Running a Split URL Test in GhostSnip" translate="no">​</a></h2>
<ol>
<li class=""><strong>Build your variant page</strong> and publish it at the target URL</li>
<li class=""><strong>Create an experiment</strong> in GhostSnip targeting your original URL (e.g., <code>/pricing</code>)</li>
<li class="">In the visual editor, open the <strong>Redirect</strong> tab</li>
<li class="">Enter the variant URL (e.g., <code>/pricing-v2</code>)</li>
<li class=""><strong>Set your goal</strong> — typically a page visit to your thank-you/confirmation page, or a custom <code>purchase</code> event</li>
<li class="">Add SEO protection to the variant URL (noindex or canonical)</li>
<li class=""><strong>Launch the experiment</strong></li>
</ol>
<p>Within hours, you'll have live traffic split between both pages.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-the-test-concludes">When the Test Concludes<a href="https://docs.datsnip.com/blog/split-url-testing#when-the-test-concludes" class="hash-link" aria-label="Direct link to When the Test Concludes" title="Direct link to When the Test Concludes" translate="no">​</a></h2>
<p>Once you have a winner:</p>
<ol>
<li class=""><strong>If control wins</strong>: Archive the experiment, redirect the variant URL back to the original (or 301 it), remove noindex tags from the variant</li>
<li class=""><strong>If variant wins</strong>: Make the variant your permanent page (update your CMS/code), 301-redirect the old URL to the new one, run the variant URL without the noindex</li>
</ol>
<p>Don't just leave both pages live with no redirects — that's how you end up with duplicate content penalties.</p>
<p><a class="" href="https://docs.datsnip.com/docs/experiments/redirect-testing">Full redirect testing documentation →</a></p>]]></content:encoded>
            <category>redirect-testing</category>
            <category>split-url</category>
            <category>ab-testing</category>
        </item>
        <item>
            <title><![CDATA[How to Fix A/B Test Flicker (The Complete Anti-Flicker Guide)]]></title>
            <link>https://docs.datsnip.com/blog/anti-flicker-guide</link>
            <guid>https://docs.datsnip.com/blog/anti-flicker-guide</guid>
            <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Eliminate the flash of original content before your A/B test variant loads. This guide covers why flicker happens, why display:none is wrong, and the correct fix.]]></description>
            <content:encoded><![CDATA[<p>If you've ever run an A/B test and noticed visitors briefly see the original page before your variant loads, you've experienced <strong>FOOC</strong> — Flash of Original Content.</p>
<p>It's the most common technical problem in client-side A/B testing, and most tools either ignore it or implement a solution that creates a different problem (CLS, layout shift).</p>
<p>This is the complete guide to fixing it correctly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-flicker-happens">Why Flicker Happens<a href="https://docs.datsnip.com/blog/anti-flicker-guide#why-flicker-happens" class="hash-link" aria-label="Direct link to Why Flicker Happens" title="Direct link to Why Flicker Happens" translate="no">​</a></h2>
<p>Client-side A/B testing works like this:</p>
<ol>
<li class="">Browser parses HTML and starts rendering</li>
<li class="">DOM becomes available</li>
<li class="">JavaScript SDK loads (async, so this happens after initial render)</li>
<li class="">SDK makes an API call to fetch experiment config</li>
<li class="">API response arrives</li>
<li class="">SDK applies variant changes to the DOM</li>
</ol>
<p>Steps 1–3 take 0–100ms. Steps 4–6 take 100–500ms. During that window, the visitor sees the original (control) content. When the variant loads, the page visibly changes — a flash.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-wrong-fix-body--display-none-">The Wrong Fix: <code>body { display: none }</code><a href="https://docs.datsnip.com/blog/anti-flicker-guide#the-wrong-fix-body--display-none-" class="hash-link" aria-label="Direct link to the-wrong-fix-body--display-none-" title="Direct link to the-wrong-fix-body--display-none-" translate="no">​</a></h2>
<p>Most A/B testing tools (including VWO's older implementation and some versions of Google Optimize) solved flicker with:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector" style="color:#00009f">body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"> </span><span class="token style language-css property" style="color:#36acaa">display</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> none </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>This hides the body until the SDK removes the style. Problem solved, right? No — three problems:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="problem-1-cumulative-layout-shift">Problem 1: Cumulative Layout Shift<a href="https://docs.datsnip.com/blog/anti-flicker-guide#problem-1-cumulative-layout-shift" class="hash-link" aria-label="Direct link to Problem 1: Cumulative Layout Shift" title="Direct link to Problem 1: Cumulative Layout Shift" translate="no">​</a></h3>
<p>When <code>display: none</code> is removed, the browser recalculates layout from scratch. Depending on your page, this can cause elements to jump around — exactly the behavior that Google's CLS (Cumulative Layout Shift) Core Web Vitals metric penalizes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="problem-2-scroll-position-reset">Problem 2: Scroll position reset<a href="https://docs.datsnip.com/blog/anti-flicker-guide#problem-2-scroll-position-reset" class="hash-link" aria-label="Direct link to Problem 2: Scroll position reset" title="Direct link to Problem 2: Scroll position reset" translate="no">​</a></h3>
<p>On some browsers, switching from <code>display: none</code> to <code>display: block</code> resets scroll position to the top of the page.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="problem-3-fouc-in-some-scenarios">Problem 3: FOUC in some scenarios<a href="https://docs.datsnip.com/blog/anti-flicker-guide#problem-3-fouc-in-some-scenarios" class="hash-link" aria-label="Direct link to Problem 3: FOUC in some scenarios" title="Direct link to Problem 3: FOUC in some scenarios" translate="no">​</a></h3>
<p><code>display: none</code> can cause its own flash — from hidden state to fully rendered — that looks worse than the original flicker.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-correct-fix-visibility-hidden">The Correct Fix: <code>visibility: hidden</code><a href="https://docs.datsnip.com/blog/anti-flicker-guide#the-correct-fix-visibility-hidden" class="hash-link" aria-label="Direct link to the-correct-fix-visibility-hidden" title="Direct link to the-correct-fix-visibility-hidden" translate="no">​</a></h2>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">_gs_af</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector" style="color:#00009f">html</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"> </span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> hidden</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css property" style="color:#36acaa">pointer-events</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> none </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p><code>visibility: hidden</code> preserves the layout. Elements still occupy their space in the document flow — they're just invisible. When the style is removed, there's no layout recalculation and no CLS.</p>
<p>The <code>pointer-events: none</code> prevents any accidental clicks during the hidden period.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-full-anti-flicker-snippet">The Full Anti-Flicker Snippet<a href="https://docs.datsnip.com/blog/anti-flicker-guide#the-full-anti-flicker-snippet" class="hash-link" aria-label="Direct link to The Full Anti-Flicker Snippet" title="Direct link to The Full Anti-Flicker Snippet" translate="no">​</a></h2>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Line 1: Hide the page immediately --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">_gs_af</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector" style="color:#00009f">html</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">hidden</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css property" style="color:#36acaa">pointer-events</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">none</span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Line 2: Safety for no-JavaScript browsers --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">noscript</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector id" style="color:#00009f">#_gs_af</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">visible</span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">noscript</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Line 3: Safety timeout — show page in 3s even if SDK fails --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript function" style="color:#d73a49">setTimeout</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> e</span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">getElementById</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'_gs_af'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript keyword control-flow" style="color:#00009f">if</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">e</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript">e</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">remove</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript number" style="color:#36acaa">3000</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>Then your SDK script:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript parameter">w</span><span class="token script language-javascript parameter punctuation" style="color:#393A34">,</span><span class="token script language-javascript parameter">d</span><span class="token script language-javascript parameter punctuation" style="color:#393A34">,</span><span class="token script language-javascript parameter">k</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  w</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">_sf</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property" style="color:#36acaa">siteId</span><span class="token script language-javascript operator" style="color:#393A34">:</span><span class="token script language-javascript"> k</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property" style="color:#36acaa">ingestUrl</span><span class="token script language-javascript operator" style="color:#393A34">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'https://api.datsnip.com'</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> s </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> d</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">createElement</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'script'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"> s</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript number" style="color:#36acaa">1</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  s</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">src</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'https://api.datsnip.com/sdk/tracker.js'</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  d</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">head</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">appendChild</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">s</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript dom variable" style="color:#36acaa">window</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'YOUR_SITE_ID'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>The SDK itself removes the <code>_gs_af</code> style element after applying all variant changes — so the page becomes visible exactly when the correct variant is in place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-three-safety-mechanisms">The Three Safety Mechanisms<a href="https://docs.datsnip.com/blog/anti-flicker-guide#the-three-safety-mechanisms" class="hash-link" aria-label="Direct link to The Three Safety Mechanisms" title="Direct link to The Three Safety Mechanisms" translate="no">​</a></h2>
<p>The snippet has three layers of protection:</p>
<table><thead><tr><th>Mechanism</th><th>Protects against</th></tr></thead><tbody><tr><td><code>visibility:hidden</code> on <code>&lt;html&gt;</code></td><td>Flicker from variant applying</td></tr><tr><td><code>&lt;noscript&gt;</code> override</td><td>Page hidden forever if JS is disabled</td></tr><tr><td>3-second <code>setTimeout</code></td><td>Page hidden forever if SDK fails to load</td></tr></tbody></table>
<p>The 3-second timeout is a deliberate balance: long enough that 99.9% of SDK loads complete before it fires, short enough that a failed SDK load doesn't permanently break the page.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="placement-in-head">Placement in <code>&lt;head&gt;</code><a href="https://docs.datsnip.com/blog/anti-flicker-guide#placement-in-head" class="hash-link" aria-label="Direct link to placement-in-head" title="Direct link to placement-in-head" translate="no">​</a></h2>
<p>The snippet must be the <strong>first thing in <code>&lt;head&gt;</code></strong> — before any other scripts, stylesheets, or tags that could trigger rendering:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token doctype punctuation" style="color:#393A34;font-style:italic">&lt;!</span><span class="token doctype doctype-tag" style="color:#999988;font-style:italic">DOCTYPE</span><span class="token doctype" style="color:#999988;font-style:italic"> </span><span class="token doctype name" style="color:#999988;font-style:italic">html</span><span class="token doctype punctuation" style="color:#393A34;font-style:italic">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">html</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ✅ Anti-flicker FIRST --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">_gs_af</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector" style="color:#00009f">html</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">hidden</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css property" style="color:#36acaa">pointer-events</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">none</span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">noscript</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css selector id" style="color:#00009f">#_gs_af</span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css property" style="color:#36acaa">visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css">visible</span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">noscript</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript function" style="color:#d73a49">setTimeout</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> e</span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">getElementById</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'_gs_af'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript keyword control-flow" style="color:#00009f">if</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">e</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript">e</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">remove</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript number" style="color:#36acaa">3000</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript keyword" style="color:#00009f">function</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript parameter">w</span><span class="token script language-javascript parameter punctuation" style="color:#393A34">,</span><span class="token script language-javascript parameter">d</span><span class="token script language-javascript parameter punctuation" style="color:#393A34">,</span><span class="token script language-javascript parameter">k</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">    w</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">_sf</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">{</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property" style="color:#36acaa">siteId</span><span class="token script language-javascript operator" style="color:#393A34">:</span><span class="token script language-javascript"> k</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript literal-property property" style="color:#36acaa">ingestUrl</span><span class="token script language-javascript operator" style="color:#393A34">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'https://api.datsnip.com'</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">    </span><span class="token script language-javascript keyword" style="color:#00009f">var</span><span class="token script language-javascript"> s </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> d</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">createElement</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript string" style="color:#e3116c">'script'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"> s</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">async</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript number" style="color:#36acaa">1</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">    s</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">src</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator" style="color:#393A34">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'https://api.datsnip.com/sdk/tracker.js'</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">    d</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript property-access">head</span><span class="token script language-javascript punctuation" style="color:#393A34">.</span><span class="token script language-javascript method function property-access" style="color:#d73a49">appendChild</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript">s</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token script language-javascript punctuation" style="color:#393A34">}</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">(</span><span class="token script language-javascript dom variable" style="color:#36acaa">window</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript dom variable" style="color:#36acaa">document</span><span class="token script language-javascript punctuation" style="color:#393A34">,</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#e3116c">'YOUR_SITE_ID'</span><span class="token script language-javascript punctuation" style="color:#393A34">)</span><span class="token script language-javascript punctuation" style="color:#393A34">;</span><span class="token script language-javascript"></span><br></div><div class="token-line" style="color:#393A34"><span class="token script language-javascript">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">script</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Everything else after --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">charset</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">UTF-8</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">title</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">title</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>If you put other scripts first, the browser may start rendering before the anti-flicker style is applied.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-anti-flicker-hurt-performance">Does Anti-Flicker Hurt Performance?<a href="https://docs.datsnip.com/blog/anti-flicker-guide#does-anti-flicker-hurt-performance" class="hash-link" aria-label="Direct link to Does Anti-Flicker Hurt Performance?" title="Direct link to Does Anti-Flicker Hurt Performance?" translate="no">​</a></h2>
<p>The anti-flicker style is ~60 bytes inline — it adds nothing meaningful to page weight.</p>
<p>The actual performance cost is the time the page stays hidden: from the <code>visibility:hidden</code> style being applied to the SDK removing it. Typically 50–150ms on fast connections, up to 500ms on slow 3G.</p>
<p>This is a real trade-off. GhostSnip minimizes it by:</p>
<ol>
<li class="">Serving the SDK from a CDN with global edge nodes</li>
<li class="">Caching experiment configs aggressively (30-second backend TTL)</li>
<li class="">The SDK removing the anti-flicker style as early as possible — before <code>DOMContentLoaded</code>, immediately after variant changes are applied</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-it-affect-seo">Does It Affect SEO?<a href="https://docs.datsnip.com/blog/anti-flicker-guide#does-it-affect-seo" class="hash-link" aria-label="Direct link to Does It Affect SEO?" title="Direct link to Does It Affect SEO?" translate="no">​</a></h2>
<p>No. Googlebot and other crawlers:</p>
<ol>
<li class="">Parse your HTML directly — they see the source, not the rendered state</li>
<li class="">Don't execute JavaScript in the same pass as initial indexing</li>
<li class="">Have separate rendering crawlers that execute JavaScript later</li>
</ol>
<p>The <code>visibility:hidden</code> CSS is applied and removed by JavaScript. Crawlers reading your HTML won't see it at all. Your baseline content is indexed normally.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="anti-flicker-in-ghostsnip">Anti-Flicker in GhostSnip<a href="https://docs.datsnip.com/blog/anti-flicker-guide#anti-flicker-in-ghostsnip" class="hash-link" aria-label="Direct link to Anti-Flicker in GhostSnip" title="Direct link to Anti-Flicker in GhostSnip" translate="no">​</a></h2>
<p>GhostSnip's dashboard generates the complete anti-flicker snippet with your Site ID pre-filled. Go to <strong>Settings → Snippet</strong> and copy the "With Anti-Flicker" version.</p>
<p><a class="" href="https://docs.datsnip.com/docs/experiments/anti-flicker">Full anti-flicker documentation →</a></p>]]></content:encoded>
            <category>anti-flicker</category>
            <category>performance</category>
            <category>ab-testing</category>
        </item>
        <item>
            <title><![CDATA[Bayesian vs Frequentist A/B Testing: Which Should You Use?]]></title>
            <link>https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing</link>
            <guid>https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing</guid>
            <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The practical difference between Bayesian and frequentist A/B testing — what P(win) means vs p-values, the peeking problem, and why most business teams should use Bayesian.]]></description>
            <content:encoded><![CDATA[<p>Every major A/B testing platform is now wrestling with the same question: Bayesian or frequentist?</p>
<p>Optimizely built their original tool on frequentist statistics. Then switched to "Stats Accelerator" (Bayesian). VWO calls their approach "SmartStats" (also Bayesian). Statsig uses frequentist for feature flags, Bayesian for experiments. The research teams at Microsoft and Netflix have published papers on both.</p>
<p>Here's the practical guide to what actually matters for your team.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-core-difference">The Core Difference<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#the-core-difference" class="hash-link" aria-label="Direct link to The Core Difference" title="Direct link to The Core Difference" translate="no">​</a></h2>
<p><strong>Frequentist</strong> (p-values, confidence intervals):</p>
<blockquote>
<p>"Assuming the null hypothesis is true, the probability of seeing data at least this extreme is 3.2%."</p>
</blockquote>
<p><strong>Bayesian</strong> (probability of winning):</p>
<blockquote>
<p>"There is an 87% probability that Variant A is better than Control."</p>
</blockquote>
<p>The Bayesian statement answers the question you actually want to ask. The frequentist statement answers a hypothetical about a world you're trying to disprove.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-p-values-are-misunderstood">Why P-values Are Misunderstood<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#why-p-values-are-misunderstood" class="hash-link" aria-label="Direct link to Why P-values Are Misunderstood" title="Direct link to Why P-values Are Misunderstood" translate="no">​</a></h2>
<p>A study by Hoekstra et al. surveyed 442 psychology researchers who used frequentist statistics daily. They found that 97% of them — including experienced statisticians — misinterpreted the 95% confidence interval.</p>
<p>The common misinterpretation: "There's a 95% probability the true effect is in this range."</p>
<p>The actual meaning: "If we ran this experiment 100 times with fresh samples each time, 95 of those confidence intervals would contain the true effect."</p>
<p>This is a subtle but critical difference. The frequentist CI says nothing about the probability for any given experiment run — it's a property of the procedure over many runs.</p>
<p>For A/B testing, you're running one experiment, not 100. You want to know the probability for <em>this</em> experiment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-peeking-problem">The Peeking Problem<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#the-peeking-problem" class="hash-link" aria-label="Direct link to The Peeking Problem" title="Direct link to The Peeking Problem" translate="no">​</a></h2>
<p>The most common frequentist A/B testing mistake: checking results every day and stopping when p &lt; 0.05.</p>
<p>This is called "peeking" and it dramatically inflates your false positive rate:</p>
<table><thead><tr><th>Checks before stopping</th><th>False positive rate (if checking at p &lt; 0.05)</th></tr></thead><tbody><tr><td>1 (no peeking)</td><td>5%</td></tr><tr><td>2</td><td>8.2%</td></tr><tr><td>5</td><td>14.2%</td></tr><tr><td>10</td><td>19.3%</td></tr><tr><td>100</td><td>40%+</td></tr></tbody></table>
<p>With Bayesian testing, this problem is less severe. P(win) at any point in time is a valid probability statement about current data. Checking in early doesn't mathematically inflate your error rate in the same way.</p>
<p>However, Bayesian P(win) is still noisy with small samples. We still recommend running to your pre-calculated sample size before making decisions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-expected-loss-metric">The Expected Loss Metric<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#the-expected-loss-metric" class="hash-link" aria-label="Direct link to The Expected Loss Metric" title="Direct link to The Expected Loss Metric" translate="no">​</a></h2>
<p>The most useful metric that Bayesian testing gives you that frequentist doesn't: <strong>Expected Loss</strong>.</p>
<p>Expected Loss is the average conversion rate you'd sacrifice if you made the wrong decision.</p>
<p>Example:</p>
<ul>
<li class="">Variant A has P(win) = 0.93</li>
<li class="">Expected Loss = 0.0002 (you'd sacrifice 0.02% CVR if wrong)</li>
</ul>
<p>vs:</p>
<ul>
<li class="">Variant B has P(win) = 0.94</li>
<li class="">Expected Loss = 0.008 (you'd sacrifice 0.8% CVR if wrong)</li>
</ul>
<p>Variant B has higher P(win) but dramatically higher Expected Loss. The smart decision is to ship Variant A.</p>
<p>GhostSnip requires P(win) ≥ 0.95 <strong>and</strong> Expected Loss &lt; 0.001 before marking a result as significant. This combination eliminates variants that technically win but have tiny absolute effects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-ghostsnips-bayesian-engine-works">How GhostSnip's Bayesian Engine Works<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#how-ghostsnips-bayesian-engine-works" class="hash-link" aria-label="Direct link to How GhostSnip's Bayesian Engine Works" title="Direct link to How GhostSnip's Bayesian Engine Works" translate="no">​</a></h2>
<p>GhostSnip uses a <strong>Beta-Binomial conjugate model</strong>:</p>
<ol>
<li class=""><strong>Prior</strong>: Beta(1, 1) — uniform, no prior belief about conversion rates</li>
<li class=""><strong>Posterior update</strong>: After observing n conversions and m non-conversions:
<code>Beta(1 + n, 1 + m)</code></li>
<li class=""><strong>P(win)</strong>: Monte Carlo simulation — draw 10,000 pairs of samples from each posterior, count how often the variant's sample exceeds the control's</li>
</ol>
<p>The Beta-Binomial is the correct model for conversion rate data (binary outcomes: converted or didn't convert). It's the same model used by VWO's SmartStats and Google's internal experimentation platform.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-frequentist-is-still-right">When Frequentist Is Still Right<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#when-frequentist-is-still-right" class="hash-link" aria-label="Direct link to When Frequentist Is Still Right" title="Direct link to When Frequentist Is Still Right" translate="no">​</a></h2>
<p>Bayesian is better for most business teams, but frequentist has its place:</p>
<ol>
<li class=""><strong>Regulatory requirements</strong>: Some industries require p-values for compliance documentation</li>
<li class=""><strong>Multi-armed bandit algorithms</strong>: UCB and Thompson sampling are frequentist algorithms that work well for continuous optimization (exploration vs exploitation)</li>
<li class=""><strong>When you need to exactly replicate another tool's results</strong>: If you're comparing to a published paper or another tool's report, use the same statistical model</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-recommendations">Practical Recommendations<a href="https://docs.datsnip.com/blog/bayesian-vs-frequentist-ab-testing#practical-recommendations" class="hash-link" aria-label="Direct link to Practical Recommendations" title="Direct link to Practical Recommendations" translate="no">​</a></h2>
<p>For most product and growth teams running conversion experiments:</p>
<ul>
<li class="">✅ Use Bayesian P(win) as your primary metric</li>
<li class="">✅ Use Expected Loss as your decision threshold (&lt; 0.001)</li>
<li class="">✅ Pre-calculate sample size and run to completion</li>
<li class="">✅ Report "87% probability Variant A wins" to stakeholders — they'll understand it</li>
<li class="">❌ Don't peek and stop when p &lt; 0.05</li>
<li class="">❌ Don't confuse "statistically significant" with "practically significant"</li>
</ul>
<p>GhostSnip implements all of this by default. <a class="" href="https://docs.datsnip.com/docs/getting-started/understanding-results">See how results are calculated →</a></p>]]></content:encoded>
            <category>statistics</category>
            <category>bayesian</category>
            <category>ab-testing</category>
        </item>
        <item>
            <title><![CDATA[A/B Test Sample Size Calculator: How Many Visitors Do You Need?]]></title>
            <link>https://docs.datsnip.com/blog/ab-test-sample-size-calculator</link>
            <guid>https://docs.datsnip.com/blog/ab-test-sample-size-calculator</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Calculate exactly how many visitors your A/B test needs before the results are reliable. Includes the formula, a worked example, and common mistakes to avoid.]]></description>
            <content:encoded><![CDATA[<p>The most common A/B testing mistake isn't bad traffic or wrong goals — it's stopping the experiment too early.</p>
<p>Without calculating the required sample size before you start, you're likely to call a winner based on random noise and ship a change that has no real effect, or worse, a negative one.</p>
<p>This guide walks through the exact formula, a real worked example, and what to do when your traffic is too low.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-formula">The Formula<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#the-formula" class="hash-link" aria-label="Direct link to The Formula" title="Direct link to The Formula" translate="no">​</a></h2>
<p>A/B test sample size is calculated using the <strong>two-proportion z-test</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">n = (z_α + z_β)² × (p₁(1-p₁) + p₂(1-p₂)) / (p₂ - p₁)²</span><br></div></code></pre></div></div>
<p>Where:</p>
<ul>
<li class=""><strong>n</strong> = required visitors per variant</li>
<li class=""><strong>z_α = 1.96</strong> — critical value for 95% confidence (two-sided)</li>
<li class=""><strong>z_β = 0.84</strong> — critical value for 80% statistical power</li>
<li class=""><strong>p₁</strong> = your current (baseline) conversion rate</li>
<li class=""><strong>p₂</strong> = the conversion rate you want to be able to detect (baseline × MDE)</li>
</ul>
<p>This is the same formula used by Optimizely's sample size calculator, Statsig's sample size planner, and Evan Miller's A/B testing calculator.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-mde">What is MDE?<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#what-is-mde" class="hash-link" aria-label="Direct link to What is MDE?" title="Direct link to What is MDE?" translate="no">​</a></h2>
<p><strong>Minimum Detectable Effect (MDE)</strong> is the smallest relative improvement you'd care about. If your baseline CVR is 2%:</p>
<ul>
<li class="">MDE = 10% → you want to detect ≥ 2.2% CVR (absolute +0.2pp)</li>
<li class="">MDE = 20% → you want to detect ≥ 2.4% CVR (absolute +0.4pp)</li>
<li class="">MDE = 50% → you want to detect ≥ 3.0% CVR (absolute +1.0pp)</li>
</ul>
<p>Smaller MDEs require proportionally more data. This is the most important input to get right.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="worked-example">Worked Example<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#worked-example" class="hash-link" aria-label="Direct link to Worked Example" title="Direct link to Worked Example" translate="no">​</a></h2>
<p>You're testing a new CTA button on your pricing page.</p>
<p><strong>Inputs</strong>:</p>
<ul>
<li class="">Baseline CVR: 3% (0.03)</li>
<li class="">MDE: 20% (want to detect ≥ 3.6% CVR)</li>
<li class="">Confidence: 95%, Power: 80%</li>
</ul>
<p><strong>Calculation</strong>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">p₁ = 0.030</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">p₂ = 0.030 × 1.20 = 0.036</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">z_α + z_β = 1.96 + 0.84 = 2.80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">numerator:   (2.80)² × (0.030 × 0.970 + 0.036 × 0.964)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           = 7.84 × (0.0291 + 0.03470)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           = 7.84 × 0.06380</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           = 0.500</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">denominator: (0.036 - 0.030)² = (0.006)² = 0.000036</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">n = 0.500 / 0.000036 = 13,889 visitors per variant</span><br></div></code></pre></div></div>
<p><strong>Total visitors needed</strong>: 27,778<br>
<strong>If you get 1,000 visitors/day</strong>: ~28 days</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-effect-of-mde-on-sample-size">The Effect of MDE on Sample Size<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#the-effect-of-mde-on-sample-size" class="hash-link" aria-label="Direct link to The Effect of MDE on Sample Size" title="Direct link to The Effect of MDE on Sample Size" translate="no">​</a></h2>
<table><thead><tr><th>MDE</th><th>Baseline 2% CVR</th><th>Baseline 5% CVR</th></tr></thead><tbody><tr><td>10%</td><td>22,240/variant</td><td>8,500/variant</td></tr><tr><td>15%</td><td>9,920/variant</td><td>3,800/variant</td></tr><tr><td>20%</td><td>5,600/variant</td><td>2,140/variant</td></tr><tr><td>30%</td><td>2,480/variant</td><td>950/variant</td></tr><tr><td>50%</td><td>900/variant</td><td>345/variant</td></tr></tbody></table>
<p>If you're a low-traffic site, you can only reliably detect larger effects. That's not a bug — it's the statistics. Set your MDE to match the minimum effect you'd actually act on, not the minimum you'd like to be able to detect.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-mistakes">Common Mistakes<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#common-mistakes" class="hash-link" aria-label="Direct link to Common Mistakes" title="Direct link to Common Mistakes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stopping-when-pwin-looks-good">Stopping when P(win) looks good<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#stopping-when-pwin-looks-good" class="hash-link" aria-label="Direct link to Stopping when P(win) looks good" title="Direct link to Stopping when P(win) looks good" translate="no">​</a></h3>
<p>Even Bayesian P(win) can hit 95% by chance after 200 visitors with a 3% CVR (that's 6 conversions). Early spikes in P(win) are noise. Run to your pre-calculated sample size, then evaluate.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-same-experiment-for-multiple-goals">Using the same experiment for multiple goals<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#using-the-same-experiment-for-multiple-goals" class="hash-link" aria-label="Direct link to Using the same experiment for multiple goals" title="Direct link to Using the same experiment for multiple goals" translate="no">​</a></h3>
<p>If you calculated sample size for a "click on pricing" goal but you're also watching "signups", you've run multiple comparisons and inflated your false positive rate. Decide on your primary goal before you start.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="forgetting-novelty-effect">Forgetting novelty effect<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#forgetting-novelty-effect" class="hash-link" aria-label="Direct link to Forgetting novelty effect" title="Direct link to Forgetting novelty effect" translate="no">​</a></h3>
<p>The first week of any experiment captures users' reactions to something new. If possible, let the experiment run 2+ weeks to let novelty settle.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="calculating-days-wrong">Calculating days wrong<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#calculating-days-wrong" class="hash-link" aria-label="Direct link to Calculating days wrong" title="Direct link to Calculating days wrong" translate="no">​</a></h3>
<p>Sample size calculators give you visitors <em>per variant</em>. If you're splitting 50/50, you need <code>2 × n</code> total visitors. If you're running 3 variants (Control + A + B), you need <code>3 × n</code> total visitors — and your experiment takes 3× as long.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-do-with-low-traffic">What to Do With Low Traffic<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#what-to-do-with-low-traffic" class="hash-link" aria-label="Direct link to What to Do With Low Traffic" title="Direct link to What to Do With Low Traffic" translate="no">​</a></h2>
<p>If your calculated experiment duration is more than 60–90 days, you have options:</p>
<ol>
<li class=""><strong>Increase MDE</strong> — only test changes you expect to move the needle by 25%+</li>
<li class=""><strong>Target a higher-traffic page</strong> — a homepage test with 5k visitors/day vs a checkout page with 200 visitors/day</li>
<li class=""><strong>Run an 80/20 split</strong> — 80% control, 20% variant — lets you observe effect size with less risk</li>
<li class=""><strong>Use GhostSnip's sample size endpoint</strong> — automatically estimates your daily visitors and tells you estimated days before you launch</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-ghostsnips-built-in-calculator">Use GhostSnip's Built-in Calculator<a href="https://docs.datsnip.com/blog/ab-test-sample-size-calculator#use-ghostsnips-built-in-calculator" class="hash-link" aria-label="Direct link to Use GhostSnip's Built-in Calculator" title="Direct link to Use GhostSnip's Built-in Calculator" translate="no">​</a></h2>
<p>GhostSnip calculates the required sample size automatically when you create an experiment. Enter your baseline CVR and MDE, and it shows:</p>
<ul>
<li class="">Visitors per variant</li>
<li class="">Total visitors needed</li>
<li class="">Your estimated daily visitors (from the last 30 days of traffic)</li>
<li class=""><strong>Estimated days to completion</strong></li>
</ul>
<p>The results page shows a progress bar tracking your current visitors against the required amount.</p>
<p><a class="" href="https://docs.datsnip.com/docs/getting-started/understanding-results">Learn more about understanding results →</a></p>]]></content:encoded>
            <category>statistics</category>
            <category>sample-size</category>
            <category>ab-testing</category>
        </item>
        <item>
            <title><![CDATA[The Best Google Optimize Alternative in 2026 (That Actually Ships)]]></title>
            <link>https://docs.datsnip.com/blog/google-optimize-alternative</link>
            <guid>https://docs.datsnip.com/blog/google-optimize-alternative</guid>
            <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Google Optimize shut down in September 2023. Here's a complete comparison of the best alternatives — and what to look for in a replacement.]]></description>
            <content:encoded><![CDATA[<p>Google Optimize shut down in September 2023. If you're still searching for a solid replacement that doesn't require a $40k/year Optimizely contract or an engineering team to operate, you're in the right place.</p>
<p>This guide compares the real alternatives — including what we built at GhostSnip after experiencing the same gap firsthand.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-google-optimize-got-discontinued">Why Google Optimize Got Discontinued<a href="https://docs.datsnip.com/blog/google-optimize-alternative#why-google-optimize-got-discontinued" class="hash-link" aria-label="Direct link to Why Google Optimize Got Discontinued" title="Direct link to Why Google Optimize Got Discontinued" translate="no">​</a></h2>
<p>Google officially stated that Optimize would be deprecated to focus on integrations with Google Analytics 4. The real story: the product was aging (based on a 2012 architecture), had known flicker problems, and was being underinvested relative to the opportunity.</p>
<p>The gap it left: a reliable, lightweight A/B testing tool for teams that don't need enterprise pricing or enterprise complexity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-look-for-in-a-google-optimize-replacement">What to Look for in a Google Optimize Replacement<a href="https://docs.datsnip.com/blog/google-optimize-alternative#what-to-look-for-in-a-google-optimize-replacement" class="hash-link" aria-label="Direct link to What to Look for in a Google Optimize Replacement" title="Direct link to What to Look for in a Google Optimize Replacement" translate="no">​</a></h2>
<p>Before comparing tools, here's what actually matters:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-anti-flicker-that-works">1. Anti-flicker that works<a href="https://docs.datsnip.com/blog/google-optimize-alternative#1-anti-flicker-that-works" class="hash-link" aria-label="Direct link to 1. Anti-flicker that works" title="Direct link to 1. Anti-flicker that works" translate="no">​</a></h3>
<p>The single most common complaint about Google Optimize was the <strong>flash of original content</strong> — visitors saw the original page for 200–400ms before the variant loaded. A good replacement ships a proper anti-flicker snippet.</p>
<p>Look for: <code>visibility:hidden</code> (not <code>display:none</code>) — this preserves layout and avoids Core Web Vitals penalties.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-bayesian-statistics-not-just-p-values">2. Bayesian statistics, not just p-values<a href="https://docs.datsnip.com/blog/google-optimize-alternative#2-bayesian-statistics-not-just-p-values" class="hash-link" aria-label="Direct link to 2. Bayesian statistics, not just p-values" title="Direct link to 2. Bayesian statistics, not just p-values" translate="no">​</a></h3>
<p>"95% confidence" is consistently misinterpreted by business stakeholders. The correct metric is <strong>P(win)</strong>: the probability that the variant is actually better. Tools that report this directly are easier to act on.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-visual-editor-thats-reliable-on-modern-sites">3. Visual editor that's reliable on modern sites<a href="https://docs.datsnip.com/blog/google-optimize-alternative#3-visual-editor-thats-reliable-on-modern-sites" class="hash-link" aria-label="Direct link to 3. Visual editor that's reliable on modern sites" title="Direct link to 3. Visual editor that's reliable on modern sites" translate="no">​</a></h3>
<p>React, Vue, Next.js, Webflow — most tools' visual editors break on SPAs. Check whether the tool re-applies changes after client-side navigation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-lightweight-sdk">4. Lightweight SDK<a href="https://docs.datsnip.com/blog/google-optimize-alternative#4-lightweight-sdk" class="hash-link" aria-label="Direct link to 4. Lightweight SDK" title="Direct link to 4. Lightweight SDK" translate="no">​</a></h3>
<p>Google Optimize's async snippet was notorious for layout shift. The replacement SDK should be:</p>
<ul>
<li class="">Under 30KB minified</li>
<li class="">Async (non-blocking)</li>
<li class="">No external dependencies</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-revenuee-commerce-tracking">5. Revenue/e-commerce tracking<a href="https://docs.datsnip.com/blog/google-optimize-alternative#5-revenuee-commerce-tracking" class="hash-link" aria-label="Direct link to 5. Revenue/e-commerce tracking" title="Direct link to 5. Revenue/e-commerce tracking" translate="no">​</a></h3>
<p>If you're running any e-commerce or SaaS, you need to track revenue per variant — not just conversion rate. A 2% lift in CVR that reduces average order value by 10% is a net negative.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-main-alternatives">The Main Alternatives<a href="https://docs.datsnip.com/blog/google-optimize-alternative#the-main-alternatives" class="hash-link" aria-label="Direct link to The Main Alternatives" title="Direct link to The Main Alternatives" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vwo-visual-website-optimizer">VWO (Visual Website Optimizer)<a href="https://docs.datsnip.com/blog/google-optimize-alternative#vwo-visual-website-optimizer" class="hash-link" aria-label="Direct link to VWO (Visual Website Optimizer)" title="Direct link to VWO (Visual Website Optimizer)" translate="no">​</a></h3>
<p><strong>Pros</strong>: Mature product, good visual editor, session recordings<br>
<strong>Cons</strong>: Pricing starts at ~$200/month for basic; heavy SDK (~80KB); enterprise contracts for full features<br>
<strong>Best for</strong>: Teams that need recordings + heatmaps + experiments in one tool</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimizely-web-experimentation">Optimizely Web Experimentation<a href="https://docs.datsnip.com/blog/google-optimize-alternative#optimizely-web-experimentation" class="hash-link" aria-label="Direct link to Optimizely Web Experimentation" title="Direct link to Optimizely Web Experimentation" translate="no">​</a></h3>
<p><strong>Pros</strong>: Industry standard, used by most Fortune 500 companies<br>
<strong>Cons</strong>: Pricing is enterprise-only (~$40k+/year); not suitable for SMBs<br>
<strong>Best for</strong>: Large teams with dedicated CRO programs</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ab-tasty">AB Tasty<a href="https://docs.datsnip.com/blog/google-optimize-alternative#ab-tasty" class="hash-link" aria-label="Direct link to AB Tasty" title="Direct link to AB Tasty" translate="no">​</a></h3>
<p><strong>Pros</strong>: Good UX, widget library<br>
<strong>Cons</strong>: No public pricing (quote-based); acquisition by Marigold changed direction<br>
<strong>Best for</strong>: Mid-market teams</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="statsig">Statsig<a href="https://docs.datsnip.com/blog/google-optimize-alternative#statsig" class="hash-link" aria-label="Direct link to Statsig" title="Direct link to Statsig" translate="no">​</a></h3>
<p><strong>Pros</strong>: Excellent statistics engine; good for engineering-led teams<br>
<strong>Cons</strong>: Primarily a feature flag / experimentation platform; visual editor is secondary<br>
<strong>Best for</strong>: Product engineering teams with existing analytics infrastructure</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ghostsnip">GhostSnip<a href="https://docs.datsnip.com/blog/google-optimize-alternative#ghostsnip" class="hash-link" aria-label="Direct link to GhostSnip" title="Direct link to GhostSnip" translate="no">​</a></h3>
<p><strong>Built after</strong>: Experiencing the same gap post-Optimize shutdown</p>
<p><strong>What it does differently</strong>:</p>
<ul>
<li class="">Bayesian P(win) as the primary metric (not p-values)</li>
<li class="">Anti-flicker with <code>visibility:hidden</code> (no CLS penalty)</li>
<li class="">Visual editor that works on SPAs</li>
<li class="">Revenue tracking built-in (<code>window.ghostsnip.track('purchase', { revenue: 49 })</code>)</li>
<li class="">Lightweight: ~25KB minified</li>
</ul>
<p><strong>Best for</strong>: Teams that want professional-grade statistics without enterprise pricing</p>
<p><a href="https://app.ghostsnip.com/" target="_blank" rel="noopener noreferrer" class="">Get started with GhostSnip →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-migration-checklist">The Migration Checklist<a href="https://docs.datsnip.com/blog/google-optimize-alternative#the-migration-checklist" class="hash-link" aria-label="Direct link to The Migration Checklist" title="Direct link to The Migration Checklist" translate="no">​</a></h2>
<p>If you're moving from Google Optimize:</p>
<ol>
<li class="">✅ Remove the Google Optimize snippet from your <code>&lt;head&gt;</code></li>
<li class="">✅ Remove any Optimize <code>data-layers</code> and experiment IDs from your HTML</li>
<li class="">✅ Export any historical experiment data you need (Optimize exports to GA4)</li>
<li class="">✅ Identify which experiments were still running and need to be recreated</li>
<li class="">✅ Install your new tool's snippet</li>
<li class="">✅ Recreate your most important experiments</li>
<li class="">✅ Set up revenue tracking if you're in e-commerce</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bottom-line">Bottom Line<a href="https://docs.datsnip.com/blog/google-optimize-alternative#bottom-line" class="hash-link" aria-label="Direct link to Bottom Line" title="Direct link to Bottom Line" translate="no">​</a></h2>
<p>The right Google Optimize alternative depends on your team size and budget:</p>
<ul>
<li class=""><strong>If you need enterprise features + recordings</strong>: VWO</li>
<li class=""><strong>If you're an engineering team</strong>: Statsig</li>
<li class=""><strong>If you want a lightweight, statistics-first tool</strong>: GhostSnip</li>
</ul>
<p>The most important thing is to start running experiments again. The gap since Optimize shutdown has likely cost most teams 5–10% in conversion improvement they're leaving on the table.</p>]]></content:encoded>
            <category>ab-testing</category>
            <category>optimization</category>
            <category>tools</category>
        </item>
    </channel>
</rss>