---
title: "How to A/B test a QR code or link with a traffic split"
description: "Add a Traffic split step to send visitors to different pages by percentage. A returning visitor keeps the same variant by default. How it works, how close a split lands at low traffic, how to read results and how to end a test."
canonical: "https://linkbreakers.com/help/article/how-to-ab-test-a-qr-code-or-link-with-a-traffic-split"
last-updated: 2026-11-05
---

# How to A/B test a QR code or link with a traffic split

> Add a Traffic split step to send visitors to different pages by percentage. A returning visitor keeps the same variant by default. How it works, how close a split lands at low traffic, how to read results and how to end a test.

:::try-ai-prompt {"prompt":"Add an A/B test right after the scan: half my visitors go to example.com/short-form and half go to example.com/long-form.","description":"Try building an A/B test with the AI builder."}:::

## Short answer

To A/B test a QR code or link, add a **Traffic split** step to its workflow. Each visitor goes to one of 2 to 20 variants by the percentages you set, and sees no page in between. By default a returning visitor keeps the same variant on every visit, so nobody sees version A on Monday and version B on Friday. It is available on every plan.

The split counts visits and visitors per variant. It does not measure conversions, test significance or pick a winner: you read the numbers and decide.

## Quick summary

- 2 to 20 variants, each with a label and a whole percent. Percentages must add up to exactly 100.
- **Keep returning visitors on the same variant** is on by default. For an A/B test, leave it on.
- It follows the device, not the person: a new device, private browsing or some in-app browsers count as a new visitor.
- Percentages are approximate at low traffic. Expect about 10 points of drift on a 50/50 at 100 visitors.
- Bots and link previews are routed like anyone else, and left out of results.
- To end a test, set one variant to 100 and the others to 0.
- To test on only some visitors, put a condition before the split. A split has no rules of its own.
- Also available through the API, the MCP server, the CLI, the SDKs and the Assistant.

## Step-by-step

