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:
| Mode | opened_at | clicked_at | Webhook events |
|---|
| full | Full timestamp (first open) | Full timestamp | email.opened, email.clicked |
| essential | Day-granular date (midnight UTC) | Full timestamp | email.opened (day-granular), email.clicked |
| off | null — not tracked | null — not tracked | neither 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.