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:- Detection phase - Content script scans visible emails for tracking pixels and identifies sender-owned messages
- Suppression phase - Server receives suppression signal and marks the next pixel hit as sender-suppressed
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 thatemail_id.
Suppression signal endpoint
The background worker sends aPOST /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:Consume-once semantics
The suppression system uses consume-once semantics:- Content script sends suppression signal:
POST /mark-suppress-next - Server stores
{ email_id: timestamp }in memory - When pixel fires, server checks for pending suppression
- If found, server deletes the entry and marks event as suppressed
- Subsequent pixel hits for that
email_idare 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 suppressed3
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:Avoids brittle folder/tab inference
Avoids brittle folder/tab inference
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.
Works across Gmail views
Works across Gmail views
Whether you open your message from:
- Sent folder
- Search results
- Conversation view
- Pop-out window
sender_email === logged_in_email) works consistently.Event-based, not time-based
Event-based, not time-based
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.
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:Debug endpoints
The tracker provides debug endpoints to troubleshoot suppression:Suppression signals
Suppression debug
Database flags
Suppressed opens are stored in the database with flags:tracked_emails.open_count:
Frequently asked questions
What if I open my message multiple times?
What if I open my message multiple times?
Only the first pixel hit after the suppression signal is suppressed. Subsequent opens are counted normally (but may be caught by deduplication).
What if the pixel fires before the suppression signal arrives?
What if the pixel fires before the suppression signal arrives?
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
Can I suppress opens for a specific recipient?
Can I suppress opens for a specific recipient?
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.
Does suppression work if sender_email is missing from the token?
Does suppression work if sender_email is missing from the token?
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:Related features
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