Email Marketing Metrics Formulas: How to Calculate Open Rate, CTR, CTOR and Bounce Rate
Exact formulas for open rate, CTR, CTOR, bounce, unsubscribe and complaint rate, with a worked example and the pitfalls that distort them.

Divide by delivered (sent minus bounced) for engagement metrics: open rate = unique opens ÷ delivered, CTR = unique clicks ÷ delivered, CTOR = unique clicks ÷ unique opens, unsubscribe and complaint rate = count ÷ delivered. Bounce rate = bounced ÷ sent. Opens have been inflated by Apple Mail Privacy Protection since 2021, so rely on clicks and conversions for decisions.
Two teams can send the identical campaign and report "20% open rate" and "18% open rate" because they divide by different numbers. Before comparing anything to a benchmark, make sure you calculate the metrics the same way. These are the formulas used by this site's calculator, explained with a worked example.
The formulas
| Metric | Formula | Denominator |
|---|---|---|
| Delivery rate | delivered ÷ sent | Sent |
| Bounce rate | bounced ÷ sent | Sent |
| Open rate | unique opens ÷ delivered | Delivered |
| Click-through rate (CTR) | unique clicks ÷ delivered | Delivered |
| Click-to-open rate (CTOR) | unique clicks ÷ unique opens | Opens |
| Unsubscribe rate | unsubscribes ÷ delivered | Delivered |
| Spam complaint rate | complaints ÷ delivered | Delivered |
| Conversion rate (from email) | conversions ÷ unique clicks | Clicks |
Where delivered = sent − bounced. Always use unique opens and clicks (one per recipient), not total events.
A worked example
You send a campaign to 10,000 recipients. 150 bounce, 2,100 unique opens, 420 unique clicks, 12 unsubscribes, 9 spam complaints and 40 purchases.
| Metric | Calculation | Result |
|---|---|---|
| Delivered | 10,000 − 150 | 9,850 |
| Bounce rate | 150 ÷ 10,000 | 1.50% |
| Open rate | 2,100 ÷ 9,850 | 21.32% |
| CTR | 420 ÷ 9,850 | 4.26% |
| CTOR | 420 ÷ 2,100 | 20.00% |
| Unsubscribe rate | 12 ÷ 9,850 | 0.12% |
| Complaint rate | 9 ÷ 9,850 | 0.09% |
| Conversion rate | 40 ÷ 420 | 9.52% |
Why "delivered" and not "sent"
Bounced messages never reached an inbox, so they cannot be opened. Dividing opens by sent punishes the metric for list-quality problems, mixing content performance with list health. Reporting bounce rate separately (against sent) keeps the two stories apart. Some platforms divide by sent by default; check your ESP's definition before comparing numbers across tools.
The open-rate problem
Since Apple's Mail Privacy Protection (2021), Apple Mail can preload email images, including the tracking pixel, whether or not the person reads the message. These "opens" inflate the open rate, remove the reliability of open time and location, and make some audiences look more engaged than they are. Use opens only as a rough trend and base decisions on clicks and conversions. We explain how to adapt in our guide to Apple Mail Privacy Protection and open rates.
Which numbers to watch together
No single metric tells the story. Read them as a funnel and look for where it narrows:
| Stage | Metric | If it is weak, suspect |
|---|---|---|
| Reached the server | Bounce rate, delivery rate | List quality, typos, old addresses (see list hygiene) |
| Seen | Open rate (directional only) | Subject line, sender name, filtering, MPP noise |
| Interested | CTR and CTOR | Offer, layout, call to action, relevance of the segment |
| Acted | Conversion rate, revenue per email | Landing page, price, tracking set-up |
| Trust | Unsubscribe and complaint rate | Frequency, expectations set at sign-up, mismatched content |
A healthy CTR with a rising complaint rate is a warning, not a win: you are getting clicks from some people while annoying others. Likewise a very high CTOR on a tiny open count usually means only your most loyal readers are visible.
Total versus unique, and why it matters
If one person opens an email five times, total opens counts five and unique opens counts one. Total figures reward re-reading and tracking-pixel reloads; unique figures answer the question you actually care about, how many people. Some platforms report "click rate" using total clicks by default, which makes link-heavy newsletters look better than they are. Choose unique counts as your standard and label every chart with which one you used.
Rates that need a different denominator
Not every rate divides by delivered. Two variants are worth knowing:
- Revenue per email (RPE): revenue attributed to the campaign ÷ delivered. It combines click and conversion performance into one comparable number across campaigns of different sizes.
- List growth rate: (new subscribers − unsubscribes − bounced addresses removed) ÷ list size at the start of the period. A list that grows slowly but cleanly usually outperforms a fast one full of weak sign-ups.
- Click rate on a unique recipient basis for automations: for flows such as a welcome series, calculate per step and per cohort, because a message sent to everyone on day one and to a few on day ten is not comparable.
Whatever you choose, write the formula next to the chart. Most "our open rate fell" debates are really arguments about definitions.
Auditing your reports in five minutes
- Pick one past campaign and recalculate open rate, CTR and CTOR by hand from the raw counts.
- Compare with what your platform shows. If they differ, find out whether it divides by sent, counts total events or filters bots.
- Check whether your platform's "open" excludes machine opens; most do not fully.
- Confirm that complaint and bounce counts come from the same send as the engagement figures.
- Write down the definitions once, and use them for every report from then on.
Benchmarks: use them carefully
Industry benchmark tables are tempting but weak guides: they mix audiences, definitions and open-tracking inflation. The more useful comparison is your own campaigns over time with the same formulas. Two sanity thresholds are widely used:
- Complaint rate: below 0.1%, never reaching 0.3% (Gmail and Yahoo guidance).
- Bounce rate: many senders treat above about 2% as a sign that list cleaning is needed.
Small samples lie: use a confidence interval
A 25% open rate from 40 recipients is very uncertain; from 40,000 it is solid. A 95% confidence interval expresses that uncertainty. For example, 200 opens out of 1,000 delivered is 20.0%, but the true rate is plausibly anywhere from about 17.6% to 22.6%. When two campaigns differ by less than the width of their intervals, you cannot claim one is better. The calculator above shows the Wilson interval for every rate.
When you need to decide between two versions, use a significance test and sample-size plan instead of eyeballing percentages: see the email A/B test sample size guide.
Clicks are not immune to machines
Opens get the attention, but clicks can be inflated too. Corporate security gateways often follow every link in an incoming message to scan it for malware, which registers as a click within seconds of delivery, sometimes on every link including the unsubscribe link. Warning signs are clicks that arrive almost instantly, one recipient "clicking" every link in order, and clicks from the same IP ranges across many recipients. Most platforms filter the obvious cases, but you can add a second check: count a click as real only when it is followed by a site session or conversion, and compare that "verified click rate" with the raw CTR. A large gap suggests your numbers contain machine traffic.
Reporting template you can reuse
| Line | What to include |
|---|---|
| Audience | Segment name, sent, delivered, bounce rate |
| Engagement | Unique CTR and CTOR, with interval; opens flagged as directional |
| Outcome | Conversions, conversion rate, revenue per email |
| Health | Unsubscribe rate and complaint rate against your thresholds |
| Notes | Anything unusual: send time, list changes, tracking issues |
Calculating a Wilson interval yourself
NIST's handbook documents the Wilson method (also called Agresti–Coull) for the confidence interval of a proportion. With p as the observed rate, n as delivered emails and z = 1.96 for 95% confidence, the centre is (p + z²/2n) / (1 + z²/n) and the half-width is z·√(p(1−p)/n + z²/4n²) / (1 + z²/n). For 200 opens out of 1,000 delivered, p = 0.20 gives roughly 17.6% to 22.6%. Wilson behaves better than the simple "p ± z·√(p(1−p)/n)" formula when n is small or the rate is near 0% or 100%, which is exactly where email complaint and bounce rates live.
Common mistakes
- Mixing total and unique opens or clicks.
- Comparing open rates across ESPs with different denominators or bot filtering.
- Treating CTOR as a measure of subject-line performance; it measures how compelling the content is among openers.
- Ignoring tracking blocking: privacy tools can hide opens (but not clicks).
- Making decisions from tiny segments without intervals.
Frequently asked questions
How do you calculate email open rate?
Unique opens divided by delivered emails (sent minus bounces), expressed as a percentage.
What is the click-to-open rate formula?
CTOR = unique clicks ÷ unique opens. It shows how many people who opened also clicked.
Is bounce rate calculated on sent or delivered?
Bounce rate uses sent emails as the denominator: bounced ÷ sent. Delivered is sent minus bounced.
Why is my open rate so high?
Apple Mail Privacy Protection and some security scanners load tracking pixels automatically, inflating opens. Compare clicks and conversions instead.
What is a good spam complaint rate?
Below 0.1% is the common target, and Gmail and Yahoo ask senders to stay under 0.3%.


