Reporting and lead-source attribution
Five custom UTM contact fields and conditional workflow branching in GoHighLevel, so each lead is tagged by source and the owner sees where leads come from.
- Sandbox build, demo data
GoHighLevel. Last updated .
- Build spec5UTM fields stored on every contact
- Build spec2channel tags: Facebook and Google
- Build spec1owner alert per new lead, with its source
The problem
Home-service owners spend on Facebook and Google ads but often can't tell which channel produced which job. Without source data on the contact, reporting is guesswork.
What I built
Five UTM contact fields
Each new contact stores the campaign details it arrived with:
utm_sourceutm_mediumutm_campaignutm_termutm_content
Conditional workflow branching
- GoHighLevelNew lead arrivesThe UTM values are saved to the contact.
- GoHighLevelCheck the sourceThe workflow branches on where the lead came from.
- GoHighLevelTag by channelFacebook leads get
fb lead; Google leads getgoogle lead. - GoHighLevelNotify the ownerThe owner is told about the new lead and its source.
What it makes possible
- Pipeline and dashboard reports filtered by channel, built on the tags and fields above.
- Owner and marketing views that use the same data, so totals can be checked against the source.
- Demo opportunities were seeded safely for the dashboards, with each row's result logged.
Before using this for a live business
- Measure the current process first, so any improvement can be compared with a real baseline.
- Agree which accounts, data and workflows the business owns. I work through a role-based team invite.
- Confirm third-party costs, such as GoHighLevel, n8n and messaging plans.
- Test normal, duplicate, missing-data and failure cases with the team's real rules.