Beyond Opens & Clicks: Better Metrics for Email & SMS Success

Why opens are folklore now (and what to measure instead)

Apple’s Mail Privacy Protection (MPP) turned “open rate” into a ghost story you keep telling to feel better. Plenty of messages get “opened” by privacy proxies. Plenty of others get read without ever loading the pixel. In SMS, taps are closer to real intent, but even there, carriers and customers are watching behavior over time, not one-off spikes.

If you still center your weekly health on opens and raw clicks, you’re staring at shadows. We need metrics that connect to money, habit, and trust—metrics that respect the fact that retention is a system, not a subject line.

Here’s the shift:

  • From “did they open?” → Did the message create value? (Revenue per Recipient, add-to-cart rate, conversion, AOV, and post-touch repeat behavior)
  • From “did they click?” → Did we change behavior? (30-day second-purchase rate, reorder interval, subscription save rate)
  • From “did they get it?” → Did inboxes welcome it? (complaint rate by domain, inbox placement proxies, SMS complaint/opt-out)
  • From “did we send enough?” → Are we building permission? (subscriber retention, quiet-hours compliance, discount reliance trending down)

The five North Stars for messaging

Think of these as the load-bearing beams of your email/SMS OS:

  1. Revenue per Recipient (RPR) — money per head, split by flows and campaigns, email and SMS. If one number survives, make it RPR.
  2. 30-day Second-Purchase Rate — the heartbeat of retention. If your messages don’t help new buyers become repeat customers, they’re furniture, not infrastructure.
  3. Subscriber Retention Rate — the inverse of churn for your list. A steady or rising list with stable complaint/unsubscribe rates is permission compounding, not burning.
  4. Inbox Placement & Complaint Rate — the quiet multipliers. Placement goes down slowly, then all at once; complaints tell you when it’s starting.
  5. Discount Reliance — % of repeat orders using sitewide codes. If this goes up while RPR holds, you’re buying loyalty you didn’t earn.

Add two situational dials:

  • Reorder Interval (P1→P2) for consumables/subscriptions
  • Subscription Save Rate at cancel intercept (reason-based saves beat blanket codes)

Definitions you won’t have to apologize for

  • RPR (Revenue per Recipient): total attributable revenue ÷ recipients. Report holdout-adjusted RPR for emails with a randomized control.
  • 30-day Second-Purchase Rate: share of first-time buyers who place a second order within 30 days after exposure to a message or flow.
  • Subscriber Retention Rate: (active subscribers at end − new subscribers) ÷ active subscribers at start. Measure email and SMS separately.
  • Complaint Rate: spam complaints ÷ delivered. Keep per-domain rolls (Gmail/Yahoo/Outlook) to catch localized trouble.
  • Inbox Placement Rate: % of messages that land in the inbox (vs. Promotions/Spam) for a panel/seed test; otherwise use proxy signals (below).
  • Discount Reliance: % of repeat orders that include a sitewide discount code; report by cohort and channel touched.

Deliverability & placement: measuring what inboxes actually did

Seed tests can help, but they’re not fate. Placement is a rolling reputation at the subscriber + sender-domain + mailbox-provider level. Treat it like oxygen: invisible until it’s missing, vital always.

Practical placement proxies

  • Complaint rate by domain — if Gmail complaints tick from 0.02% to 0.08%, stop and ask why.
  • Reply rate on plain-text/system emails — unexpected drops often correlate with Promotions/Spam placement.
  • Read/engaged time in panels (where available) — consistent declines across similar content suggest placement, not creative.

Deliverability dials to show weekly

  • Dedicated domain and DMARC state (yes, this belongs on the dashboard)
  • Engagement bands (0–30/31–60/61–90) and whether sunset segments are suppressed
  • List-unsubscribe header present on all marketing messages

If placement starts to drift, throttle promos, send helpful lifecycle only for 48–72 hours, and review template HTML for “image-only” anti-patterns. Placement recovers with patience and consistency; it breaks fast with panic sends.

SMS: engagement without noise (and what carriers are really watching)

SMS is the nudge, not the novel. Taps are stronger than email clicks, but carriers judge programs by consent quality, cadence, content, and complaint behavior. Measure SMS on retained reach and effect on second purchase, not just CTR.

SMS-specific metrics that matter

  • RPR (SMS) — per-recipient revenue for flows and campaigns; report holdout-adjusted where possible.
  • Opt-in Health — net list growth after opt-outs/blocks; 30-day retained subscribers %.
  • Opt-out/Complaint Rate — per send; if ≥1% regularly, cadence/content is wrong or consent is weak.
  • Quiet-hours compliance — % of sends inside allowed windows; violations correlate with blocks and churn.
  • Two-way responsiveness — time to first agent reply on HELP/keyword flows; a strong human loop reduces save-related churn.

