- A
<split-test>container in the page marks where the swap happens. - A Component Split Test node in Page Events defines what the variants are and how traffic splits.
Testing whole pages instead of a section? See Page Variants and Funnel Split Testing, and the comparison below.
Step 1 — Put a container on the page
The container is an empty slot identified by anid. It also carries a name, which is the label you will pick from in Page Events.
In the page builder
Drag the Split Test Container block (Funnels category) onto the page, then set its Split Test Container Name trait. The builder writes it as a<split-test> element with the name stored on the component.
On a coded page
Anything inside the tag is the fallback: it renders unchanged whenever no variant is resolved.
Listing container IDs
The builder populates its dropdown from:id in that response is exactly what goes into the node’s container field.
The type segment is
split-test-container, not split-test. <split-test> is the HTML tag; split-test-container is the component type. The same endpoint serves dynamic-container and form.Step 2 — Create the variant components
Each variant is a saved component. In the page builder, right-click an element and choose Create a new component (or build one from scratch), then repeat for each variant. What matters downstream is the component’s code — that is what the node stores.Step 3 — Wire the nodes
Open Manage Page Events for the page. A component split test is always the same three-level shape:1
Add the Component Split Test node
Connect it to the entry node or to a condition. Set:
- Container — the
<split-test>container. Stored ascontainer. The node warns “Container is required” until it is set. - Total Variants —
2to5. Stored asvalue. - Name — used in split-test reporting.
2
Let it create the weights
Changing Total Variants adds an output pin and a Traffic Distribution node for each variant automatically. Reducing the count removes both the pin and the node attached to it.
3
Set the traffic split
Each Traffic Distribution node holds a percentage (
value, 0–100) and a variant name. Editing one weight redistributes the remainder evenly across its siblings, so two variants land on 50/50 by default.4
Attach one Component per weight
Under each Traffic Distribution node attach a Component node and pick the component. Turn on Set as Baseline on the control — that is the variant everything else is compared against.
Wiring constraints
Only one Component per Traffic Distribution node, and only one Traffic Distribution per output pin.
Field-by-field detail: Node Reference → Split testing.
Worked example — split test a headline
The page
Page Events
- Loaded → Component Split Test
- Container:
Headline Test - Total Variants:
2 - Name:
Headline — hero
- Container:
- Output 1 → Traffic Distribution — name
Control,50 - Output 2 → Traffic Distribution — name
Discount angle,50 - Under Control → Component
headline-a, Set as Baseline on - Under Discount angle → Component
headline-b
data-sid— the split test IDdata-fnid— the Page Events node IDdata-cid— the component ID that was served
How a variant is chosen
1
Declared winner wins outright
If a variant has been marked as winner, every visitor gets it and the weights are ignored. Marking a winner writes that Traffic Distribution node’s
node_code onto the parent as winner_node_code.2
Otherwise, a returning visitor keeps their variant
The assignment is stored in a cookie named
st_res_<split_test_id> (7 days, httpOnly) and mirrored into the session. If the stored component no longer exists in the test, the assignment is discarded and re-run.3
Otherwise, exact rotation
New visitors are allocated from a shared counter rather than a per-visitor dice roll, so the live ratio tracks your configured weights closely instead of converging on them slowly. The counter is Redis-backed, so it holds across workers and servers; a weighted random draw is the fallback if that is unavailable.
Changing the weights or adding/removing a variant resets the rotation counter for the test. Existing visitors keep their cookie until it expires.
<split-test> block is left exactly as authored and its inner content renders. That happens if no Component Split Test node targets the container, if the container id does not match, or if the node has no split_test_id yet (which is the case before the first save, and if the plan does not include split tests).
Advanced settings
Advanced Settings on the Component Split Test node opens the statistical configuration for the underlying split test record: test duration, sample-size limits, significance level, statistical power, minimum detectable effect, multiple-testing correction, statistical method, primary metric, secondary metrics to watch (winner_selection_criteria), guardrail metrics, automated winner selection, and custom goals.
Custom goals are { name, value } pairs where value must match an interaction name defined in the page builder.
Once the node has a split_test_id, saving this modal writes straight through to the split test record. Interpreting the results is covered in Split Test Analytics.
Enforce Exact Split
The Enforce Exact Split checkbox storesenforce_exact_split on the node.
The current renderer does not read this flag. Component split tests already allocate traffic exactly, via the shared counter described above — leaving the box unchecked does not make allocation random.
Which kind of test do I want?
Rules of thumb
- Testing one section? Component split test. It is the cheapest to build and the easiest to read.
- Testing a whole page layout? Build the alternative as a page variant and select it with Load Another Page. To split traffic between variants, put a Split Test node in front and hang a Load Another Page under each Traffic Distribution node.
- Need the variants to have their own page events? Turn on Load & Override Page Events on the Load Another Page node. Left off, the variant inherits the primary page’s events.
- Testing different steps of a funnel rather than different renderings of one step? That is Funnel Split Testing.
Inline split tests (coded pages)
Use<inline-split-test> when you want to A/B test content directly in the HTML without creating separate components or configuring Page Events. Variants and their content live inside the tag itself.
This is the simplest way to split test on coded pages. For component-based variants, multi-variant reporting or anything driven by conditions, use the
<split-test> container above.Syntax
Basic example (equal split)
Weighted example
0 and receives no traffic.
Saving pages through the API
When you create or update a coded page through the public Pages API:- Send the full
<inline-split-test>...</inline-split-test>block inside thehtmlfield. - The Pages API stores that source HTML as provided.
- The create/update response does not replace the tag with the winning variant’s runtime HTML.
- The public Pages API also does not inject the auto-managed
idattribute as part ofPOST /api/brands/{brand}/pagesorPUT /api/brands/{brand}/pages/{page}.
id, and returns the updated HTML.
How it works
-
On editor save, the system validates the tag structure (the
<inline-split-test>must have aname, and there must be at least 2<variant>tags each with aname). It creates a split test database record and injects anidattribute into the tag. -
At runtime, the server checks the
st_res_{id}cookie or session for an existing assignment; if there is none it selects a variant using the same deterministic weighted rotation as component split tests, sets a 7-day cookie, and replaces the whole block with just the chosen variant’s HTML. -
Tracking is automatic — the rendered output carries
data-sidanddata-cid, which the built-in tracking script turns intosplit-test-viewevents. -
Conversion attribution works out of the box: the split test ID is pushed into the session’s
sidslist and travels with conversion and click payloads.
Server output
variant_code is an internal identifier (v0, v1, …) that maps back to the variant name in the analytics dashboard.
Rules
- The
<inline-split-test>tag must have anameattribute. Tags without a name are ignored on save. - Minimum 2 variants required, each with a unique
name. With fewer than two the tag is left as-is at runtime. - Do not manually set or edit the
idattribute — it is managed by the system. - Removing the tag from the page does not delete or deactivate the split test record. Use the split test management UI to deactivate it.
- Variant identity is tracked by name. Existing variants keep their internal code (
v0,v1, …) across saves. Renaming a variant creates a new one; the original and its data remain in the record.
Tips
- Test one element at a time so the result is attributable.
- Name the test and every variant — those names are what you read in reporting.
- Mark a baseline. Comparisons are meaningless without a declared control.
- Let the test reach the sample size you configured before declaring a winner.
- When you do declare a winner, the winning variant is served to everyone immediately.