Streams
How campaign stream sets route traffic in Axalot: order, filters, pixels, rotation, weights, active states, and safe setup patterns.
What streams do
Streams are the routing layer inside a Axalot campaign. The campaign receives a click through its tracking link, reads the request data, checks stream sets in order, and sends the click to the first stream whose filters match.
A stream set contains three operational blocks:
Filters
Rules that decide whether a click belongs to this stream set.
Pixels
Tracker pixels attached to clicks and events that pass through this stream.
Rotation
One or more active destination flows with weights.
Streams are campaign-local
Stream sets live inside one campaign. They do not change the Traffic Source, domain, offer link, landing, PWA, pixel, or push records themselves; they only reference those records for routing.
Console path
Console / Tracker / Campaigns / Create CampaignConsole / Tracker / Campaigns / Edit CampaignConsole / Tracker / Campaigns / Streams / FiltersConsole / Tracker / Campaigns / Streams / PixelsConsole / Tracker / Campaigns / Streams / Rotation
Evaluation order
Axalot treats stream order as part of the routing logic. More specific streams should be above broader streams.
The click enters the campaign through the saved tracking URL.
Axalot checks the first active stream set.
If the stream has filters, the click must satisfy the filter logic configured in the filter dialog.
If the click matches, Axalot uses that stream's active rotation items.
If the click does not match, Axalot continues to the next active stream set.
Catch-all streams go last
A stream without filters is a catch-all stream. If it is placed above filtered streams, it can accept traffic before the lower streams get a chance to match.
Stream limits
These limits are enforced by the current campaign form and validation schema.
| Object | Current limit |
|---|---|
| Stream sets per campaign | 5 |
| Filters per stream set | 20 |
| Pixels per stream set | 5 |
| Rotation items per stream set | 5 |
| Rotation item weight | 1-100 |
| Campaign must have active streams | At least 1 active stream |
| Stream must have active rotation items | At least 1 active rotation item |
Stream set anatomy
Each stream set has a name, active state, filters, pixel selection, and rotation table.
| Control | What it does | Notes |
|---|---|---|
Name | Internal label for the stream set. | Use names that describe the audience or fallback role, for example US mobile, EU desktop, or Fallback. |
Active | Enables or disables the stream set. | Axalot prevents saving a campaign with no active streams. |
Filters | Opens the stream filter dialog. | Filter count appears on the stream card when filters exist. |
Pixels | Selects pixels for the stream. | Up to 5 pixels can be selected per stream. |
Duplicate | Copies the stream set. | Useful for making a similar geo/device split. |
Delete | Removes the stream set. | The form keeps at least one stream. |
| Drag handle | Changes the stream order. | Order matters because matching is evaluated from top to bottom. |
Filters
Filters decide whether a click should enter a stream. They are configured from the stream card through the filter dialog.
The dialog supports rule groups and logic modes from the Axalot report rule builder. Use it to combine request, audience, geo, and Traffic Source parameter checks.
Request filters include IP version, IP address/range/CIDR, user agent, referrer, X-Requested-With, Accept Language, and mapped query parameters.
Audience filters include MT fields such as mobile state, device type, OS, browser name, browser engine, and bot state. Use them for mobile/desktop splits, browser-specific routing, or bot QA.
Geo filters include continent, country, region, city, postal code, and timezone. Use country and timezone carefully because each can be added only once per stream.
Source parameter filters use the GET parameter mapping from the selected Traffic Source. They are useful for routing by campaign id, creative id, keyword, source, UTM fields, click id, or sub1-sub10.
Filter logic
Use a stream filter only when the route has a real business rule. A clean campaign usually has a few specific streams and one final fallback.
Stream 1: US mobile traffic
Stream 2: US desktop traffic
Stream 3: All remaining trafficIf a stream uses multiple rules, the dialog controls whether the rules are combined strictly or broadly. A strict group is used when every condition must match. A broad group is used when any one condition should be enough.
Supported filter examples
| Goal | Filter setup |
|---|---|
| Route only US traffic | Country IS US |
| Exclude a country | Country IS NOT DE |
| Route mobile traffic | Is Mobile IS yes |
| Route Android traffic | OS Name IS Android |
| Route Chrome traffic | Browser Name IS Chrome |
| Catch empty referrer traffic | Referrer text filter with the empty value option |
| Route a Meta campaign id | Traffic Source parameter for ad_campaign_id IS the expected value |
| Exclude a known IP range | IP IS NOT 192.168.1.10-192.168.1.20 |
Filter validation rules
Axalot validates stream filters before saving the campaign.
| Filter type | Validation |
|---|---|
| Country | ISO-2 country values; only one country filter per stream. |
| Timezone | Valid IANA timezone values; only one timezone filter per stream; up to 20 values. |
| Accept Language | ISO 639-1 language values; up to 20 values. |
| Audience fields | Must use the field's supported dropdown values. Every audience field includes Unknown; is_mobile and is_bot use yes, no, or unknown. |
| IP | IPv4, IPv6, IP range, or CIDR; up to 100 values. |
| Postal Code | Digits only, 3-10 characters; up to 20 unique values. |
| Text filters | Up to 5 tags for most text fields; safe letters, numbers, spaces, dots, dashes, underscores, /, :, +, #, and parentheses. |
| Query parameters | IS or IS NOT; up to 20 unique values per parameter filter. |
Do not describe routing with unsupported request fields
Campaign stream validation does not support host, method, or generic query_parameter filters. Use mapped Traffic Source parameters instead of generic query-parameter rules.
Pixels
Pixels are selected per stream set. This lets one campaign send different accepted traffic segments to different pixel configurations.
Use stream-level pixels when:
- Different traffic segments belong to different ad accounts.
- A test stream should report to a separate pixel.
- A fallback stream should avoid sending events to the same pixel as the primary stream.
- A campaign has multiple destinations but only some traffic should activate a specific pixel.
Pixel selection is not global
Selecting a pixel on one stream does not automatically select it on every stream. Add the same pixel to each stream that needs it.
Rotation
Rotation is the destination table inside a stream. A stream can have up to 5 rotation items. Each item stores an active state, optional pre-landing, destination type, destination value, required offer link, and weight.
| Rotation column | What it controls |
|---|---|
Pre-landing | Optional page shown before the main destination. |
PWA / Landing | Selects whether the main destination is a PWA or landing. |
Offer Link | Required offer link for the flow. |
Weight | Integer from 1 to 100 used by weighted rotation. |
Actions | Duplicate, delete, and active state controls. |
Offer link is required
Every rotation item must have an offer link. If the item uses PWA or Landing, the PWA or Landing is also required.
Destination flow modes
Axalot stores the flow mode from the selected fields. You do not need to type the mode manually.
Select PWA, choose a PWA, and select an offer link. Use this when the click should enter a PWA path before continuing to the offer.
Select Landing, choose a landing, and select an offer link. Use this when the click should see a landing page before the offer.
Select a pre-landing plus either a PWA, landing, or direct offer link. Use this when the first page qualifies or warms the visitor before the main destination.
Leave the landing stage empty and select only the offer link when the click should go directly to the offer.
System destination options are available in the landing selector: 404-NGINX, 404-CF, and Milk. Use them only for intentional operational routing, not as a replacement for a normal fallback offer.
Weights
Weights control how active rotation items share traffic inside one stream. The form accepts integer weights from 1 to 100.
| Setup | Meaning |
|---|---|
| One active item | Weight is effectively 100. |
Two items, 50 and 50 | Even split between both active items. |
Two items, 80 and 20 | The first item receives more traffic than the second. |
| Three items, aligned | The align action distributes weights across active rows as evenly as possible. |
Use the align action after adding or duplicating rotation items when you want a neutral test split.
Weights belong to one stream
A weight affects only the rotation items inside the same stream set. It does not change how traffic is split between different streams.
Active states
Streams and rotation items both have active toggles.
| Toggle | Result |
|---|---|
| Stream inactive | The stream is skipped during routing. |
| Stream active | The stream can match traffic if its filters pass. |
| Rotation item inactive | The destination item is not used by that stream. |
| Rotation item active | The item can receive traffic according to its weight. |
Axalot keeps the campaign routable by enforcing these minimums:
- At least one stream must stay active.
- Each stream must have at least one active rotation item.
- Each stream must keep at least one rotation item.
- Each campaign must keep at least one stream set.
Recommended setup patterns
Specific first, fallback last
Use this pattern for most campaigns.
1. US mobile
Filters: Country IS US, Device Type IS Mobile
Rotation: PWA A -> Offer Link A
2. US desktop
Filters: Country IS US, Device Type IS Desktop
Rotation: Landing A -> Offer Link A
3. Fallback
Filters: none
Rotation: Offer Link BCreative or campaign split
Use Traffic Source parameters when the ad platform sends campaign, ad set, creative, or keyword values in the tracking URL.
1. Creative test A
Filters: creative_id IS 12345
Rotation: Landing A -> Offer Link A
2. Creative test B
Filters: creative_id IS 67890
Rotation: Landing B -> Offer Link A
3. Fallback
Filters: none
Rotation: Offer Link ALanding A/B test
Use one stream and multiple rotation items when the audience is the same but destinations are being tested.
1. Main audience
Filters: Country IS US
Rotation:
- Landing A -> Offer Link A, weight 50
- Landing B -> Offer Link A, weight 50Editing workflow
Create the broad campaign settings first: domain, Traffic Source, push group, cost model, tags, and note.
Rename the default stream from Set 1 to a meaningful audience name.
Add filters only for the audience difference that matters.
Select pixels for the stream if events should be sent for that segment.
Build rotation rows with the required offer links and any PWA or landing stages.
Add a final fallback stream without filters when the campaign should always have a valid route.
Save the campaign, then use the generated campaign link for QA.
Troubleshooting
| Symptom | What to check |
|---|---|
| Stream does not receive traffic | Confirm the stream is active and above the fallback stream. |
| A lower stream never matches | Check whether a filterless stream above it is catching all traffic. |
| Campaign cannot save | Check required offer links, required PWA/Landing selections, active stream minimums, and validation messages. |
| Pixel events are missing | Confirm the pixel is selected on the matching stream, not only on another stream. |
| Query parameter filter does not match | Confirm the Traffic Source maps the same GET parameter name used in the campaign tracking link. |
| Weight split looks wrong | Confirm only intended rotation items are active and align weights if you want an even split. |