Smart links. One link, many destinations.
Route by device, geo, language, time of day. Rules evaluated at the edge POP — first match wins, fallback to the default destination. Costs nothing on top of a normal cache-hit redirect.
- First-match rule engine at the edge
- Sub-millisecond rule evaluation
- A/B variants with z-test confidence
- Time-windowed campaigns in UTC
How it works
The redirect path, end to end
Smart-link rules are evaluated inside the same edge process that answers the redirect — there is no separate rules service to call. A cache-hit redirect with rules is indistinguishable from a plain one in latency.
- Step 1
User clicks
elido.me/xFrom email, QR, social, anywhere.
- Step 2
Nearest edge POP
Frankfurt · 4 msAnycast routes to Hetzner FRA / OVH SGP / Hetzner ASH.
- Step 3
Rule eval
L1 cache · 0.2 msFirst-match wins, no origin round-trip.
- Step 4
302 → destination
elido.me/x → /de/preiseClick event fired async to Redpanda.
Rule builder
Rules that read like English
Every rule combines up to six dimensions — geo, device, OS, language, referrer, and time — joined with AND. Drag to reorder; first match wins. The fallback is always required, so a rule set never produces a 404.
- CountryISO 3166-1 alpha-2 lists, e.g. DE, AT, CH
- Device & OSiOS, Android, Windows, macOS, Linux
- LanguageAccept-Language with BCP-47 fallbacks
- Time windowUTC range with day-of-week filter
- ReferrerExact or wildcard host match
- 1ifCountry: DE, AT, CHANDDevice: Mobile/de/preise⋮⋮
- 2ifCountry: FR, BEANDLanguage: fr-*/fr/tarifs⋮⋮
- 3ifOS: iOSApp Store · apps.apple.com/...⋮⋮
- 4ifTime: Mon–Fri 09–17 UTCANDReferrer: newsletter.*/promo/q2⋮⋮
- else/en/pricing— fallback (required)
Real-world routing
Same short link. Different landing per visitor.
The two patterns we see most: device-fork to native app stores with a desktop fallback, and country-fork for localised pricing pages. Both compose with A/B splits on the fallback path.
Country routing in production
An EU SaaS routing brand.app/pricing by visitor country. The fallback (everyone else) lands on the English page.
- DE · Germany/de/preise
- FR · France/fr/tarifs
- ES · Spain/es/precios
- IT · Italy/it/prezzi
- PL · Poland/pl/cennik
- NL · Netherlands/nl/prijzen
- SE · Sweden/sv/priser
- UA · Ukraine/uk/tsiny
- — · Everyone else/en/pricing
A/B testing
Split traffic. Watch confidence climb.
Up to 5 variants per link with weighted or round-robin splits. Each variant tracks its own click time-series. The dashboard surfaces a two-proportion z-test as a directional indicator — we don’t hide the math.
- Weighted (sums to 100) or round-robin
- Per-variant click time-series
- Z-test confidence over a configurable sample floor
- Winner-picks-all locks the link to the leading variant
- Composes with rules — A/B applies to the fallback path
What you can do
- ISO country and IANA timezone matching
- Mobile / tablet / desktop targeting
- Time windows with day-of-week filters
- User-Agent regex for power users
- Per-link click cap (max_clicks)
- A/B variants with weighted or round-robin
What the smart-link rule engine actually does
Geo routing and device targeting are table stakes. The details below explain the edge cases that trip up basic implementations.
First-match wins, evaluated at the edge POP — no origin round-trip
Rules are stored in Redis (L2 cache) and evaluated by the edge-redirect service on every request, inside the same process that does the redirect — there's no separate rules engine to call. Rule evaluation adds less than 1ms to a cache-hit redirect. The evaluation order is the order you set in the dashboard or API; drag to reorder, or use the order field in the API. First-match semantics mean you put your most specific rules first (e.g., 'mobile + Germany + Monday morning → promo page') and your catch-all rules last. If no rule matches, the fallback destination is served — fallback is required, it cannot be empty. Rule changes propagate from api-core to Redis in under 30 seconds; the edge LRU cache TTL for rule-bearing links is 60 seconds, so the full propagation window is under 90 seconds.
Six dimensions: geo, device, OS, language, referrer, and time
Each rule can combine up to six dimensions in a single condition. Geo: ISO 3166-1 alpha-2 country code list (one or more countries). Device type: mobile, tablet, desktop — derived from User-Agent. OS: iOS, Android, Windows, macOS, Linux — also from User-Agent. Language: Accept-Language header matching (BCP 47 language tags; 'fr' matches 'fr-FR', 'fr-CA', etc.). Referrer domain: exact or wildcard match against the Referer header domain (useful for routing social vs email vs direct). Time: UTC time window with optional day-of-week filter (e.g., 'Mon–Fri 09:00–17:00 UTC'). User-Agent regex is available for power users who need to target a specific browser version or crawler; it's not exposed in the dashboard by default, only via the API. Multiple dimensions in a single rule are AND-ed; a link can have up to 5 rules (Pro) or unlimited (Business).
Weighted A/B splits with z-test confidence — up to 5 variants per link
A link can have up to 5 destination variants. Traffic splits by weight (configurable per variant; weights must sum to 100) or round-robin. Each variant tracks its own click time-series so you can see if the effect is consistent across hours of day. The confidence model is a two-proportion z-test at the click level: the dashboard shows 'variant A leads with X% confidence' once both variants clear a minimum sample (default 200 clicks each, configurable up to 1,000). We report raw z-test confidence; we don't apply sequential testing corrections. A/B variants and smart-link rules can coexist on the same link: rules are evaluated first, and A/B split applies only to the fallback path. So you can route iOS users unconditionally while A/B testing two destinations for everyone else. The winner-picks-all button locks the link to the leading variant and deletes the others — this is irreversible.
Time-windowed rules for seasonal and event-based campaigns
Time rules let you set a rule that activates and deactivates on a schedule without manual intervention. The typical use: a promotional page rule active from Black Friday 00:00 UTC through Cyber Monday 23:59 UTC, then automatically falls back to the evergreen destination. Rules are evaluated in UTC; if your campaign is timezone-sensitive, convert to UTC at configuration time. Scheduled rules are evaluated the same way as static rules — at the edge, no origin round-trip. The dashboard shows a timeline view of scheduled rules so overlapping windows are visible. Edge case: if two time-window rules overlap and both match, the one with the lower order index wins (first-match). There's no conflict detection — overlapping rules are your responsibility to review.
Fallback destination is required — no 404s when rules don't match
Every smart link must have a fallback destination. There is no 'show an error page if no rule matches' option — the fallback is the safety net. The fallback can be any URL; it's also used as the canonical destination for Google Bot and other crawlers (smart-link rules are not applied to known crawler User-Agents to avoid indexing confusion). Beyond the primary fallback, link-level expiry (expires_at) and click cap (max_clicks) each have their own configurable expired-destination URL — separate from the rules fallback. So a link can have: up to 5 routing rules, a fallback for no-rule-match, a destination for post-expiry-date, and a destination for post-click-cap. These compose cleanly; edge cases are documented in the guides.
Teams using smart links in production
Names are placeholders for now — real customer names land here as case studies are published.
“We retired a Node.js redirect service that was costing us 40ms round-trip. Smart links on Elido evaluate rules at the edge; the redirect is as fast as a plain short link. The rules service was 600 lines of code we no longer maintain.”
“Time-windowed rules for seasonal content let us set campaigns in advance and go to sleep. Previously that was a 2 AM manual redirect change. Now it's a scheduled rule and a calendar reminder to check the result.”
“A/B confidence display in the dashboard stopped the 'is that statistically significant?' argument in our standup. We look at the z-test number, agree on a threshold, and move on.”
Elido smart links vs Bitly geo + Rebrandly geo
Both Bitly and Rebrandly offer geo routing. The differences are in rule depth, evaluation latency, and A/B capability.
| Feature | Elido | Bitly | Rebrandly |
|---|---|---|---|
| Rule dimensions | Geo, device, OS, language, referrer, time | Geo + device (limited) | Geo + device |
| A/B variants per link | Up to 5 — weighted + z-test confidence | Not available | Not available |
| Rules evaluated at edge | Yes — no origin round-trip | Edge-served redirects; rule evaluation varies | Varies by plan |
| Rule propagation time | Under 90 seconds | Not documented | Not documented |
| Scheduled / time-windowed rules | Yes — UTC window, day-of-week filter | Not available | Not available |
| Max rules per link | 5 on Pro, unlimited on Business | Geo: 1 per link | Varies by plan |
| Fallback destination | Required, configurable | Default destination | Default destination |
| Click cap | Yes — per link, per variant | Not available | Not available |
Smart links questions
How fast do rule changes propagate?
api-core pushes rule changes to Redis within 30 seconds of save. The edge-redirect service has an in-process LRU cache with a 60-second TTL for rule-bearing links. Full propagation: under 90 seconds in the worst case. If you need faster propagation (e.g., live event cutover), the API has a cache-bust endpoint that forces Redis invalidation immediately — edge LRU will then miss and re-fetch from Redis within seconds.
What happens if two rules match the same request?
First-match wins — the rule with the lowest order index is applied. There is no conflict detection or merging. It's your responsibility to order rules correctly and to avoid overlapping time windows or country lists. The rule preview tool in the dashboard lets you simulate a test request against the current rule set to verify which rule fires.
Do rules apply to Google Bot and other crawlers?
No. Known crawler User-Agent patterns are excluded from rule evaluation; crawlers always get the fallback destination. This is intentional — you don't want your smart-link routing to affect indexing behavior or serve crawlers region-specific content unintentionally. The crawler exclusion list is the same list used by the edge to classify organic vs bot traffic in analytics.
How is the z-test confidence calculated?
Two-proportion z-test at the click level. The null hypothesis is that both variants have the same click-through rate. Confidence is 1 - p-value, expressed as a percentage. We don't apply Bonferroni correction for multiple variants; running more than 2 variants increases the false positive rate. For formal experiments, export the raw click stream and run the significance test in your warehouse. We surface the dashboard number as a directional indicator, not a causal conclusion.
Can I set a rule that routes only on a specific referrer?
Yes — referrer domain matching is one of the six rule dimensions. You can match an exact domain (e.g., 'newsletter.example.com') or a wildcard ('*.example.com'). The Referer header is used; HTTPS referrer-stripping means you won't always get a referrer from external HTTPS sites. For links shared in email (where Referer is typically absent), referrer rules are less reliable than geo or device rules.
Can I use smart links on the free tier?
No. Smart links are a Pro and Business feature. Free tier links go to a single destination with no routing rules. You can preview the rules interface on free, but rules don't evaluate at the edge until you upgrade.
Are there per-variant analytics?
Yes. Each variant in an A/B split has its own click time-series visible in the link analytics view. Geo, device, and referrer breakdowns are aggregated at the link level, not per-variant — per-variant dimension breakdowns are on the roadmap for Business.
What's the difference between a smart link and a campaign A/B split?
Smart-link A/B is per-link: you split traffic to different destinations for the same short URL. Campaign A/B is at the campaign level: you run two short link variants (different slugs) targeting the same destination, and use the campaign analytics to compare which slug got more clicks. Different use cases: link-level A/B is for destination testing; campaign A/B is for creative and slug testing.
Keep reading
Universal Links + App Links — the mobile-specific routing layer that works alongside smart-link rules.
Campaign-level A/B, UTM templates, and scheduled exports — the campaign workflow built on top of smart links.
Click data, geo/device breakdown, and cohort views — what smart-link traffic actually looks like in ClickHouse.
How product teams use smart links for feature-flag routing, onboarding, and in-app share.