Email Open & Click Tracking

See exactly who opened your CRM emails, which links they clicked, and how each campaign and template is performing — right inside the CRM.

📊 Overview

The Kantivo Platform CRM automatically logs every outbound email and tracks two engagement signals: opens (when the recipient's mail client renders the email) and clicks (when the recipient clicks any link inside it). Results show up in a dedicated Stats tab inside the CRM, broken down by campaign and template, with drill-down to the individual recipient level.

You do not need to wire anything per template or per send. Tracking is on at the platform level once enabled, and every CRM and drip-campaign email is automatically instrumented before it goes out.

How Tracking Works

When a CRM or drip-campaign email is built, the platform performs two transformations before it's handed to Mailgun:

Link rewriting — every <a href> in your HTML is rewritten to point at /track/click/{token}. When a recipient clicks the link, the platform logs the click and immediately redirects them to the original URL. The user experience is identical to a normal link.
Open pixel — a 1×1 transparent GIF is appended just before </body>. When the recipient's mail client renders the email, it requests the pixel, and the platform records the open.
Mailgun webhook signal — if Mailgun's own opened/clicked events are enabled, they're ingested too as a redundant signal, with HMAC signature verification.
Per-send attribution — every send is tagged with its campaign, template, drip enrollment, step, sender, and recipient contact, so stats can be sliced by any of those dimensions.

Unsubscribe links are never tracked

The compliance footer's unsubscribe link bypasses the redirector. We do not interpose anything between a recipient and their right to opt out, and the click never appears in your stats.

📈 The Stats Tab

Open the CRM page (Admin Portal or Partner Portal), then click the Stats tab. You'll see four summary cards at the top — total sends, open rate, click rate, and failed/bounced — followed by a table you can flip between two views:

By Campaign — one row per drip campaign, with sends, open rate, click rate, MPP share, and last-sent date
By Template — same shape, grouped by message template (covers ad-hoc one-off sends too)
Click any row to drill into a per-link click breakdown, per-template sub-totals (for campaigns), and the latest 50 recipients with their individual open and click counts

Date-range filter

Use the Range dropdown in the top right to switch between Last 7 / 30 / 90 days, All time, or a custom from/to range. The summary cards and the row totals all respect the active range.

🔒 Who Sees What

The same stats endpoints serve both the Admin Portal and Partner Portal, but the data each user sees is automatically scoped:

Caller Sees
Org owner / adminEvery send across the entire organization
PartnerOnly sends where they are the sender
Sales repOnly their own sends
Org member (non-admin)Only their own sends

No way to see another user's engagement

The visibility filter is enforced server-side on every query. A partner cannot see a peer partner's opens, and a sales rep cannot see their partner's sends. Only org-admin-equivalent roles see the full picture.

🍎 The MPP Column — Apple Mail Privacy Protection

Since iOS 15, Apple Mail proxies the open pixel through Apple servers shortly after delivery, regardless of whether the recipient actually opened the email. This silently inflates open counts for any audience with a meaningful share of Apple Mail users — often 30–60% of B2C lists and 10–30% of B2B lists.

Rather than fold those into your headline number and quietly mislead you, the platform detects MPP-proxy opens by user-agent and accounts for them separately. Each campaign or template row in the Stats table has an MPP column showing what share of opens came from the Apple proxy:

Gray (under 25%) — the headline open rate is reasonably trustworthy
Amber (25–49%) — MPP is a meaningful chunk; weigh open rate accordingly
Bold amber (50%+) — this audience is heavily Apple Mail; treat opens as a soft signal and lean harder on click rate
— no opens recorded yet for this row

Click rate is the trustworthy metric

Clicks require a deliberate user action and are not affected by MPP. If you have to choose one engagement metric, click rate is the reliable one — especially for high-MPP audiences.

🤖 Bot & Prefetch Dedupe

Many email systems pre-fetch links and pixels for security scanning, link-preview rendering, and spam analysis. Without dedupe, a single delivered email can produce dozens of fake opens and clicks, completely destroying the integrity of your stats.

5-second IP+link dedupe — rapid double-fires from the same IP for the same link or send are collapsed into a single event
User-agent bot list — known scanners and prefetchers (GoogleImageProxy, Slackbot, Twitterbot, LinkedInBot, WhatsApp, etc.) are tagged as bot events and excluded from headline counts
Mailgun webhook longer dedupe — webhook-sourced events use a 10-minute window to prevent the redundant signal from double-counting against the pixel
Fail-open architecture — logging errors never block the redirect or break the pixel render; tracking failure is silent and the send still works

🛡 Privacy & Compliance

Email tracking has well-known privacy implications. The platform is designed to be defensible:

Unsubscribe links bypass tracking — the redirector is never inserted between a recipient and an unsubscribe action
Plain-text emails skip tracking — if you send a plain-text body, no rewriting or pixel is added
Author opt-out per anchor — add data-no-track to any <a> tag and that link is left untouched
12-month retention on raw events — the granular event log auto-prunes after a year; only denormalized aggregate counters live forever
No cross-org leakage — every query is scoped to the organization, with sender-level scoping for non-admins
HMAC-verified webhooks — Mailgun's own opened/clicked signal is signature-verified before any event is recorded, blocking forged stats

You should mention tracking in your privacy policy

The platform handles the technical side, but if you market into the EU/UK or to consumer audiences, your published privacy policy should disclose that you track email opens and link clicks for marketing analytics. This is standard for any CRM or marketing tool and the language is short.

🔑 Per-Org Mailgun Webhook Signing Keys

If your organization or partner team operates its own Mailgun account — common for resellers and white-label setups — you can supply your own HTTP webhook signing key. The platform will use it to verify your Mailgun's inbound webhooks (opens, clicks, bounces) instead of falling back to the platform-wide key.

To add or update yours:

  1. Mailgun Dashboard → API Security — copy your HTTP webhook signing key (this is separate from your Private API Key)
  2. Partner Portal → Email Settings — paste it into the Mailgun Webhook Signing Key field below Reply-To and click Save
  3. The field is write-only — once saved, it shows as ••• and a green “saved” indicator. Use the Show/Hide toggle while typing to verify, or the Clear toggle to remove the saved key

You don't have to do this

Per-org keys are optional. If you don't supply one, the platform falls back to a global signing key configured by the platform operator, and your webhooks are still verified using that. Per-org keys exist so multi-tenant Mailgun setups can be cryptographically isolated.

🌐 Mailgun Webhook Setup

The platform's open pixel and click redirector work without any Mailgun webhook configuration. But Mailgun also reports its own opened/clicked events, and ingesting those gives you a second data source — useful for clients that block remote images but still report to Mailgun.

To enable, in your Mailgun dashboard go to Sending → Webhooks for your sending domain (or use account-level webhooks if you only have one sending domain), and add this URL for each event type:

Webhook URL

https://bizbooks-platform-api-xyuy.onrender.com/api/v1/webhooks/mailgun

Event Why Enable
Permanent FailureHard bounces → auto-block contact
Temporary FailureSoft bounces → recorded, contact stays active
Spam ComplaintsAuto-block contact and unenroll from campaigns
UnsubscribesMailgun-side unsub events are honored
OpensRedundant open signal (catches image-blocked clients)
ClicksRedundant click signal

Skip Accepted and Delivered

The platform handler doesn't act on those event types — enabling them is just noise on your Mailgun dashboard.

Frequently Asked

Why is my open rate higher than my click rate? — That's normal — many recipients open without clicking. Apple Mail Privacy Protection also inflates opens for Apple Mail audiences; check the MPP column to see how much of your open count is proxied.
I sent an email, why isn't it in Stats? — The Stats tab shows tracked sends only. If EMAIL_TRACKING_ENABLED wasn't set on the API at the time of send, the row exists but won't have opens or clicks recorded. New sends after the flag was enabled will be tracked normally.
Can I disable tracking on a specific link? — Yes — add the attribute data-no-track to the <a> tag and the rewriter will leave it alone.
Do recipients see the tracking redirect URL? — Briefly, in the browser's address bar during the 302 redirect. Most users don't notice; the perceived behavior is identical to a normal link.
Are my recipients tracked across emails? — No — each open or click is logged against a single send, not against a recipient identity. There is no cross-email behavioral profile.
How long is event data kept? — Raw events for 12 months, configurable via EMAIL_TRACKING_RETENTION_DAYS. Aggregate counters on each send (open count, click count, MPP count, first-opened timestamp) are kept indefinitely, so historical campaign comparisons stay intact.
← All Documentation CRM Overview →