1. Go to [Links](https://app.linkbreakers.com/workspace/dashboard/links) and open the QR code or link. Its workflow opens.
2. Click the **+** button on the connector where the test should start, usually right after the scan.
3. In the condition steps, choose **Traffic split**.
4. Name your variants and set their percentages. The total shows live and must reach 100. **Even split** shares it out for you: with 7 variants, the first two get 15% and the others 14%.
5. Click **Create Traffic Split**. The step appears on the canvas with one outlet per variant, showing its label and percentage.
6. Connect each outlet to its next step: a redirect, a form, a page or anything else. Right-click an outlet or use its **+** to create that step directly. An outlet left unconnected sends its visitors to the link's fallback URL.

## How a returning visitor keeps their variant

The variant is computed from the step and the device, not stored: the same two inputs always give the same answer. So a returning device gets the same variant on every visit, with nothing to look up and no effect on how fast the link answers. A second split on the same link assigns independently of the first.

The device is the cookie Linkbreakers sets for your workspace, which means:

- **A new device is a new visitor.** The same person on their phone and laptop can get two variants.
- **Private browsing is a new visitor** each time, because the cookie does not survive.
- **Some in-app browsers count as a new visitor.** An app that opens links in its own browser keeps its own cookies, separate from the phone's browser.
- **Each domain has its own cookie.** A visitor reaching the same link on your short domain and on a custom domain counts as two devices.

Clearing cookies has the same effect. None of this breaks a test: it adds a little noise, in the same proportion to every variant.

### Turning it off

Uncheck **Keep returning visitors on the same variant** and every visit is assigned afresh, so one person can see several variants. One visit still stays on one variant, including through a form. This suits sharing traffic, such as spreading visits across several booking pages. For an A/B test, leave it on: someone who saw both versions tells you nothing about either.

## How close a split lands

A percentage is what the split aims for across many visitors, not what you will see at any given moment. On a 50/50, this is how far the real split lands from 50% in 95 out of 100 tests:

| Visitors | Typical distance from 50% |
| --- | --- |
| 100 | about 10 points (40/60 is normal) |
| 1,000 | about 3 points |
| 10,000 | about 1 point |

**How far a 50/50 split lands from 50%**

- **10 points** at 100 visitors
- **1 point** at 10,000 visitors

| Visitors in the test | Distance from 50%, in 95 out of 100 tests |
|---|---|
| 100 visitors | 10  points |
| 1,000 visitors | 3.1  points |
| 10,000 visitors | 1  points |

2,000 simulated tests at each size, run through Linkbreakers' own assignment code on 5 November 2026. The textbook 95% margin gives 9.8, 3.1 and 1.0.

Small weights need more traffic: a variant at 5% of 1,000 visitors only sees about 50 people.

## Changing the percentages

Changing weights only moves visitors near the boundaries you changed. Going from 90/10 to 80/20 moves about one visitor in ten from the first variant to the second, and nobody the other way. With three or more variants, the visitors who move are those near the boundaries you changed.

Keep your variants in the same order, because the order decides who lands where. Removing the first variant reassigns everyone below it.

## How to read the results

Open the step in the editor. Under **Results**, each variant shows the percentage you set, the actual share, its visitors and its visits.

- **Not enough data yet** appears until every variant with a percentage above 0 has 100 visitors. Below that, differences are mostly chance.
- **Visitors and visits differ** because someone who comes back three times is one visitor and three visits. The actual share is counted in visitors.
- **Bots and link previews are left out.** That includes visits from automated browsers, as [detected by Linkbreakers](https://linkbreakers.com/help/article/how-linkbreakers-detects-ai-agents-and-automated-browsers). The count of what was left out is shown.
- **A warning about the real split** means it is further from your percentages than chance explains. It only appears once each variant should have received at least 100 visitors. The usual reason is that you changed the percentages during the test, which is expected. Otherwise, check that each variant's path works.

With **Keep returning visitors on the same variant** off, the numbers are visits, and one person may appear under more than one variant.

Results show who was sent where, not what they did next. To compare outcomes, give each variant its own destination and compare them in your own analytics, for example with a different UTM tag on each URL.

## How to end a test

Set the winning variant to 100 and the others to 0, then save. Everyone goes to that variant from then on, including returning visitors who had another one. Past results stay visible. Keep the step in place if you may test again, or delete it and reconnect the path.

## How to test only some visitors

A split has no rules of its own: put a condition in front of it. To test only in France, add a [country condition](https://linkbreakers.com/help/article/how-to-use-country-conditions) first and connect its France branch to the split, and its other branch straight to your usual page. Only visitors who reach the split are counted in its results.

## Set it up from an AI agent

With the [MCP server](https://linkbreakers.com/help/article/mcp-server-setup) connected, or in the Assistant, ask:

> Add an A/B test right after the scan of my "Spring menu" link: 50% to the short menu, 50% to the long menu.

The step is `EVENT_ACTION_TRAFFIC_SPLIT`, with a `traffic_split` payload: `variants` (`label`, `weight`, `next_step_id`, and an `id` the server generates when left out) and an optional `sticky`, which defaults to true and should stay on for an A/B test. Each branch is addressed by its variant id. Results come from `analytics_traffic_split_results`.

## Limits and caveats

- **No outcomes.** It counts arrivals per variant. There is no goal tracking, significance test, scheduling or automatic winner.
- **Device, not person.** See above: devices, private browsing, in-app browsers and domains all split one person into several visitors.
- **Whole percents.** The smallest share above 0 is 1%.
- **Approximate at low traffic.** See the table above.
- **Unconnected variants** use the link's fallback URL. A link with no fallback URL cannot send those visitors anywhere and answers with an error, so connect every variant that has a percentage.
- **Visits hidden by your plan** are left out of results, as they are everywhere else.

## Frequently asked questions

### Will a returning visitor see a different version?

Not by default. The same device gets the same variant on every visit, unless you change the percentages and they fall in the part that moved, or you turn the option off.

### Does it slow down the link?

The assignment is a calculation on the server, with no database or cache call. In a benchmark on one machine, the whole routing step took about 8 microseconds. We did not measure it in production.

### Do bots skew my test?

They are sent somewhere like anyone else, because a link preview needs an answer, but they are left out of the results.

### Which plans include it?

Every plan.
