Targeting
Every experiment defines two things about who sees it:- Locations — which URLs the test runs on
- Audiences — which visitors are eligible
Locations
Locations specify URLs. Supported match types:| Type | Example | Matches |
|---|---|---|
| URL | https://example.com/pricing | Exact URL only |
| URL contains | /pricing | Any URL with this substring |
| URL starts with | https://example.com/blog/ | Any blog post |
| URL ends with | .html | Any HTML page |
| URL matches regex | ^/products/[0-9]+$ | Numeric product IDs |
| Hostname | app.example.com | Subdomain match |
| Query string | utm_source=email | Visitor came from a specific UTM |
Audiences
Audiences filter visitors. Supported conditions:| Condition | Examples |
|---|---|
| Device | mobile, tablet, desktop |
| Browser | Chrome, Safari, Firefox, Edge, … |
| Operating system | iOS, Android, macOS, Windows, Linux |
| Country / region | Via Cloudflare geo |
| Language | Browser locale (en, en-US, fr, etc.) |
| New vs returning | Has this user been bucketed before? |
| Referrer | Came from twitter.com, news.ycombinator.com, etc. |
| UTM parameters | utm_source, utm_medium, utm_campaign, utm_term, utm_content |
| Cookies | E.g. logged_in=true |
| Custom attributes | Set via JS: window.abtestly.identify({ plan: 'pro' }) |
| Day of week / hour of day | Time-windowed campaigns |
| JS condition | Arbitrary expression evaluated against the page |
Saved Locations and Audiences
If you run multiple tests targeting the same URLs or the same visitor segment, save the conditions as a reusable Location or Audience in your site detail page (Locations / Audiences tabs). Then reference them from experiments instead of copy-pasting rules. Saved Locations and Audiences are site-scoped — each site has its own set. This matches the natural mental model: visitor segments and URL patterns are inherent to a property, not your whole org.Bucketing
Once a visitor passes targeting, they’re bucketed into a variant. Bucketing is:- Deterministic — same visitor + same experiment = same variant, every time
- Independent across tests — a user’s assignment in test A doesn’t influence test B
- Persistent — assignment is cached in
localStorageand persists indefinitely (until they clear browser data or you change the experiment’s bucketing salt)
Traffic allocation
The experiment-level traffic allocation percentage controls what share of eligible visitors enter the test at all. Common patterns:- 100% — full launch test
- 10% — early ramp; only 1 in 10 eligible visitors gets bucketed, the rest see control without being recorded as exposures
- 50% — half-traffic A/B with statistical significance gates before scaling
Quick reference
| Scenario | Setup |
|---|---|
| Test only on pricing page | Location: URL contains /pricing |
| Test only on mobile | Audience: device = mobile |
| Test only US visitors | Audience: country in [US] |
| Test only logged-in users | Audience: cookie logged_in = true |
| Test on new visitors only | Audience: new_returning = new |
| Test on returning visitors from email | Audience: utm_source = email AND new_returning = returning |
| Ramp test to 10% of traffic | Experiment-level traffic allocation = 10% |
| Test on weekday business hours | Audience: day_of_week in [mon-fri] AND hour_of_day in [9..17] |