With dynamic destinations, a single redirect can send visitors to different destinations based on the incoming request: their country, the time of day, the device, a capture group in the path, or anything else we know about the request. Available from the Pro plan and up.
How it works
A redirect with dynamic destinations has multiple destinations, each with an expression. When a request comes in, we evaluate the expressions in order and use the first destination whose expression is true. A destination with an empty expression always matches, which makes it the fallback.
The order of the destinations matters: put the most specific expression first and the fallback last.
Parameters
Every destination variable is available as a parameter, without the curly braces:
domain.fqdn www.redirect-me-plz.co.uk domain.subdomain www path contact country US method POST userAgent Mozilla/5.0 (iPad; U; CPU..) scheme https acceptLanguage.language nl
The domain.subdomain parameter is especially useful with wildcard subdomains. Capture groups from regex matching are available as $1, $2 and so on.
Functions
On top of the parameters, these functions are available for working with time. All times are UTC unless you pass a timezone as the second argument.
now() the current time
time('15:00') today at 15:00 UTC
time('15:00', 'Europe/Amsterdam') today at 15:00 Amsterdam time
datetime('2023-01-01') midnight UTC on that date
datetime('2023-01-01 15:00') that date and time, UTC
datetime('2023-01-01 15:00', 'Europe/Amsterdam') that date and time, Amsterdam timeCompare them with the usual operators:
datetime('2023-01-01 15:00', 'America/New_York') > now()Random traffic split
random(min, max) returns a random integer in that range for every request. To send 70% of the traffic to destination A and the rest to destination B, give A the expression:
random(1, 100) <= 70
and leave the expression of B empty. This is a simple way to A/B test landing pages or to migrate gradually. Follow the results in your analytics.
Expression language
Expressions are evaluated with the Go expr package. It supports comparison and boolean operators (==, !=, <, &&, ||, not), in for lists, and string operators such as contains, startsWith and matches. The language definition lists everything that's available.
Examples
Example 1: route by country
Source: source.com Destination 1: https://destination.us country == 'US' Destination 2: https://destination.com (empty)
Visitors from the US are redirected to destination.us. Everyone else matches the empty expression and is redirected to destination.com.
Example 2: switch destinations at a launch date
Source: source.com
Destination 1: https://launching-soon.com datetime('2023-01-01 12:00', 'America/New_York') > now()
Destination 2: https://new-website.com (empty)Until January 1, 2023 at 12:00 New York time, visitors are redirected to launching-soon.com. After that moment, they're redirected to new-website.com.
Example 3: different destinations for morning and afternoon
Source: source.com
Destination 1: https://destination-before-12.com now() < time('12:00')
Destination 2: https://destination-after-12.com (empty)Before 12:00 UTC, visitors are redirected to destination-before-12.com; from 12:00 onwards to destination-after-12.com. Pass a timezone to time() to use local time instead.
Example 4: route by language
Source: source.com Destination 1: https://example.nl acceptLanguage.language == 'nl' Destination 2: https://example.de acceptLanguage.language == 'de' Destination 3: https://example.com (empty)
Dutch-speaking visitors go to example.nl, German-speaking visitors to example.de, and everyone else to example.com.