Add a Snooze 7 days link and honor preferences (content_theme = deals/drops/updates). The fastest way to grow SMS reach long-term is to provide control. The fastest way to lose it is to ignore consent.

Attribution that won’t embarrass you: holdouts, incrementality, and uplift

If you can’t prove lift, you’re guessing. That’s fine on day one; it’s irresponsible on day 100. Keep randomized controls on the messages most likely to influence revenue decisions—save touches, recommendation emails, SMS cart nudges.

Minimum viable incrementality

  • Message-level holdouts — 10–20% suppressed, reported weekly; don’t turn off during big weeks.
  • Audience-level holdouts for flows — reserve a 5–10% control for full funnels where you change structure or cadence.
  • Uplift for incentives — perk/no-perk split inside the same risk band to see if discounts create new orders or just steal from next week.

Multi-touch attribution can tell good stories; holdouts tell the truth. Use both—but let truth lead.

Cohorts & coverage: see the system, not the send

Email and SMS work best when they’re not fighting each other. Build a weekly coverage grid by cohort (new vs. repeat; high-value vs. mid-value) and ask: who did we help? who did we harm? where did we double-tap?

Coverage grid (example)

Cohort Email SMS Push Key Dial
New (0–30 days) Post-purchase #2–#4 Replenish nudge Delivery-today P2-rate
Repeat (31–90) Goal-based recs Cart rescue only Back-in-stock RPR
VIP/High LTV Early access Heads-up only Stock guarantee Discount reliance

The weekly dashboard (finance will read it; creative will use it)

Five tiles. Two notes. Ten minutes. That’s it.

  1. RPR — email flows, email campaigns, SMS flows, SMS campaigns (4 bars); trend vs. last four weeks.
  2. 30-day Second-Purchase Rate — for new buyers touched by messaging in last 7 days; cohort chart.
  3. Deliverability & Trust — complaint rate by domain; unsubscribe rate; SMS opt-out rate; inbox placement proxy (seed/panel if available).
  4. Subscriber Retention — 30/60/90-day retained email/SMS subscribers; net list growth vs. new opt-ins.
  5. Discount Reliance — repeat-order code usage %, trend (target: down 20–40% over 90 days).

Underneath, two bullets: What changed, What we’ll test next. Strategy becomes a habit when you hold yourself to ten minutes of truth every week.

Formulas & SQL you can use today

Revenue per Recipient (RPR)

-- RPR for a campaign (email)
SELECT
  campaign_id,
  SUM(attributed_revenue) / COUNT(DISTINCT recipient_id) AS rpr
FROM email_sends
WHERE send_date BETWEEN CURRENT_DATE - INTERVAL '7 days' AND CURRENT_DATE
GROUP BY 1;
    

30-day Second-Purchase Rate

WITH first_buyers AS (
  SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY 1
),
touched AS (
  SELECT DISTINCT s.customer_id
  FROM messages s
  JOIN first_buyers f ON f.customer_id = s.customer_id
  WHERE s.send_date BETWEEN CURRENT_DATE - INTERVAL '7 days' AND CURRENT_DATE
),
p2 AS (
  SELECT o.customer_id
  FROM orders o
  JOIN first_buyers f ON f.customer_id = o.customer_id
  JOIN touched t ON t.customer_id = o.customer_id
  WHERE o.order_date BETWEEN f.first_order_date AND f.first_order_date + INTERVAL '30 days'
  GROUP BY 1
)
SELECT
  COUNT(*)::float / (SELECT COUNT(*) FROM touched) AS p2_rate_30d;
    

Subscriber Retention Rate (email)

WITH window AS (
  SELECT DATE_TRUNC('week', CURRENT_DATE) AS week_start
),
base AS (
  SELECT
    (SELECT COUNT(*) FROM email_subscribers WHERE active AND created_at < week_start) AS start_active,
    (SELECT COUNT(*) FROM email_subscribers WHERE active AND created_at < week_start + INTERVAL '7 days') AS end_active,
    (SELECT COUNT(*) FROM email_subscribers WHERE created_at BETWEEN week_start AND week_start + INTERVAL '7 days') AS new_subs
  FROM window
)
SELECT (end_active - new_subs)::float / NULLIF(start_active,0) AS subscriber_retention_rate
FROM base;
    

Discount Reliance on Repeat Orders

WITH orders_ranked AS (
  SELECT
    customer_id, order_id, order_date, discount_code,
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn
  FROM orders
  WHERE refunded_flag = FALSE
),
repeat_orders AS (
  SELECT * FROM orders_ranked WHERE rn > 1
)
SELECT
  SUM(CASE WHEN discount_code IS NOT NULL THEN 1 ELSE 0 END)::float
  / COUNT(*) AS discount_reliance_repeat
FROM repeat_orders
WHERE order_date >= CURRENT_DATE - INTERVAL '90 days';
    

