Tags: experimentation web-dev concept

Client-Side vs Server-Side Testing

Date: 2026-08-16


Where the variant decision is made, and everything follows from it. Client-side buys speed of iteration and pays in flicker, blocked scripts and a ceiling on what can be tested; server-side inverts both sides of that trade.


What it is

Client-side testing decides the variant in the browser, after the page has begun loading, and modifies the rendered DOM with JavaScript.

Server-side testing decides before the response is generated, so the browser only ever receives the variant’s markup.

CLIENT-SIDE                          SERVER-SIDE

request  →  server                   request  →  server
            ↓ original HTML                     ↓ assign variant
browser renders original                        ↓ render variant HTML
            ↓                        browser renders variant
    test script loads                           ↓
            ↓ assign variant         (browser never sees the original)
    JS rewrites the DOM
            ↓
    user sees variant

The extra steps on the left are the source of every difference below.

The trade

Client-sideServer-side
Who can ship a testMarketing, via a visual editorEngineering, via a release
Time to launchHoursDays to weeks
FlickerYes — inherentNone
Blocked by ad blockersFrequentlyNo
Works without JavaScriptNoYes
Can test backend logic — pricing, search ranking, deliveryNoYes
Performance costA render-blocking script, or flickerNegligible
Works in native apps and emailNoYes
Consistency across channelsWeb onlyEverywhere the backend serves

What client-side actually costs

Three things, and each one biases results rather than merely inconveniencing you.

Flicker. The original renders before the variant applies. Users see the change happen, which is itself a treatment — and the delay is longer on slow connections, so the effect is unevenly distributed across your traffic. See Flicker and Flash of Original Content.

Blocking. Ad blockers and privacy extensions catch a meaningful share of testing scripts. Those users see control regardless of assignment, and they aren’t a random slice — they skew towards technical, desktop, privacy-conscious users. This shows up as Sample Ratio Mismatch when the tracking is blocked too, and as silent contamination when only the variant script is blocked. See Ad Blockers and Tracking Loss.

The anti-flicker snippet. The standard mitigation hides the page until the test script loads, which converts flicker into a delay for everyone — including the control group. That’s a self-inflicted performance regression applied to 100% of traffic to fix a cosmetic problem affecting some of it, and it degrades Largest Contentful Paint measurably.

In plain terms: client-side testing makes the variant arrive late, and the lateness varies by connection speed and browser setup. You end up measuring the change plus a delay whose size correlates with the kind of user.

When each is right

Client-side for presentational changes above the fold on a marketing site, where iteration speed matters more than precision and engineering capacity is the binding constraint. Most CRO programmes start here for good reasons.

Server-side when any of these apply, and it isn’t really a choice:

  • Testing anything the backend decides — pricing, search results, recommendations, delivery options, stock logic
  • Testing in a native app or in email
  • The change is large enough that flicker would be obvious
  • The test needs to be consistent across web, app and email for the same user
  • Performance is itself under measurement

Hybrid is where mature programmes land: server-side assignment with the decision passed to the client for rendering. The variant decision happens once, early, and everything downstream — web, app, email, analytics — reads the same value. It needs engineering investment and it removes most of the client-side tax.

Consequences for measurement

  • Exposure tracking differs. Server-side can log exposure at render, reliably. Client-side logs it from the browser, where it can be blocked or lost on unload — Experiment Assignment Tracking
  • Assignment durability differs. Server-side can key on a user ID from the session; client-side is usually cookie-bound and subject to Browser Privacy Restrictions
  • SRM has different causes. Client-side SRM usually means blocking or timing; server-side usually means a genuine assignment bug
  • Edge rendering complicates both. A variant decided at the CDN needs the cache key to include the variant, or users get each other’s versions — Edge Computing