Short Links (Dynamic Links)
Short links shorten the URLs you send in outbound messages and track how many people click each one. They're also a deliverability tool: rotating the domain the short URL points at dilutes your link footprint, which keeps WhatsApp's anti-spam systems happy.
(There is a separate "dynamic links" feature for campaign-entry QR codes — covered in Dynamic links for campaigns. This page covers URL shortening.)
When to use it
- Your WhatsApp campaign templates include URLs and you want both shorter messages and per-link analytics.
- You want to swap the destination URL post-send without re-issuing the message.
- You're hitting Meta deliverability friction because the same long URL appears in many messages.
How it works
A short link is a row with:
- A slug (e.g.
abc123) auto-generated or hand-picked. - A target URL the slug redirects to.
- An optional expiry.
- Click-tracking counters.
When a recipient clicks https://{your-short-domain}/r/{slug}, the platform looks up the slug, increments the click counter, and 302-redirects to the target. The lookup is cached in Redis with a 60-second TTL for high-volume slugs.
Per-message rewriting
In a message template, drop {shortlink:<full-url>} and the platform will replace it at send time with a unique short URL pointing at the same destination — one short URL per recipient. This means analytics show who clicked, not just "somebody clicked".
Example template body:
Hi {{firstName}}! Check this out: {shortlink:https://your.site/landing/c/spring2026}
What gets sent:
Hi Alice! Check this out: https://r.your-tenant.com/r/x9k2p
If your tenant doesn't have the short-link feature enabled, the placeholder is left as the plain URL — no broken sends.
The four phases
Short links shipped in four phases. You get the value of every phase below your current adoption level:
F1 — Core shortener
DB-backed slug → target mapping, click tracking, admin CRUD, Redis read-through cache.
F2 — Template integration
The {shortlink:<url>} placeholder, resolved per recipient. The platform reuses the same short URL for the same (recipient, target) inside a 24-hour window so the recipient sees a stable link.
F3 — Domain rotation
Per-tenant custom domains for your short URLs. You can have several active domains and the resolver rotates between them — each outbound batch sees a different domain, but every domain resolves the same slugs. Existing short links keep working when you add or remove domains.
Configure in appsettings:
DynamicLinks:PublicBaseUrl— primary domain.DynamicLinks:FallbackBaseUrls— comma-separated rotation pool.DynamicLinks:HmacSecret— secret used for slug integrity checks.
F4 — Metered billing
Stripe metered billing for tenants that exceed their plan's monthly redirect quota. A monthly usage bucket counts clicks; once you exceed the quota, the platform reports overage to Stripe automatically. Soft and hard caps are configurable per edition.
Step-by-step
Create a short link
- Go to Integrations → Short links and click Create.
- Fill in Target URL. Optionally set a custom slug (otherwise auto-generated).
- Save. Copy the short URL and use it wherever you want.
Use the placeholder in templates
- Open a message template in Communications → Templates.
- Replace any long URL with
{shortlink:<long-url>}. - Save. The next send through this template will rewrite the URL per recipient.
Track clicks
Open the short-link detail page to see the click counter. Click Analytics for a time-series breakdown.
Add a custom domain
- Go to Integrations → Short links → Domains and click Add domain.
- Enter your domain (e.g.
r.yourbrand.com). - Point the domain's DNS at the platform (an A or CNAME record — the page shows the exact target).
- The platform issues a certificate and starts using the domain in the rotation.
Limits and gotchas
- Placeholder is only rewritten when the tenant has the feature enabled. Free-tier tenants get plain URLs.
- 24-hour reuse. The same recipient who's already been issued a short URL for the same target inside a 24-hour window will see the same one — don't be surprised that two messages have identical short URLs to the same person.
- Slug collisions are rejected. A hand-picked slug must be unique. Auto-generation never collides.
- HMAC integrity check. Each slug carries an HMAC; tampering with the slug returns 404.
- Permission:
Pages.DynamicLinks(plusPages.DynamicLinks.Domainsfor the domain page).