Senlo

Tracking and unsubscribe

Open and click tracking, and how unsubscribe links and one-click unsubscribe work.

https://senlo.io/api/t/o/<token>                  open pixel
https://senlo.io/api/t/c/<token>?url=...&s=...    click redirect
https://senlo.io/unsubscribe/<token>              unsubscribe page
https://senlo.io/api/unsubscribe/<token>          one-click unsubscribe (POST)

Senlo rewrites every email it sends with links like these. You do not build or call them yourself; this page explains what they do.

Open tracking

A 1×1 image at /api/t/o/<token> is added to the end of every email. When a mail client loads it, Senlo records an OPEN for the trigger. The response is always an image, even for an unknown token.

Opens are approximate: some clients block images, others (Apple Mail Privacy Protection) load them without the recipient opening anything.

Click tracking

Links in the email point at /api/t/c/<token>?url=<destination>&s=<signature>. Senlo records a CLICK and redirects to the destination.

The destination is signed together with the recipient token. A link whose url was edited is not followed: Senlo shows the destination on a page and records nothing. The unsubscribe link is never rewritten.

The token is sealed: it carries the trigger and the recipient without showing the address, and cannot be edited to count opens or clicks for someone else.

Unsubscribe

Every email carries:

  • the {{unsubscribe_url}} merge tag for a link in your footer, pointing at /unsubscribe/<token>;
  • List-Unsubscribe and List-Unsubscribe-Post: List-Unsubscribe=One-Click headers pointing at /api/unsubscribe/<token>, for the unsubscribe button Gmail, Yahoo and others show.

The token is signed with the instance's link-signing secret. A signed token unsubscribes at once, both on the page and on the one-click POST. What happens then is described in Contacts.

Links from mail sent before tokens were signed still work, but only on the page: the recipient has to confirm their address. The one-click POST answers 400 for them.

Self-hosted only

All of these links use APP_URL, and are signed with LINK_SIGNING_SECRET (or AUTH_SECRET when it is not set). Changing the secret breaks the links in mail already sent; set LINK_SIGNING_SECRET separately if you want to rotate AUTH_SECRET. See Configuration.

Custom tracking domain

Cloud only

Tracking and unsubscribe links currently use senlo.io. A custom tracking domain (your own CNAME) is planned for the Pro plan and is not available yet.

Edit this page on GitHub