SendpositoryDocs
Guides

Open tracking

Add a tracking pixel and read the result honestly - what Apple's Mail Privacy Protection changed, and what opens still tell you.

Updated

Send with track_opens and we add a 1×1 image to the HTML body. When a mail client renders that image, we record an open.

{
  "from": "Acme <hello@mail.yourdomain.com>",
  "to": ["customer@example.com"],
  "subject": "Your invoice",
  "html": "<p>Attached.</p>",
  "track_opens": true
}

Text-only messages have nowhere to put an image. Asking for tracking on one isn't an error, but the message is recorded as untracked so the dashboard never shows it waiting for an open that can't arrive.

Turning it on for everything

If you want it on all your mail, Settings → Open tracking sets an account default. Every message with an HTML body then carries a pixel without your having to ask each time.

It is off for every account until somebody turns it on. Enabling it changes what lands in your recipients' inboxes, so it is a decision you make rather than one a release makes for you.

One message can still differ

track_opens on a send overrides the default in both directions:

Account defaulttrack_opens on the sendResult
offomittednot tracked
offtruetracked
onomittedtracked
onfalsenot tracked

That last row is the one worth knowing. An account that tracks its marketing mail can still send a password reset untracked, without touching the setting:

{
  "from": "Acme <hello@mail.yourdomain.com>",
  "to": ["customer@example.com"],
  "subject": "Reset your password",
  "html": "<p>Use this link within an hour.</p>",
  "track_opens": false
}

What you get back

The message page shows a first-open time and a count, and email.opened fires on your webhooks. The GET /v1/emails/{id} response carries track_opens, opened_at and open_count.

What an open actually means

A floor, not a count

An open means at least this many people saw the message, plus noise. It is not proof that a particular person read it, and no open is not evidence that nobody did.

Three things break the signal, and all three are common:

What happensEffect
Apple Mail Privacy ProtectionFetches every image through Apple's proxy the moment mail arrives, whether or not anyone looksOpens that nobody performed, timestamped on delivery
Outlook and other blockersRemote images off by defaultReal reads that leave no trace at all
Gmail's image proxyCaches the fetched imageThe second and third read often never reach us

We recognise privacy-proxy fetches on the way in and keep them as events without counting them, so the number you see is opens we believe a person performed. That detection is a guess about a user agent, which anything can claim — it decides how a number is displayed, never anything that matters.

Use opens for trends and for comparing one send against another. Don't use them to decide whether one named person read one message: for that, the question the data can actually answer is whether it was delivered.

Changing your mind after sending

Tracking is recorded on each message when it is sent, so changing the account default never alters mail that has already gone out. A message whose track_opens is cleared stops recording, even if its pixel is fetched with a valid URL: nothing is retroactive — opens already recorded stay — but the pixel goes inert.

Retention

Open events age out with everything else on your account's retention window. See Logs.

On this page