TL;DR

  • Four metrics, in order: cohort size, enrollment rate, reactivation rate, revenue attributed.
  • The attribution window is 14 days - not 30, not 60. Longer windows let you take credit for purchases that would have happened anyway.
  • Always run a holdout. 10% of the cohort gets no messages. Their reactivation is your baseline. Your campaign's lift is above that baseline.
  • Exclude the "happy path" from your denominator - if someone was already scheduled to return, do not count them as a dormant win.
  • Coming Q2: App-ening's Revenue Recovery Dashboard computes all four automatically, per cohort, with holdout logic built in.

Most re-engagement campaigns get reported with a single vanity metric - "our win-back had a 22% response rate!" - and then nobody asks the follow-up questions. How many of those responders would have come back anyway? What was the revenue net of the discount? What was the cost per recovered customer? Without those answers, you cannot tell a good campaign from a bad one, and you definitely cannot improve it.

This post is the measurement framework we walk every customer through. Four metrics, defined precisely, with the attribution logic that separates real recovery from wishful thinking. If you take one thing away: no holdout, no real ROI.

Metric 1: Cohort Size

Cohort size = the number of contacts that met your dormancy criteria on Day 0 of the campaign

cohort_size = count(contacts where last_activity_at < now() - dormancy_threshold_days)

This is the simplest metric but the easiest to misreport. The three gotchas:

Typical SMB numbers: dormant cohort is usually 20-40% of total contacts, depending on how aggressive your dormancy threshold is. If your cohort is under 10%, your threshold is too loose. If it is over 60%, your customer base is in serious trouble and re-engagement is only a band-aid.

Metric 2: Enrollment Rate

Enrollment rate = share of the dormant cohort that actually received message 1

enrollment_rate = messages_delivered / cohort_size

Sounds like it should be 100%. It is not. Real enrollment rates range from 65% to 90% because of:

If your enrollment rate is under 80%, something operational is broken - fix it before optimizing the message. We see customers chase a 2% lift in message copy while sitting on a 25% enrollment gap. That is backwards.

Metric 3: Reactivation Rate

Reactivation rate = share of the enrolled cohort that had a qualifying event within the attribution window

reactivation_rate = contacts_with_qualifying_event / enrolled_cohort

This is where most teams go wrong. Two questions you have to answer precisely:

What is a "qualifying event"? For retail, it is a completed purchase. For services, it is a completed booking (not just "I will come in" - an actual showed-up appointment). For B2B, it is a meeting held or a deal advanced to next stage. The rule: it has to be an event that produces revenue or clear revenue intent. A read receipt is not reactivation. A reply is not reactivation. A click is not reactivation.

What is the attribution window? 14 days from enrollment. Not 30, not 60, not "any time in the next quarter." Fourteen days is the sweet spot: long enough to capture the buying cycle for most SMB verticals, short enough that you are not claiming credit for purchases caused by something else.

A longer window looks flattering and is dishonest. If you set the window to 60 days, some of your reactivations are just customers who were going to come back in their normal cadence. You did not recover them - you discounted their next purchase.

The Holdout Group (Non-Negotiable)

This is the part teams skip and it is the part that actually tells you whether the campaign worked. Before you send the first message, randomly assign 10% of the cohort to a holdout - they get no messages at all. Fourteen days later, measure their reactivation rate too.

true_lift = reactivation_rate(sent) - reactivation_rate(holdout)

Example: your sent group reactivates at 18%. Your holdout reactivates at 6%. Your true lift is 12 percentage points. Without the holdout, you would report "18% reactivation rate" and pat yourself on the back. With the holdout, you realize one-third of your "recovered" customers were always coming back - and you gave them all a discount. That is margin you did not need to spend.

Yes, holding out 10% feels like leaving money on the table. It is not. It is buying you the only honest number in the entire campaign.

Get Real Numbers Before You Commit

A Revenue Recovery Audit shows you your dormant cohort, your likely reactivation rate, and what a single campaign could recover - using your actual contact data.

Get Your Free Audit

Metric 4: Revenue Attributed

Revenue attributed = sum of gross revenue from qualifying events within the attribution window, minus the discount cost

revenue_attributed = sum(qualifying_event_revenue) - sum(discount_value)

Three rules:

  1. Subtract the discount. If you gave 15% off to drive the reactivation, the campaign cost that 15%. Do not report gross revenue as if the discount were free.
  2. Net out the holdout baseline. incremental_revenue = revenue_sent - (sent_cohort_size / holdout_size) × revenue_holdout. This is your true dollar impact.
  3. Only count events within the window. A reactivation that happens on day 30 is not part of this campaign's attribution - even if the customer mentions the message in their order notes.

This is also where you earn the right to talk about campaign-level ROI. Take your incremental revenue, divide by the total discount cost plus the operational cost of running the campaign, and you have a number you can compare across campaigns, quarters, and channels.

Common Measurement Mistakes

Every one of these is a real pattern we see in SMB campaigns:

The Dashboard You Actually Need

All four metrics need to be visible side-by-side, filterable by cohort and campaign, with the holdout comparison built in. Spreadsheets work for one campaign. By your third, you need instrumentation.

App-ening's Revenue Recovery Dashboard (launching Q2 2026) computes cohort size, enrollment rate, reactivation rate, and revenue attributed automatically - with the 14-day attribution window and holdout logic pre-wired. Every re-engagement sequence enrolls 10% into a holdout by default, so you never have to remember. The dashboard shows per-sequence performance, per-cohort breakdown, and a rolling month-over-month recovered-revenue number you can put in your monthly review.

Until that ships, the work is manual but doable. Start by picking one campaign, defining the four metrics precisely, holding out 10%, and reporting the incremental number at day 14. Once you have done it once, the second campaign is trivial. It is the discipline that matters, not the tooling.

The One Number Your Team Should Watch

If you can only track one metric, track monthly incremental recovered revenue. It is the output of all four inputs above, netted against your holdout, summed across every re-engagement campaign you ran in the month. Every other metric is an input to this one.

Put it on your monthly dashboard next to new-customer revenue. When recovered revenue starts rivaling acquisition revenue - and for most SMBs with a two-year-plus customer base, it should - you have a different business than the one you thought you had. That is the point of doing this right.

Related reading: the reactivation journey template for the campaign mechanics, and win-back offer design for what to put in message 3.

See Your Recoverable Revenue - No Math Required

Our free Revenue Recovery Audit analyzes your contact base, estimates your dormant cohort, and projects how much you could recover - with the math and the holdout logic already done.

Get Your Free Audit

Designed for: ecommerce, salons, gyms, and 60+ more.