Tooling & instrumentation: how to get clean signals

  • ESP/Orchestration: Klaviyo or Braze for flows/campaigns + persistent holdouts.
  • SMS: Attentive or Postscript for quiet hours, 10DLC, and consent at scale.
  • Warehouse: Snowflake/BigQuery with dbt to model orders, events, and cohorts.
  • Reverse ETL: Hightouch/Census to sync risk/CLV segments back to ESP/SMS for routing.
  • Deliverability: DMARC aligned, dedicated sender domain, and a seed/panel service for placement checks.
  • Experimentation: Built-in A/B + bandits for creative framing; holdouts for incrementality.

Instrumentation checklist

  • UTMs on every link (email and SMS) with consistent source/medium/campaign taxonomy.
  • Deep links that land on the same decision you made in the message (e.g., Rebuy/Repeat experience).
  • Link health tests and post-send checks (redirects, tracking parameters preserved).

How the right metrics change real decisions

1) Calendar & cadence

When RPR is split across flows and campaigns, bad cadences become obvious. If flows pay the rent and campaigns drag, lighten campaigns; focus on proof-first content in post-purchase and second-purchase flows. Your “send more” reflex will stop once you see flows vs. campaigns on one chart.

2) Creative framing

Bandit tests on “proof-first vs. offer-first” become objective when you grade by RPR and P2-rate, not opens. Expect proof-first to win for onboarding and winback; perk-first wins are rarer and usually shorter-lived.

3) Promo discipline

Discount reliance trends will push you toward loyalty progress (one-line headers), early access, and shipping promises instead of blanket codes. If reliance trends up, your margin is whispering; listen.

4) SMS restraint

SMS opt-out rate + RPR will show you that “one good nudge” beats three loud ones. Snooze links and quiet hours shrink complaint curves in a week.

5) Deliverability culture

Complaint rate by domain on the dashboard shifts conversations from “send louder” to “send better.” Placement is a license; treat it like one.

90-day roadmap: from opens to outcomes

Phase 1 (Weeks 1–3): Baseline & buy-in

  • Publish the five dials (RPR, P2-rate, Subscriber Retention, Placement/Complaints, Discount Reliance).
  • Audit deliverability (dedicated domain, DMARC, engagement bands, sunset policy).
  • Instrument UTMs and link health; set up message-level holdouts on save/recommendation touches.

Phase 2 (Weeks 4–6): Fix the spine

  • Rebuild post-purchase and second-purchase emails with proof-first modules; mirror decisions in SMS.
  • Add a loyalty progress header globally; measure CTR vs. control.
  • Stagger SMS and email by 15–30 minutes; enforce quiet hours on profile.

Phase 3 (Weeks 7–9): Learn faster

  • Bandit tests on framing (proof vs. perk) graded by RPR and P2-rate.
  • Add a 5–10% flow-level holdout to your most impactful journeys and report weekly.
  • Implement “Snooze 7 days” in SMS; track opt-out changes.

Phase 4 (Weeks 10–12): Prove & operationalize

  • Freeze the dashboard; document definitions; publish a 2-page “How to read messaging metrics.”
  • Write playbooks: “If complaint rate > 0.08% at Gmail, then <do X>.”
  • Schedule a 10-minute weekly review; make it a ritual, not a meeting.

Pitfalls (and how to avoid them)

  • Open-rate worship. Keep it off the front page. If you must show it, label it “directional only.”
  • Blended revenue claims. “Attributed” without holdouts is belief, not proof. Add controls.
  • Flow blindness. Reporting only campaigns hides the 80% of value that flows produce. Split RPR.
  • Image-only templates. They look great in Figma and bad in inboxes. HTML text, alt text, and AAA contrast matter.
  • Quiet-hour violations. It’s not “worth it”; it’s a carrier block in waiting. Respect attention.
  • Over-segmenting without power. If a cohort is too small to show signal, aggregate or stop testing.

FAQ

What should replace “open rate” on our primary dashboard?

Revenue per Recipient (flows & campaigns for email and SMS), 30-day second-purchase rate, inbox placement/complaints, subscriber retention, and discount reliance. That’s your calling card.

How do we measure inbox placement if we don’t have a panel?

Use complaint rate by domain, read-time proxies (if available), and reply rate on system emails. Combine with seed tests during major changes. No single proxy is perfect; together they tell the story.

What’s a healthy unsubscribe rate?

Context matters, but direction matters more: for targeted sends, <0.3% is typical; spikes following content or cadence changes deserve a pause and a review.

How do we keep SMS from cannibalizing email?

Make SMS the nudge (one line, one tap) and email the narrative (proof, comparison, modules). Stagger sends and recency-gate channels for 15–30 minutes.

How often should we review the dashboard?

Weekly. Ten minutes. Two bullets: what changed, what we’ll test next. Make it a ritual everyone respects.

Related resources

Back to blog