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-side | Server-side | |
|---|---|---|
| Who can ship a test | Marketing, via a visual editor | Engineering, via a release |
| Time to launch | Hours | Days to weeks |
| Flicker | Yes — inherent | None |
| Blocked by ad blockers | Frequently | No |
| Works without JavaScript | No | Yes |
| Can test backend logic — pricing, search ranking, delivery | No | Yes |
| Performance cost | A render-blocking script, or flicker | Negligible |
| Works in native apps and email | No | Yes |
| Consistency across channels | Web only | Everywhere 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