Split URL Experiments
Split URL experiments are the other half of CRO testing. Instead of changing one page in place, you build a different page at a different URL and split incoming traffic between the two. A vs B picks who sees which page, redirects accordingly, and measures the same metrics it does for any other experiment.
When to use Split URL
Reach for Split URL when the change you want to test is too large to sit inside the visual editor or a custom-code variation. Common scenarios:
- Testing a brand-new landing page against the live one.
- Comparing a redesigned pricing page against the current page.
- Validating a new checkout flow against the existing one.
- Trying long-form against short-form copy as separate pages.
- Migrating from a legacy template to a new template gradually.
For smaller in-place changes, use a Visual / Code experiment instead. Copy, styling, a new hero image or a toggled button need no second page to maintain.
Setting up a Split URL experiment
Pick the experiment type
After clicking Create Experiment, choose Split URL on the first step instead of Visual / Code. The choice is locked once the experiment is created: if you change your mind, you will need to recreate the experiment.
Configure the control URL
The control URL is the page visitors land on when they enter the experiment. Pick a match mode that describes how the URL should be recognised; see the next section for the five available modes.
Add your variations
Each variation is a destination URL. Give the variation a name, paste the full URL of the alternative page, and optionally set a human-readable label that appears in the results table. The destination must be a full absolute URL including the scheme (https://...). Anything else is rejected when you save.
Set traffic weights
The default is an even split across all variations. Adjust the weights to send more or less traffic to a particular variation.
Launch
Audiences, metrics, exclusion groups, scheduling, analysis plans, and the choice of stats engine all work identically to Visual / Code experiments. Configure them on the same builder steps, then publish.
- Set the page visitors land on and how A vs B should recognise it.
- Set where a variant sends its share of traffic.
- Optional: keep tracking parameters on redirect, and give the variation a friendly name for reports.
Control URL match modes
Five match modes are available. Pick whichever is the simplest fit for the page you are testing on:
- Exact: the full URL must match after A vs B normalizes both sides: lowercased host, no URL fragment, no default port, no trailing slash, and query parameters compared regardless of order. Example:
https://example.com/pricingalso matcheshttps://example.com/pricing/(trailing slash) andhttps://Example.com/pricing(host case), but not a different path. - Path: the pathname must match exactly; host, query string, and hash are ignored. Example:
/pricingmatches any host with that path. - Substring: the full URL must contain the given string. Example:
/pricingmatches/pricing,/pricing/teams,/old-pricing, etc. - Pattern: a glob-style wildcard pattern. Use
*for any sequence and?for any single character. Example:https://example.com/landing-*matches every landing-page variant. - Regex: a full regular expression for cases that patterns cannot express (character classes, alternation, anchors). Example:
^https://example\.com/pricing/(monthly|annual)/?$.
The Test a URL box under the control URL gives the same answer the snippet gives on a real page. With Exact, a visitor who arrives with a query string your control URL does not have, such as ?utm_source=ads, is not bucketed, and the box tells you so. Choose Path when ad and campaign parameters should still count.
Regex and Pattern syntax are validated when you save the experiment, so a malformed expression cannot ship to production. If a regex fails to compile the experimenter sees an inline error before the experiment can be launched.
Per-variation options
Each variation has three optional fields beyond name and destination URL:
- Preserve query parameters: when enabled, query parameters on the visitor's original URL (for example UTM tags) are appended to the destination URL on redirect. Destination URL params win on conflict. Defaults to on.
- Display name in reports: a human-readable label shown in the results table instead of the raw destination URL. Hover to see the raw URL when needed. Useful for long URLs with tracking parameters.
Tracking and attribution
For results to capture conversions, the variation URL must have the A vs B snippet installed too. The snippet on the variation page reads the sticky bucket cookie set on the control page and continues to attribute conversions to the same experiment. If a variation is on a different domain than the control, install the snippet on both.
After a redirect, the browser reports your own control page as the referrer. Your analytics tool reads that as a self-referral and quietly credits the variant's traffic to the wrong source. Call avsb.getOriginalReferrer() on the destination page to recover the true source:
avsb.ready(function () { var source = avsb.getOriginalReferrer() // '' means the visit before the redirect was direct; // null means no redirect happened in this tab. if (source !== null) { // hand the true referrer to your own analytics }})It returns '' for a direct visit and null when no split URL redirect has happened in this tab. The handoff is same-origin only: a destination on a different domain cannot read it.
Client-side redirects do not pass SEO link equity. Split URL is designed for A/B testing, not for permanent URL changes. If you need a permanent move, use a server-side redirect alongside the experiment.
Preview & QA
Preview links work for Split URL experiments. Generate a link for a chosen variation from the results page or the builder's review step. The link opens the destination URL directly with a preview token attached. The snippet recognises the token and skips its redirect, so the reviewer can inspect the variation in place. Each preview link is unique to a variation; share separate links per variation if you have more than one to review.
The browser extension supports Split URL experiments too. With dev mode on, the popup shows each variation's destination URL, with an Open variation URL button next to it.
How the snippet runs the redirect
When the snippet loads on a page that matches the control URL of a running Split URL experiment, it:
- Hides the page with the anti-flicker mechanism.
- Evaluates audience, exclusion-group, and traffic-allocation rules.
- Buckets the visitor deterministically: the same visitor always lands on the same variation across sessions, identical to in-place experiments.
- Works out the exact destination it would send the visitor to. A destination that resolves to the page the visitor is already on is not redirected. The visitor stays where they are, and no exposure is recorded for that page view. The skip is reported to the experiment's error log and the browser console. The visitor is still in the test and their assignment sticks, so conversions on that page are still attributed.
- Fires the
exposureevent. - If the visitor is in the control variation, removes the anti-flicker and renders the page normally. No further flush is forced; the exposure event ships on the snippet's normal schedule.
- If they are in a variant variation, flushes the exposure immediately via
navigator.sendBeaconso it survives the page unload, then callswindow.location.replace(destinationUrl). Using.replacerather than.hrefmeans the back button takes the visitor to where they came from. It does not take them back to the control URL, where they would be redirected again. The page stays hidden while the browser navigates, so visitors in the redirect group never see a flash of the original page.
Common pitfalls
- Redirect loops: A vs B refuses to save any variation destination URL that would still match the control URL under the chosen match mode, and tells you which destination and why. That covers the near-misses as well as the obvious ones: with Path matching,
https://site.com/checkout?v=bstill matches a control ofhttps://site.com/checkout, and with Substring matching,https://site.com/pricing-newstill contains a control of/pricing. Experiments saved before this check existed are protected on the visitor's side by the same rule. The snippet refuses a redirect whose destination resolves to the page the visitor is already on, so the tab never loops. - Changing a live redirect: once a Split URL experiment is running, its control URL, match mode, destination URLs and preserve-query-parameters settings are locked. Changing them mid-flight would move visitors between pages halfway through the test. Everything else on the experiment still saves normally, and re-saving a locked field with the value it already has never blocks a save. To test a different destination, pause and duplicate the experiment.
- Unusable destinations: a destination that cannot be parsed as an absolute URL is rejected when you save. If an older experiment already stores one, every attempted redirect is reported to the experiment's error log and the browser console instead of failing silently.
- Slow connections: the page stays hidden until the redirect completes, so visitors do not see a flash of the control page. The snippet itself comes from our global CDN. To shorten how long the page stays hidden, keep render-blocking scripts above the snippet tag to a minimum.
- Cross-domain variations: Split URL works across domains as long as the snippet is installed on every destination domain. Without the snippet, conversions on the variation domain are not attributed back to the experiment. A vs B checks each destination's host against the control host when you save. Today that check does not show anywhere in the builder, so don't wait for a warning to appear. Confirm every destination domain yourself before you launch.
Reference: datafile shape
Split URL experiments add three fields to the published datafile so the snippet can evaluate them client-side:
{ "id": "<experimentId>", "experimentType": "SPLIT_URL", "splitUrl": { "controlUrl": "https://example.com/pricing", "matchMode": "EXACT" }, "variations": [ { "id": "<controlVariationId>", "type": "control", "destinationUrl": null }, { "id": "<variantVariationId>", "type": "variant", "destinationUrl": "https://example.com/pricing-v2", "preserveQueryParams": true, "displayName": "Long-form Pricing" } ]}