Tracking Setup Guide
The Eye of Horus: protection, healing and royal power. It sees everything.
Credit every sale to the ad, email or page that earned it.
The chain every sale has to travel
A sale can only be credited if the source survives every hop between the first click and the payment. Most tracking breaks at one weak link, usually the form or the checkout. Walk the chain in this order and fix the first break you find.
- Link: every link you control carries UTM parameters.
- Page: the landing page reads those parameters and keeps them.
- Form: hidden fields write them onto the lead record.
- CRM: the contact stores first touch and last touch separately.
- Checkout: the purchase is tied to the same contact, with value and currency.
- Platforms: the ad platforms receive the conversion back, browser and server side.
One naming convention, used everywhere
Reports only add up if everyone tags the same way. Lowercase, no spaces, hyphens between words. Write this down once and share it with anyone who creates links.
| Parameter | Answers | Rule | Example |
|---|---|---|---|
| utm_source | Where did they come from? | The platform or sender | facebook, google, newsletter, youtube |
| utm_medium | What kind of traffic? | Pick from a fixed list only | paid-social, cpc, email, organic-social, referral |
| utm_campaign | Which push? | Offer + month | vsl-launch-2026-10 |
| utm_content | Which ad, email or link? | Creative or placement name | hook-pricing-v2, footer-link |
| utm_term | Which audience or keyword? | Ad set or keyword | lookalike-buyers, funnel-agency |
Your fixed medium list
paid-social, cpc, email, sms, organic-social, referral, partner, …Ready-made link templates
Meta ads (paste into the URL parameters field)
utm_source=facebook&utm_medium=paid-social&utm_campaign={{campaign.name}}&utm_term={{adset.name}}&utm_content={{ad.name}}
Meta fills the names in automatically, so name your campaigns, ad sets and ads with the same convention.
Google Ads (tracking template)
{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_term={keyword}&utm_content={creative}
Keep auto-tagging switched on as well, so the gclid is added next to your UTMs.
?utm_source=newsletter&utm_medium=email&utm_campaign=[sequence-name]&utm_content=[email-number]-[link-name]
Bio link and organic posts
?utm_source=instagram&utm_medium=organic-social&utm_campaign=bio-link
Your own
?utm_source=… &utm_medium=… &utm_campaign=… &utm_content=…Capture it on the lead
Add hidden fields to every form
utm_source, utm_medium, utm_campaign, utm_content, utm_term, gclid, fbclid, landing page URL and referrer. If your form tool can fill hidden fields from the URL, turn that on.
Keep the parameters past page one
Visitors browse before they convert, and the UTMs fall off the URL. Store them in a first-party cookie or local storage on the first visit and fill the hidden fields from there.
Store first touch and last touch
Two sets of fields on the contact. First touch is written once and never overwritten. Last touch is updated on every new conversion. You need both to see which channel starts sales and which one closes them.
Ask the buyer too
Add one open field to your booking or checkout form: "Where did you first hear about [brand]?" Self-reported answers catch podcasts, word of mouth and dark social that no pixel sees.
The events to send
Fire each event from the browser (pixel or tag) and from your server (Conversions API, enhanced conversions). Send the same event ID from both so the platform counts it once.
| Event | Fires when | Send with it |
|---|---|---|
| PageView | Any page loads | Nothing extra |
| Lead | Opt-in form submits | Email and phone (hashed), event ID |
| Schedule | A call is booked | Email, phone, event ID |
| InitiateCheckout | Checkout page loads | Product, value, currency |
| Purchase | Payment succeeds (from the payment webhook, not the thank-you page) | Value, currency, order ID, email, phone |
Test it before you trust it
- Click a tagged link in a private window and submit the form with a test email.
- Open that contact in your CRM: all five UTMs, landing page and click ID are filled in.
- Browse two more pages, then convert: the UTMs are still captured.
- Make a test purchase: the order is attached to the same contact with the right value.
- Check the platform event tool: one Purchase, not two, with browser and server both received.
- If checkout is on another domain, confirm the parameters cross over to it.
- Repeat the whole test after any change to forms, checkout or page builder.
Where tracking usually leaks
| Leak | Symptom | Fix |
|---|---|---|
| Redirects strip the query string | Lots of "direct" traffic | Pass parameters through every redirect and short link |
| Embedded forms in an iframe | Hidden fields empty | Pass the parameters into the embed URL |
| Purchase fired on thank-you page | Duplicate or missing sales | Fire from the payment webhook on the server |
| Mixed naming | "Facebook", "fb" and "facebook" as three sources | One convention, a shared link builder sheet |
| No event ID | Platform reports double the sales | Same ID from browser and server |
Want this built for you instead of by you?
Return to the vault