Skip to main content

Why suppression matters

When you send a tracked email and then open it yourself (e.g., in your Sent folder), the tracking pixel fires just like it would for a recipient. Without suppression, your own opens would inflate the open count. Email Tracker uses identity-based, event-driven suppression to reliably distinguish sender opens from genuine recipient opens.

How it works

The suppression system uses a two-phase approach:
  1. Detection phase - Content script scans visible emails for tracking pixels and identifies sender-owned messages
  2. Suppression phase - Server receives suppression signal and marks the next pixel hit as sender-suppressed
Sender suppression flow diagram

Detection phase

The Gmail content script continuously scans for tracking pixels in visible messages.

Scanning for tracking pixels

Identity comparison

The key to reliable suppression is comparing the sender email in the token with the currently logged-in Gmail account:
This approach is more reliable than folder-based detection (e.g., checking if you’re in “Sent” folder) because Gmail’s SPA architecture makes folder inference brittle. Account identity is stable and unambiguous.

Token decoding in extension

The content script decodes tracking tokens client-side to extract sender email:

Suppression phase

Once the content script detects a sender-owned message, it signals the server to suppress the next pixel hit for that email_id.

Suppression signal endpoint

The background worker sends a POST /mark-suppress-next request:

Server-side suppression map

The server maintains an in-memory map of pending suppression signals:

Marking an email for suppression

When the server receives a suppression signal, it stores a timestamp:

Consuming suppression signal

When the pixel endpoint receives a request, it checks for pending suppression:
Suppression signals are consumed once (line 111: suppressionMap.delete(emailId)). If the pixel fires again later (e.g., sender reopens the message), subsequent opens are not suppressed.

Consume-once semantics

The suppression system uses consume-once semantics:
  1. Content script sends suppression signal: POST /mark-suppress-next
  2. Server stores { email_id: timestamp } in memory
  3. When pixel fires, server checks for pending suppression
  4. If found, server deletes the entry and marks event as suppressed
  5. Subsequent pixel hits for that email_id are not suppressed
1

Signal sent

Sender opens message → Content script sends POST /mark-suppress-next → Server stores suppressionMap.set(email_id, { createdAtMs })
2

Pixel fires

Email client requests pixel → Server finds email_id in suppressionMap → Server deletes entry and marks event as suppressed
3

Subsequent opens

Sender or recipient opens again → No suppression entry exists → Open is counted normally

Suppression TTL

Suppression entries have a 10-second TTL as a cleanup fallback, not as primary suppression logic:
The 10-second TTL exists to prevent memory leaks if pixel requests never arrive. It’s not a “suppression window” — suppression is consumed immediately when the pixel fires.

Why this is reliable for Gmail

The identity-based approach has key advantages over other suppression methods:
Gmail’s SPA architecture makes it unreliable to detect whether you’re viewing “Sent” vs “Inbox”. URL paths and DOM structure change frequently.Identity comparison is stable: The logged-in account email is always available and unambiguous.
Whether you open your message from:
  • Sent folder
  • Search results
  • Conversation view
  • Pop-out window
The identity check (sender_email === logged_in_email) works consistently.
Some trackers use a “suppression window” where all opens within N seconds are suppressed. This can miss legitimate recipient opens.Email Tracker uses explicit signal + consume-once, so only the first pixel hit after the signal is suppressed.
If you send from a shared inbox (e.g., team@company.com) and a teammate opens the message while logged in as teammate@company.com, the open is not suppressed because sender_email !== teammate@company.com.

Gmail Image Proxy latency

Gmail proxies images through Google’s servers, introducing latency between the suppression signal and pixel hit. The tracker measures this latency for debugging.

Latency sampling

Latency metrics endpoint

View Gmail proxy latency statistics:
Response:

Debug endpoints

The tracker provides debug endpoints to troubleshoot suppression:

Suppression signals

Returns:

Suppression debug

Returns per-email breakdown:

Database flags

Suppressed opens are stored in the database with flags:
Suppressed events are stored for audit/debug but do not increment tracked_emails.open_count:

Frequently asked questions

Only the first pixel hit after the suppression signal is suppressed. Subsequent opens are counted normally (but may be caught by deduplication).
If the pixel request arrives before the POST /mark-suppress-next signal, the open is counted. This can happen if:
  • Network latency is high
  • Gmail’s image proxy is very fast
  • The extension content script is slow to scan
In practice, the signal usually arrives first because it’s sent immediately when the content script detects the pixel.
No. Suppression is sender-based (not recipient-based). It only suppresses opens when the sender views their own message.To implement recipient-based suppression, you’d need to maintain a blocklist of recipient emails/IPs.
No. If sender_email is not included in the tracking token, the content script cannot compare it with the logged-in account, so suppression does not trigger.Ensure your extension captures sender email during token generation:

Email tracking

Learn how pixel tracking works end-to-end

Deduplication

Understand how duplicate opens are detected

Dashboard analytics

Explore dashboard APIs and analytics features