Metric · Marketing

What is email open rate, and how do you measure it in Metabase?

Email open rate is unique opens divided by delivered emails — the classic first read on whether a subject line and sender name earned attention. Classic, and increasingly compromised: privacy proxies now open email no human read. Measure it in Metabase from campaign stats synced from Klaviyo, Mailchimp, or ActiveCampaign — and read it next to click-through rate, which still measures people.

TL;DRunique opens ÷ delivered, per campaign and month, treated as a directional signal rather than a truth. Apple Mail Privacy Protection has inflated opens with machine pre-fetches since 2021, so decisions belong with clicks and conversions; opens are for spotting relative movement within your own list.

What does an open rate chart look like in Metabase?

Chart unique opens over delivered per month for one campaign type as a line, reading the trend rather than the level — machine opens inflate the absolute number. The gradual climb reflects subject-line and list-hygiene work compounding, while a one-month dip like February's usually signals a deliverability wobble, worth checking against bounce rate before rewriting subject lines.

Open rate in Metabase: a line chart of unique opens over delivered per month.
Open rate as a Metabase card, built from synced campaign stats. Figures are illustrative.

What open rate measures

Mechanically, it measures tracking-pixel loads: an invisible image fires when the email renders, and the sender's platform logs an open. That made it a decent attention proxy for two decades — subject line tests, send-time tests, and list-health checks all ran on it. It still works for relative comparisons inside one list on one day, and a collapse in opens remains a useful deliverability alarm (inbox vs. spam folder placement). What it no longer supports is absolute claims: "42% of recipients read this" hasn't been a defensible sentence since the proxies arrived.

The Apple Mail Privacy Protection problem

Since late 2021, Apple's Mail Privacy Protection routes mail for opted-in Apple Mail users through Apple's servers, which pre-fetch every image — including the tracking pixel — whether or not the recipient ever opens the message. Each pre-fetch registers as an open. Other privacy tools and corporate security scanners do the same on a smaller scale. The practical consequences: open rates stepped up in 2021 and never came back down, open-based segments like "hasn't opened in 90 days" misclassify Apple Mail users as engaged, and open-rate A/B test wins can be pure noise. Where the platform exposes it, split machine opens from human opens; where it doesn't, weight clicks instead.

What data does it need?

  • An email_campaign_stats table with sent_at,campaign_name, campaign_type, delivered, unique_opens, and unique_clicks — the standard shape of campaign-level syncs from email platforms.
  • delivered as the denominator, not sent — bounces belong to email bounce rate.
  • Optional but valuable: list-age or segment fields, and the platform's machine-open flag where one exists.

SQL patterns

Unique open rate by campaign by monthPostgreSQL
SELECT
  date_trunc('month', sent_at) AS month,
  campaign_name,
  SUM(delivered) AS delivered,
  SUM(unique_opens) AS unique_opens,
  ROUND(
    100.0 * SUM(unique_opens) / NULLIF(SUM(delivered), 0), 1
  ) AS open_rate_pct
FROM email_campaign_stats
WHERE sent_at >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1, 2
ORDER BY 1, 2;
Open rate vs. click rate by campaign typePostgreSQL
SELECT
  campaign_type,
  SUM(delivered) AS delivered,
  ROUND(
    100.0 * SUM(unique_opens) / NULLIF(SUM(delivered), 0), 1
  ) AS open_rate_pct,
  ROUND(
    100.0 * SUM(unique_clicks) / NULLIF(SUM(delivered), 0), 2
  ) AS click_rate_pct,
  ROUND(
    100.0 * SUM(unique_clicks) / NULLIF(SUM(unique_opens), 0), 1
  ) AS click_to_open_pct
FROM email_campaign_stats
WHERE sent_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1
ORDER BY open_rate_pct DESC;

Pitfalls

Treating opens as human attention.→ Machine opens from Apple's proxy and security scanners inflate the number without any reader involved. Use opens for relative movement, and anchor decisions to clicks and conversions.
Dividing by sent instead of delivered.→ That mixes deliverability into engagement. Opens over delivered, bounces on their own card — two metrics, two diagnoses, two fixes.
Building suppression segments on opens alone.→ "Hasn't opened in 90 days" now keeps proxy-opened dead addresses on the list and can suppress real readers whose client blocks images. Define engagement segments on clicks, replies, or site visits.
Comparing open rates across campaign types.→ A transactional receipt, a weekly digest, and a cold announcement have structurally different baselines, and list age shifts them further. Compare within a campaign type, against its own history.

Where this metric applies

Metrics

Dashboards

FAQ

Why did our open rates jump without any change in engagement?
Almost certainly Apple Mail Privacy Protection. Since 2021, Apple Mail pre-fetches tracking pixels for its users regardless of whether the human ever opens the email, registering a "machine open." Lists heavy in Apple Mail readers saw open rates jump 10–20 points overnight and stay inflated ever since. The open didn't get more meaningful — it got less. That's why decisions should lean on click-through rate and downstream conversion, which measure actions no proxy can fake.
Unique opens or total opens?
Unique opens for the rate — one recipient who opens five times is one engaged recipient, not five. Total opens divided by delivered produces rates over 100% on engaged lists, which is a hint the math is wrong. Total opens still have a niche use (gauging re-reading of reference content like release notes), but every open-rate card should be built on unique_opens ÷ delivered.
Opens divided by sent or by delivered?
Delivered. Sent minus bounces is the population that could have opened, so dividing by sent quietly mixes deliverability problems into an engagement metric. Keep the two failure modes separate: email bounce rate owns "did it arrive," open rate owns "did it get noticed." A falling opens-over-sent number can mean worse subject lines or a decaying list — you can't tell which until you split them.
What's a good open rate?
Cross-company benchmarks stopped meaning much after Mail Privacy Protection, because the inflation depends on each list's Apple Mail share. The comparisons that still work are internal: this campaign type against its own history, one subject line against another within the same send window, engaged segments against the list average. And because opens are partly synthetic, sanity-check any open-rate finding against clicks — a subject line that "wins" on opens but loses on clicks didn't win.
How do you track open rate in Metabase?
Metabase reads from your SQL database or warehouse, so sync campaign stats — delivered, unique opens, unique clicks — from Klaviyo, Mailchimp, or ActiveCampaign using a pipeline tool like Airbyte or Fivetran. Chart unique open rate by campaign and month, put click rate on the same axis so divergence is visible, and pin both to an email engagement dashboard alongside bounce rate.