A UTM scheme people follow
Attribution breaks first at the naming stage: "Facebook", "facebook", "fb" and "Meta" in the same account. We fix the vocabulary before anything technical. Source is the platform (google, meta, email, referral), medium is the type (cpc, social, newsletter), campaign is a short slug with the month (implants-mar26). Links are generated from one shared sheet so nobody types them by hand.
Capturing on the first page
GoHighLevel funnel pages capture UTM parameters from the URL automatically and pass them into forms on that page as hidden fields. For pages on other platforms, a small script stores the parameters in a cookie or local storage on the first view and populates hidden form fields on any later page, so a visitor who reads three pages before filling the form still carries the original campaign.
Persisting to the contact
On form submission the workflow writes the UTMs into custom fields: First Touch Source, First Touch Medium, First Touch Campaign. These fields are set only if empty. A later visit from a retargeting ad writes to a separate "Last Touch" set, so both stories are available and neither overwrites the other. The field names follow the naming convention.
Last-touch attribution flatters retargeting and brand search, which only reach people who already knew you. First touch shows which campaigns find new customers. Report both, but decide spend on first touch.
Through the calendar
Many booked-call funnels skip the form and go straight to the calendar. The GoHighLevel calendar widget accepts UTM parameters in its URL and stores them on the appointment and contact, so pass them through from the page. Without this step, every direct-to-calendar booking shows as "direct" and the best-performing campaign looks like it produced nothing.
Reporting on revenue
With first-touch fields on every contact and revenue on won opportunities, the report is a simple group-by: revenue, wins, bookings and leads by campaign, monthly. Build it in GoHighLevel's reporting for a quick view, or in the nightly export from custom reporting for the full picture including refunds. This one table ends most arguments about where the marketing budget should go.
Common gaps
- Links shared by hand without UTMs (WhatsApp, bios, printed QR codes). Generate every link from the sheet.
- Redirects that strip parameters. Test each domain redirect with a tagged URL.
- Phone calls from ads. Use call tracking numbers per campaign that write the source to the contact.
- Forms on third-party tools that don't pass hidden fields. Replace them or add the storage script.
Key takeaways
- Agree a naming scheme for source, medium and campaign, lower-case, and generate links from a shared sheet.
- Capture UTMs on the first page view and store them in hidden fields on every form.
- Write them to permanent first-touch fields on the contact and never overwrite.
- Pass them through the calendar so bookings, not just form fills, carry attribution.
- Report revenue by first-touch campaign monthly. That is the number that decides budgets.