Guides

Open tracking

PristineSend lets you choose how much you measure a recipient — per workspace, per campaign, or per message. Three modes trade analytics for privacy: full, essential, and off. Deliverability protection (bounce and complaint handling) is always on regardless of the mode — you only ever change what open and click data is kept.

The three modes

fullFull

Precise opens and clicks — the default, unchanged.

Opens
First open recorded with a full timestamp (date + time).
Clicks
Every click on a tracked link recorded with a full timestamp.
List hygiene
Best signal for engagement segments, open-rate reporting, the AI deliverability score, and inactive-subscriber sunsetting.
Privacy
Standard email analytics — an invisible tracking pixel and link redirects. The right default for a US/international audience.
essentialEssential

Day-level opens, full clicks — minimized analytics that keep list hygiene working.

Opens
The open DATE only (day-granular, stored at midnight UTC, last-open wins, no time and no per-open history). An open still counts — it just isn't timestamped to the minute.
Clicks
Unaffected — clicks are tracked at full fidelity, exactly like Full.
List hygiene
List hygiene keeps working: 'opened in the last N days' is a date-range check, so essential opens still drive engagement segments and inactive-subscriber sunsetting. Open RATE and the open-derived AI score are marked not-applicable (the day-only data isn't precise enough to report as a percentage).
Privacy
The data-minimized shape behind the France (CNIL) / Italy (Garante) list-hygiene exemption for the open pixel: measure deliverability and engagement without retaining behavioural open-time analytics.
offOffGated

No open or click tracking — maximum recipient privacy.

Opens
Not tracked. No pixel is injected, so no open is ever recorded (opened_at stays null — read as 'not tracked', never 'not opened').
Clicks
Not tracked. Links are not rewritten, so no click is ever recorded (clicked_at stays null).
List hygiene
Inactive subscribers can't be detected via opens or clicks — engagement segments and open-based sunsetting go dark for these sends. Bounce and complaint suppression are still fully enforced (the deliverability floor never drops), so hard bounces and spam complaints still protect your reputation.
Privacy
The strongest privacy posture: the recipient is not measured at all. Choose it for privacy-first audiences or where consent for tracking wasn't given.
Availability
Gated. Until your account is provisioned for off-tracking, a send requesting 'off' is rejected with 503 service_unavailable (per-item in a batch). Contact support to enable it.

Why Essential exists

Regulators in France (the CNIL) and Italy (the Garante) treat the email open pixel as consent-gated under ePrivacy law — with a narrow exemption for deliverability and list-hygiene measurement if the stored data is minimized. essential is that minimized shape: the open date is retained (day-granular, last-open only, no time and no per-open history), which is enough to keep engagement segments and inactive-subscriber sunsetting working, without keeping behavioural open-time analytics. Clicks are unaffected. It's the middle ground between full analytics and going dark — measure your list's health, drop the surveillance.

Setting the mode

The effective mode is resolved per message → per campaign → workspace default:

  • Workspace default — Settings → Workspace → Open tracking. Applies to everything unless overridden.
  • Per campaign — the campaign editor's Open tracking control (inherits the workspace default unless you change it).
  • Per message (API) — the optional tracking field on POST /send and each item of POST /send/batch. Omit it to inherit the workspace default.
"color:#ff7b72">import { PristineSend } "color:#ff7b72">from "pristinesend"

"color:#ff7b72">const ps = "color:#ff7b72">new PristineSend(process.env.PRISTINESEND_API_KEY!)

// Send this one message with reduced (day-level) open tracking.
// Omit `tracking` to inherit your workspace default.
"color:#ff7b72">await ps.emails.send({
  to: "reader@example.com",
  subject: "Your weekly digest",
  html: "<p>…</p>",
  tracking: "essential", // "full" | "essential" | "off"
})

Off availability

off requires a dedicated events-only sending configuration, so it's available on request rather than on by default. Until your account is enabled for it, a send requesting off is rejected with 503 service_unavailable — nothing is sent, and in a batch only the off items fail while the rest deliver. PristineSend never silently falls back to tracking-on when you ask for off. Contact support to turn it on.

// Requesting "off" before your account is enabled for it:
{
  "error": {
    "code": "service_unavailable",
    "message": "Open-tracking mode 'off' is not available on this account yet.",
    "request_id": "req_…"
  }
}
// HTTP 503. In a batch, only the "off" items fail this way; the rest still send.

What reads and webhooks see

Every email row carries an open_tracking_mode field (see the email object) so a reader can interpret opened_at/clicked_at correctly:

Modeopened_atclicked_atWebhook events
fullFull timestamp (first open)Full timestampemail.opened, email.clicked
essentialDay-granular date (midnight UTC)Full timestampemail.opened (day-granular), email.clicked
offnull — not trackednull — not trackedneither fires

A null opened_at under off means "not tracked", not "not opened" — the open_tracking_mode field is how you tell them apart. See Webhooks for the event-level detail.