Skip to main content

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

  1. Go to Integrations → Short links and click Create.
  2. Fill in Target URL. Optionally set a custom slug (otherwise auto-generated).
  3. Save. Copy the short URL and use it wherever you want.

Use the placeholder in templates

  1. Open a message template in Communications → Templates.
  2. Replace any long URL with {shortlink:<long-url>}.
  3. 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

  1. Go to Integrations → Short links → Domains and click Add domain.
  2. Enter your domain (e.g. r.yourbrand.com).
  3. Point the domain's DNS at the platform (an A or CNAME record — the page shows the exact target).
  4. 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 (plus Pages.DynamicLinks.Domains for the domain page).