Routing: one code, many destinations
Every scan is routed at the edge, before any redirect happens. There are two ways to write the logic · the visual flow canvas in the dashboard, or the JSON rules object over the API · and one set of gates that runs before either.
Order of evaluation
Every scan walks the same corridor, in this order:
The gates (expiry, geo gate, password, cap) exist to refuse a scan; routing exists to pick where an accepted scan goes. Anything unmatched falls through to the link's main URL · routing can never strand a scanner.
The flow canvas
A flow is a node graph: a start node, condition nodes that branch, destination nodes that end. You drag it together in the dashboard, watch the simulator walk a pretend scan through it, and publish. Up to 50 nodes and 20 branches per condition · which in practice is a wall of logic no rules object stays readable at.
| Condition | Routes on | Branches |
|---|---|---|
| device | The scanning device | iOS · Android · desktop (opt-in) · else |
| geo | Country, read at the edge | your country groups · else |
| region | State or region within a country | your region groups · else |
| city | City | your city groups · else |
| lang | Browser language (Accept-Language) | your language groups · else |
| schedule | Time windows: recurring (days + HH:MM in a timezone) or absolute ISO ranges | first matching window · else |
| when | Before or after a single date | after · else |
| split | Weighted A/B split · sticky keeps a visitor on one variant, random rerolls | your variants · no else, it always picks |
| scans | How many times the link has been scanned | threshold branches · else |
| source | Where the visit came from: utm_source, utm_medium, utm_campaign, referrer | your value groups · else |
- when is the only one-way switch · every other condition can answer differently on the very next scan, and this one crosses its instant once and stays crossed. That is what makes it safe on something nobody is coming back to change · see a board that retires itself on completion day.
- Destinations can be inline URLs or entries from your resource repository · point ten flows at one saved destination and re-point them all in one edit.
- Starter templates cover the common shapes, and each one has a page where you can drive it against the real evaluator before you build anything: device routing for an app-store split, time-of-day routing for opening hours, split testing a printed code, routing by country, and language routing.
- Source routing is the newest condition and has no starter template yet. It reads the campaign tag or the referring host, so one printed code can answer differently in a parcel and in an email.
- Each condition costs 5 credits every time it changes · adding one, editing one and removing one each bill the same, and the same price applies to a rules-object key. Saving a flow you have not changed bills nothing, and repointing a branch at a different destination is free · it is the conditions that are metered, not where they lead. Nothing is refunded, so removing a condition and putting it back costs twice.
- A link that routes with a flow refuses a raw rules object over the API with
400· one brain per link. Gate rules still apply alongside a flow.
The rules object
The same routing, written as JSON for API and MCP clients: device, geo, language, schedule, A/B split, expiry, plus the gates. The full annotated example with every key lives in the API reference; it is machine-checked against the billing list, so if a key is billable it is documented there.
The gates
- Password · the edge shows a gate form; the password is hashed in your browser and only the SHA-256 hash is ever stored.
- Geo gate · allow-list or block-list of countries, with an optional elsewhere-URL for refused scanners. Runs before the password gate.
- Scan cap · a hard ceiling; past it, scanners see the paused page.
- Expiry · after the date, scanners 302 to a fallback URL or see an expired notice. Checked before every other rule.
- Preview interstitial · an anti-quishing, verified-brand "you are heading to…" page with optional auto-continue, for codes in hostile environments (posters, parking meters).