Every step, priced

A funnel tool that knows what the traffic cost, and an ad report that knows what happened after the click. They are the same question asked twice.

01

shipping

Funnel analytics joined to ad spend

Steps from pages or events
Match a step by URL pattern or by a named event. No cap on how many steps a funnel has.
Cost on the drop-off itself
Each step carries what a completion through it cost, alongside how many people made it.
Segmented by what bought them
Source, medium, campaign, creative, device, country, resolved once at entry so a cross-device journey isn't counted twice.
Priced to the single ad
The thing you actually switch off is a creative, so cost per conversion goes down to the ad. The report says which level the money matched at, and an account-level match is a tagging finding, never dressed up as precision.
Compared against a previous period
Same funnel, two windows, the difference in points rather than in vibes.
Watched across a pause
Stop spending on a source and the report counts conversions over equal windows either side of the stop. Two counts and a date. No model, no claim about cause, and a pause too short to read is withheld rather than hedged.
02

next

Why they left, and where

Form-field abandonment
Which field they stopped at. Field names and timings only, never what they typed.
Heatmaps scoped to a step
Attached to the funnel step that lost them, rather than floating free of the funnel.
Rage clicks, dead clicks, errors
Tied to the point in the journey where the money leaks.
03

planned

The evidence layer

Session replay
Watch the sessions that dropped at a step. Masked by default, opt-in per field, and last on the roadmap for a reason: it carries the most risk to your visitors.

shipping

The post-purchase
survey

A one-question survey on your conversion page asks how they heard about you. You write the answer list, and there is no free text box. The answers land beside the click data, and the gap between the two is the report.

Someone who names Google when no click was seen points at tracking loss, an ad blocker or a stripped parameter. Someone who names a podcast never produced a click at all. Every other tool adds those two together and calls the sum unattributed. We keep them apart, because one is a problem you can fix and the other is money working where clicks cannot see.

Independent estimates put the share of traffic hidden by ad blockers at 15 to 30%, and it applies to every analytics script, ours included. The survey is the first number we can put on that hole for your site specifically, rather than quoting somebody else's range. The method is written up in full on how we measure.

shipping

Spark Ads and
Partnership Ads

TikTok Spark Ads and Meta Partnership Ads run from a creator's own handle with your budget behind them. The industry calls that paid amplification, and it mostly gets reported in views. Here each creator's ads sit on your funnel and carry a cost per conversion, exactly like a campaign.

One rule holds this feature up. A creator's name comes from the platform or it stays blank. We never guess a handle out of an ad title, because a per-creator report that names the wrong person is worse than an anonymous row, and the row is still useful anonymous: creator-format ads against brand-handle ads is a whole finding on its own.

live

Who is on the site, now

Every visitor the script sees, placed by the region the request came from and coloured by the source that paid for them. Watching a campaign go live and land somewhere is the fastest way to know the tag is working, long before any funnel has enough data to report on.

  • Meta
  • Google Ads
  • Direct
  • Organic

illustrative: invented visitors, not live data

assistant

It reads the
funnel with you

An assistant that says which step deserves attention and why, and that helps you define a funnel in the first place from the pages and events your site already emits.

We nearly did not build this. Generated commentary on numbers is usually unfalsifiable, and a measurement tool that hands you confident prose you cannot check has spent the only thing it had. So the constraint came first and the feature second.

It does no arithmetic

Every figure it may use is calculated by the funnel engine first and handed over as a fixed list. It chooses which ones matter and how to say them. It never works one out.

Every number is checked after

Its answer is scanned and each figure matched against what the engine produced. A mechanical check on the output, rather than a hopeful instruction in a prompt.

Refused, not caveated

State a figure we did not compute and the whole answer is discarded rather than shown with a warning. A hedged wrong number is still a wrong number on your screen.

It also declines when there is too little traffic to say anything, rather than producing a confident reading of eleven visitors. And it never sees your visitors: it receives the computed funnel totals and nothing else, no event rows and no identifiers.

The script is the risky part.
So it is the audited part.

Zero dependencies

Nothing in the browser bundle but our own code. Every dependency would be somebody else's compromise becoming yours.

Pinned and hashed

Versioned, immutable releases with a published SHA-384. Pin it with subresource integrity and a swapped file simply won't run.

Personal data denied by default

Query parameters are an allowlist, the URL fragment is dropped, and raw addresses are never stored. Anything that looks like a token is scrubbed twice.

Connects to

Ad platforms review the tools that read their data, and some of those queues take weeks. So this list says which side of the queue each connection is on, because a logo wall that implies everything works today would be the first dishonest thing on this site.

  • Meta Conversions API
  • Google Analytics 4
  • Google Search Console
  • Stripe
  • Meta Adsin review
  • Google Adsin review
  • Google Enhanced Conversionsin review
  • TikTok Adsin review
  • TikTok Events APIin review
  • Microsoft Advertisingin review
  • Shopifyplanned

In review means the connector is built and tested against the platform's documented API, and is waiting on that platform's access approval, a queue we can join but can't hurry. Read-only wherever read-only will do. The Stripe connection asks for a restricted key rather than full account access, because nothing here needs to write to your payments.

Sign Up For Beta