Skip to content
Letterhead Letterhead Letterhead Help Center
Admin Tools

Sending your own HTML: what's tracked and what's required

Edit in CMS

When you send a letter from your own HTML instead of using the Letterhead composer, tracking still works — you don’t add any markup for it — but a few limits on what gets tracked, and two requirements that can get the request rejected, are easy to miss if you’re coming from another ESP.

Opens are tracked with no setup on your part. Letterhead doesn’t inject a tracking pixel into your HTML — your sending email service provider’s own open tracking handles it.

Clicks are tracked by default too, but only for links that meet two conditions:

  • Only <a href="..."> anchors are tracked. A bare URL written directly into the HTML body text (not wrapped in an anchor tag) gets no click tracking.
  • Links containing a merge tag ({{ ... }}) or a data-feed expression ([[ ... ]]) are excluded from tracking. Rewriting one of these hrefs for tracking would corrupt the expression before it’s resolved, so Letterhead leaves them alone — the link still works, it just won’t appear in your click report.
Section titled “You don’t need to add an unsubscribe link”

Unsubscribe handling is automatic: Letterhead’s sending path adds the required unsubscribe mechanism for you. Unlike some other ESPs, you don’t need to include your own unsubscribe link in the HTML you send.

Two things reject the request outright, before anything is sent:

The channel must send through Letterhead’s own delivery system. If the channel you’re sending to is connected to a third-party email service provider instead, the request is rejected — this endpoint only supports Letterhead’s native sending path. Create the letter as a draft and send it from the Letterhead dashboard instead if your channel uses a third-party ESP.

The HTML has to pass validation. The following are rejected:

  • Forbidden tags: <iframe>, <form>, <input>, <embed>, <object>, <applet>, <frame>, <frameset>
  • Forbidden attributes: onclick, onload
  • Merge tags ({{ ... }}) that Letterhead doesn’t recognize

A common cause of an unexpected rejection is an unescaped & in the HTML — escape it as &amp;.

Still can’t find what you need? Contact support.