CRM users want a green dot: “opened”. Under the hood that means pixels, redirects, webhooks, and privacy rules that changed how reliable tracking is.
The old way: tracking pixel in HTML email
Classic open tracking embeds a 1×1 image (or CSS background) with a unique URL per message. When the client loads images, your server logs a hit and the CRM flips status to “opened”. Gmail, Apple Mail Privacy Protection, and corporate filters often preload or proxy images — so you may see false opens or miss real ones.
- Tracking domain: use a subdomain like `t.yourdomain.com` so main domain reputation stays clean
- Link wrapping: each link goes through your redirect to count clicks separately from opens
- Limitation: text-only emails and “display images” off = no open event
Gmail specifically
You cannot read Gmail’s internal read receipts for arbitrary CRM mail. If you send through Gmail SMTP as a human, you do not get trustworthy open analytics. For product mail you send through a transactional provider (Resend, Postmark, SES) and consume their events.
Modern flow: Resend + webhooks into your CRM
Resend signs webhooks with your secret; events include `email.delivered`, `email.opened`, `email.clicked`, `email.bounced`, `email.complained`. Store `message_id` from the send API on your CRM activity row, then match incoming events.
- POST /api/crm/emails → Resend `emails.send` with `tags: { activity_id }`
- Resend dashboard → Webhooks → your `POST /api/webhooks/resend`
- Verify `svix-signature` (or Resend’s signing headers) before updating DB
- CRM timeline: Delivered → Opened (timestamp) → Clicked (link id)
UI patterns that work
- Badge on thread: Delivered / Opened / Clicked / Bounced
- Relative time: “Opened 2h ago” with tooltip for exact UTC
- Filter pipeline: “Sent, no open in 3 days” for sales follow-up
- Never block send on open tracking — tracking is async metadata
Opens measure engagement hints. Clicks measure intent. Replies measure revenue.