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_source
  • utm_medium
  • utm_campaign
  • utm_term
  • utm_content

Conditional workflow branching

  1. GoHighLevelNew lead arrivesThe UTM values are saved to the contact.
  2. GoHighLevelCheck the sourceThe workflow branches on where the lead came from.
  3. GoHighLevelTag by channelFacebook leads get fb lead; Google leads get google lead.
  4. GoHighLevelNotify the ownerThe owner is told about the new lead and its source.
Workflow architecture as built in the sandbox account.

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.