Vibrantix.
Launch Tracking · Client J · Webinar 1
This launchMeta · 17 adsJul 2026
One webinar · nine days
€5,050 in ads became ~€87,000 contracted
~€51,000 of it collected in cash. Six enrolments from sixteen calls, off one live webinar.
Ad spend
€5,050
Registrations
~190
Calls held
16
Enrolments
6
Cash collected
~€51,000
Contracted
~€87,000

What this page is

It is one screen that follows a single person from the ad they clicked all the way to the money they paid. That sounds obvious. No tool in the standard coaching stack does it.

Meta knows about the click and the opt-in. The CRM knows about the call. Stripe knows about the payment. None of them share a key, so nobody can answer the only question that matters: which ad produced the person who actually paid?

So the page does one job. It stamps every registration with the ad that produced it, then joins that to what happened on the call. Once those two facts live on the same row, everything else on this screen is just a query.

It took an afternoon. It replaces the entry tier of a tool that costs $459 a month.

The client's live registration page: dark and gold, a qualifying eyebrow reading 'Voor ondernemers die meer dan €10K per maand draaien', and a reserve-my-seat button
The page it tracks. Note the line above the headline: “for entrepreneurs already doing more than €10K a month.” That is a filter, sitting in public, on the page every one of these ads pointed at.

How we built it

Four steps. None of them are clever, and that is rather the point.

Stamp the ad onto the click

Meta swaps these tokens per ad automatically. It goes in the URL parameters field at ad level, once, and then every click carries its own origin.

utm_source=facebook&utm_medium=paid_social
&utm_campaign={{campaign.name}}
&utm_content={{ad.name}}
&utm_term={{adset.name}}
&utm_placement={{placement}}

Store it with the person, not the session

On opt-in, read the parameters off the URL and write them to the registrant's row. This is the step everyone skips, and it is why their data dies at the form.

// registrant row
{ email, name,
  utm_content:  // the ad name
  utm_term:     // the ad set
  variant:      // which page they saw
  qualified:    // from the step-2 answer
  created_at }

Join it to what happened on the call

Calls and enrolments live in the CRM and the tracker, not the pixel. Match on email and the row now carries the outcome as well as the origin. This join is the entire product.

registrations  LEFT JOIN  calls    ON email
               LEFT JOIN  enrolments ON email

Group by ad and read it

Now cost per registration, cost per call and cost per enrolment are all one GROUP BY away. That is the whole dashboard.

SELECT utm_content,
       count(*)                        -- registrations
       count(call_id), count(enrol_id) -- the invisible part
FROM joined GROUP BY utm_content
The hard part was never the code. It was deciding that cost per lead is the wrong number and being willing to look at a more expensive one.

Where the ad platform stops looking

Meta can report the top two rows. It has no idea the bottom four happened, because they happen on calls and in a CRM.

ImpressionsMeta reports this
29,588
RegistrationsMeta reports this
62 tracked
€19.20 ea
Meta's vision ends here
Calls booked & heldinvisible to the platform
16
Enrolmentsinvisible to the platform
6
37.5% of calls
Contractedinvisible to the platform
~€87,000
Cash collectedinvisible to the platform
~€51,000
Every optimisation decision most coaches make is made on the top two rows. Meta will happily find you cheaper registrations forever. It cannot tell you that six of them enrolled.

All 17 ads, as the page sees them

Sorted by registrations. This is the part the platform can see, and it is still the part almost nobody reads properly. Note how badly click-through rate predicts anything.

AdSpendImpr.Clicks CTRCPCRegsShare Cost/reg
Ad static 8€323.839,002250 2.78%€1.3018
€17.99 top
Ad static 1€255.066,119175 2.86%€1.4613
€19.62
Hook 5 body 2€191.223,389100 2.95%€1.9112
€15.94 best video
Hook 5 body 1€91.943,150419 13.30%€0.224
€22.99 CTR trap
Ad static 5€61.691,48539 2.63%€1.583
€20.56
Hook 3 body 2€20.6139325 6.36%€0.823
€6.87 cheapest
Ad static 9€22.233946 1.52%€3.713
€7.41
Ad static 3€88.852,622143 5.45%€0.622
€44.43 worst cost
Hook 3 body 1€26.3869094 13.62%€0.282
€13.19
AD static 4€30.0272533 4.55%€0.911
€30.02
Hook 4 body 2€12.842394 1.67%€3.211
€12.84
Hook 2 Body 1€15.5538852 13.40%€0.300
cut
ad static 6€11.492088 3.85%€1.440
cut
Ad static 7€10.242615 1.92%€2.050
cut
Hook 4 body 1€10.1221814 6.42%€0.720
cut
Hook 2 Body 2€9.371519 5.96%€1.040
cut
Ad static 2€8.711541 0.65%€8.710
cut
Produced registrationsSpent, produced nothing
Look at Hook 5 body 1. A 13.3% click-through rate, the best in the account, and clicks at 22 cents. On any normal dashboard it is the star. It produced four registrations at €22.99, worse than almost everything above it. Hook 2 Body 1 did 13.4% and produced none at all. Cheap clicks are not a result. They are how you get an account full of people who will never buy.

The creative behind the numbers

Nine statics and three video ads ran in this account. Every row in the table above is one of these. The statics did the heavy lifting: about 40 of the 62 registrations came from them, not video.

Static ad: 'How can I make my business 3 to 5 times bigger?' with three crossed-out answers and one green tick Static ad asking about 60-hour weeks Static ad about 90 percent having tried everything Static ad referencing 100 million in client revenue Static ad showing three named client results Static ad about stalled revenue Second stalled-revenue static ad Static ad telling a client's dropshipping story Static ad for the masterclass, shot by a pool Still from the first video ad Still from the second video ad Still from the third video ad
These are the assets, not the answers. Nothing about looking at them tells you which one produced an enrolment — the two best-looking ads in this set include one that produced 18 registrations and one that produced none. That is the entire argument for the table above.

What it changed

Four decisions came out of this screen, and all four were the opposite of what the ad platform would have suggested.

DecisionWhat the page saidWhat a CPL dashboard would have said
Which creative to scale Static 8 and Hook 5 body 2. Real volume, under €18 a registration. Hook 5 body 1 and Hook 2. Cheapest clicks in the account.
Which to kill Six ads with spend and zero registrations, plus static 3 at €44 each. Keep them. Their CTR looked fine.
Is €19.20 a registration too much? No. Six enrolments make it the cheapest acquisition on the account. Yes. Cut spend and chase a cheaper lead.
Did the launch work? €5,050 in, ~€87,000 contracted. Cannot answer. Stops at the opt-in.
Honest note, on the page on purpose: the cash figure has not been reconciled against Stripe yet, and the €87,000 is contracted, which includes payment-plan balances not yet paid. Two different numbers. Most people quote the bigger one and call it revenue.
Client anonymised. Ad-level figures are the full 17-ad export from the tracked webinar campaign, Windsor.ai pull of the Meta account, 12 Jul 2026: €1,190.15 spend, 62 pixel-tracked registrations, 29,588 impressions. Launch totals (~€5,050 spend, ~190 registrations) span the full launch window and all sources, which is why they are larger than the single tracked campaign. Calls, enrolments and revenue come from the client's own tracker, not the pixel. Cash not yet audited against Stripe. Page screenshot captured 29 Aug 2026.