analytics

Conversion goals and funnels that tell the truth

Most funnel reports flatter you. Here is how step ordering, attribution windows and revenue rounding quietly inflate the numbers, and how to define goals that survive scrutiny.

A funnel report is the most persuasive chart in analytics and the easiest one to build wrong. It looks like a measurement and it is usually a definition — and the definition is doing more work than the data.

The three ways a funnel flatters you

It counts steps that were not reached in order. The naive implementation counts everyone who saw the checkout page as having reached the checkout step, whether or not they ever saw the pricing page before it. Somebody who arrived at checkout from a bookmark, wandered back to pricing and left is recorded as having progressed through your funnel in the intended direction. The fix is to require each step to have occurred after the previous one, within the same visit.

It counts across visits. If a visit on Monday hits step one and a visit on Friday hits step three, a funnel that ignores visit boundaries records a completed journey. That was two separate intentions, days apart, and treating them as one flow overstates completion — often by a lot.

It uses the wrong denominator. A "62% conversion rate" from pricing to signup is meaningless without knowing whether the denominator is everyone who saw pricing, everyone who saw pricing in a visit that started at the homepage, or everyone who saw pricing after the funnel began. All three are computable; only one matches the sentence.

An honest funnel counts a visit at step n only if that visit reached every prior step, in order, within the same visit. It produces smaller numbers than the naive version. Those numbers are the ones that change when you improve the page.

Defining goals that survive contact with the site

Prefer events to paths. A goal defined as "visited /thank-you" breaks the day someone bookmarks the page, shares it, or refreshes after a failed payment. A goal defined as an event your own code fires on a confirmed transaction is true by construction.

Where a path goal is unavoidable, decide explicitly whether it matches exactly or by prefix, and remember that query strings and trailing slashes will not match unless you normalise them.

Fire events from the outcome, not the interaction. A click on "Subscribe" is not a subscription. The event should fire where the outcome is confirmed — after the server accepted the payment, not when the button was pressed. Otherwise you are measuring intent and calling it conversion.

One goal per outcome, not per page. Ten goals that all mean "someone contacted us" produce ten small numbers nobody can add up. Name the outcome, not the mechanism.

Revenue: the detail that quietly corrupts totals

If your goals carry money, store amounts as whole minor units — cents, pence — as integers. Never as floating point.

Floating point cannot represent most decimal fractions exactly. Individually the error is invisible; summed across a year of transactions it drifts, and a revenue total that disagrees with your payment processor by a few cents invites a reconciliation nobody can finish. Integers in minor units sum exactly, forever.

Two more revenue rules worth stating:

  • Record the currency with the amount. A goal that totals mixed currencies into one number is producing a figure with no unit.
  • Decide about refunds before you need to. Either fire a negative event or accept that your total is gross revenue, and label the chart accordingly. Silently gross figures presented as net is how analytics loses the finance team's trust permanently.

Attribution, honestly

With cookieless measurement, attribution is within-visit. The referrer or campaign that started the visit gets the credit for anything that happens during it. That is last-touch attribution scoped to a session, and it is worth stating plainly rather than implying more.

It genuinely is less than multi-touch attribution across weeks. It is also more honest than most multi-touch models, which distribute credit according to a weighting somebody chose — often the weighting that makes the channel with a budget look effective.

Whichever model you use, write down which one it is and put it next to the chart. Most arguments about attribution are actually arguments about two people reading two different models off the same number.

Segment before you conclude

An overall conversion rate is an average of populations that behave nothing alike. Mobile converts differently from desktop. Branded search converts differently from a cold social visit. A funnel that looks flat overall often contains one segment doing well and one doing badly, and the average conceals both.

The most common real finding in funnel analysis is not "step two is broken" — it is "step two is broken on mobile, from paid traffic", which is a fixable problem rather than an ominous statistic.

What you need underneath

Funnels of this kind are computed from row-level data, not from aggregate counters. Aggregates can tell you 400 people saw pricing and 180 saw checkout; they cannot tell you whether they were the same people in the right order. That means:

  • row-level event storage must be switched on for the site;
  • funnels reach back only as far as your retention window for that data;
  • the retention window is a real decision with a privacy dimension, not a default to leave alone. Aggregate totals can be kept indefinitely because they describe nobody; row-level data carries a pseudonymous identifier and should not be.

A checklist for a funnel you can defend

  1. Every step is an event fired at a confirmed outcome, or a normalised path.
  2. Steps are ordered, and order is enforced within a single visit.
  3. The denominator is stated on the chart.
  4. Revenue is stored as integer minor units, with a currency.
  5. The attribution model is written down beside the number.
  6. The funnel is read segmented, not only in aggregate.
  7. The date of any definition change is annotated, because a redefined funnel is a new funnel and its history is not comparable.

Common questions

What makes a conversion funnel report inaccurate?

Three things, usually: counting steps that were reached out of order, counting steps across separate visits days apart, and using a denominator that does not match the claim being made. An honest funnel counts a visit at a step only if it reached every prior step, in order, within the same visit.

Should conversion goals be based on page URLs or events?

Events, wherever possible. A URL-based goal breaks when the page is bookmarked, shared or refreshed, and it fires on intent rather than outcome. An event fired by your own code at the point the outcome is confirmed — after the payment succeeded, not when the button was clicked — is true by construction.

How should revenue be stored in analytics?

As integers in minor units — cents or pence — with the currency recorded alongside. Floating point cannot represent most decimal fractions exactly, and the error accumulates across a year of transactions until the analytics total disagrees with the payment processor.

Can cookieless analytics measure conversion funnels?

Yes, within a visit. Steps are stitched using the same-day identifier, so a funnel completed in one session is measured exactly. What it cannot do is attribute a conversion on Friday to a visit on Monday, because the identifier deliberately expires each day.