Linking in communications
Every button and link in an Apex communication points somewhere. This guide covers the kinds of destinations you can use, how to build them with the link builder, and how the composer tells you — before you send — whether a link will actually resolve for your recipients.
Confirmed, expected, unwired
Wherever you pick a link, the composer shows a colored dot next to each available field so you never ship a dead link:
- Confirmed (green) — Apex has seen this field resolve to a real, non-empty value on a real send along this communication's send path. It will work.
- Expected (amber) — this field should resolve on this send path (for example, a system link like the unsubscribe URL, or a trigger field that Apex hasn't observed yet), but no real send has confirmed it. Safe to use; it just hasn't been proven with live data.
- Unwired (red) — this field won't resolve on this send path. The most common cause is referencing a trigger field from a different send path (for example, a product field that only exists when a journey is triggered by
checkout_started, used in a standalone broadcast). Fix it before sending.
“Confirmed” is based on honest observation: the value is checked after Apex substitutes the recipient's data, on production sends only, and an empty string does not count. Test sends and previews never mark a field confirmed.
Kinds of destinations
A fixed URL
The same destination for everyone — a landing page, a pricing page, a blog post. Paste the URL and you're done. If you turn it into a short link, one branded short URL represents that fixed destination.
A per-recipient link
A destination that changes per recipient, built from a {{token}} that resolves from the recipient's data or the event that triggered the send. For example, a cart-recovery email triggered by checkout_started can link each recipient to their own cart:
https://shop.example/cart/{{cart_id}}Where does {{cart_id}} come from? From the send path:
- In a journey — from the journey's trigger event. If the journey is triggered by
checkout_started, every field on that event (cart_id,cart_total, …) is available as a token. The composer lists them and links to the journey's trigger so you can see exactly what it carries. - Transactional (API) sends — from the
variablesyou pass to the transactional send. You control the payload, so you decide which tokens exist. - Standalone — a communication that isn't attached to a journey has no trigger event, so per-recipient product tokens aren't available. Use a fixed URL or a system link, or add the communication to a journey to unlock per-recipient links.
System & app links
Some links are provided by Apex automatically and don't depend on your data — the unsubscribe URL, the recipient's login URL, an email verification URL, and links back into the Apex dashboard ({{app_url}}). These show as expected until a real send confirms them, and are always safe to use on the send paths where they apply.
Short links
A short link is a branded, trackable URL on your links. subdomain (for example https://yourbrand.links.apex.inc/aB3dEf9). Short links let you track clicks and swap the destination later without re-editing the communication.
- Fixed destination → one short link represents the destination for everyone.
- Per-recipient destination → the short link resolves to a different destination for each recipient. Apex signs each recipient's resolved destination into the link at send time, so the same branded short URL takes each person to their own page. A per-recipient destination can't be reduced to one shareable static URL — it only works inside a communication that carries recipient data.
Short links are optional. A plain URL or {{token}} works without shortening; shorten when you want click tracking or a branded, swappable link.
Using the link builder
In the communication composer, add a button or link and choose Build a link. The builder walks you through picking a destination kind, wiring the token (when relevant), and optionally turning it into a short link — showing the confirmed / expected / unwired status for each option as you go. When you're done it writes the final URL back into your button. You can reopen it later to edit.
If the builder finds a dead link in your communication (an old # placeholder or a retired token), it flags it so you can replace it before sending.