Why I Stopped Judging A Popup By Its Email Capture Opt-In Rate

Published

Email capture opt-in rate is the number almost every popup gets judged by. It's the wrong number: a popup with a great opt-in rate can still be adding subscribers who never place an order, and opt-in rate alone will never tell you that.

Why Opt-In Rate Is The Number Everyone Optimizes

Opt-in rate is easy to measure. One number, visible in every popup tool's dashboard, updates in real time as traffic comes through.

It's also easy to test against. Change the offer, change the copy, change the timing, and the number moves fast enough to call a winner within days.

That speed is exactly the problem. A popup can win on opt-in rate by attracting more people who sign up out of curiosity, not purchase intent, and the test will call that a success every time.

An A/B test run for a week usually ends with a clear winner on opt-in rate. It rarely runs long enough to check whether the winning variant's subscribers ever bought anything, because that check needs weeks, not days, and most popup tools don't offer it at all.

What Opt-In Rate Actually Hides

A 12% opt-in rate sounds strong next to an 8% one. Neither number says anything about what happens to those subscribers after they join the list.

Some capture sources bring in people already close to buying, like an exit-intent popup on a product page. Others bring in people just browsing, like a generic homepage popup offering a discount to anyone who shows up.

Both can post the same opt-in rate. Only one of them is actually worth the list space, and opt-in rate can't tell you which.

The Real Check: Revenue Per Signup By Capture Source

Opt-in rate measures the form. What I actually care about is what each signup is worth afterward, split by where they came from.

Klaviyo's API doesn't support filtering profiles by a custom property directly. The actual path is a segment per capture source, built once in Klaviyo's UI, then pulled by ID through the API.

const BASE = "https://a.klaviyo.com/api";
const HEADERS = {
  Authorization: `Klaviyo-API-Key ${API_KEY}`,
  revision: "2024-10-15",
};

async function getSegmentProfileIds(segmentId) {
  const res = await fetch(
    `${BASE}/segments/${segmentId}/relationships/profiles`,
    { headers: HEADERS }
  );
  const json = await res.json();
  return json.data.map((p) => p.id);
}

That returns the profile IDs behind one capture source's segment. The second half pulls each profile's Placed Order events and sums the order values out of them.

async function getOrderValue(profileId, metricId) {
  const filter = encodeURIComponent(
    `and(equals(profile_id,"${profileId}"),equals(metric_id,"${metricId}"))`
  );
  const res = await fetch(`${BASE}/events?filter=${filter}`, {
    headers: HEADERS,
  });
  const json = await res.json();
  return json.data.reduce(
    (sum, e) => sum + (e.attributes.event_properties.value || 0),
    0
  );
}

async function averageValuePerSignup(segmentId, metricId) {
  const ids = await getSegmentProfileIds(segmentId);
  const values = await Promise.all(
    ids.map((id) => getOrderValue(id, metricId))
  );
  const total = values.reduce((a, b) => a + b, 0);
  return total / ids.length;
}

Running that per segment turns "which popup won" into a real comparison: average order value per signup, measured against each other instead of just who clicked the form the most.

It's the same instinct behind splitting Klaviyo flow revenue from campaign revenue: a single blended number hides exactly the split that actually matters.

What Changed Once I Started Checking This

On one client account, the homepage popup had the best opt-in rate of the three sources running. It also had the lowest revenue per signup once I actually checked.

The exit-intent popup on product pages converted fewer visitors into signups. Every signup from it was worth roughly three times more than a homepage signup, measured over the same 90-day window.

Nobody had done anything wrong before this. The homepage popup was doing exactly what it was built to do: maximize opt-ins. It just wasn't the source worth putting budget behind.

What To Do About A High Opt-In Rate, Low Revenue Source

Don't kill a high-opt-in-rate source immediately. Check revenue per signup first, over a window long enough for a new subscriber to actually place an order, not the first 48 hours.

If a source checks out low on revenue per signup, the fix is usually targeting, not removing it. A generic homepage popup converting curious browsers needs a different offer than one aimed at someone already deep in a product page.

A browser who hasn't looked at a product yet is a different person to sell to than one leaving a cart. The homepage popup's offer should reflect that it's talking to someone earlier in the decision, not repeat the same discount every other popup on the site is already offering.

List size still matters, but only alongside what that list is actually worth. A smaller list of subscribers who convert beats a larger one that doesn't, every time I've actually checked both numbers side by side.

Same root issue as flows that look done but stall on revenue: everyone's watching the easy number instead of the one that actually explains what's happening.

Want a real read on what your capture sources are actually worth?

I manage full Klaviyo accounts, including the reporting question of which signup sources are actually paying for themselves.