Skip to content
Cover illustration for GoHighLevel attribution reporting: first touch, latest touch, and what actually closed

GoHighLevel attribution reporting: first touch, latest touch, and what actually closed

GoHighLevel stores a first and a latest source on each contact, and its Lead Source report shows won opportunity value by source for one sub-account. To see revenue by campaign across clients, keep UTMs on the contact, record a won date and join opportunities to source outside GHL.

Jamie IsabelBy 7 min read

GoHighLevel can show won revenue by source for one sub-account, as long as the source was captured when the contact was created and every opportunity carries a value. To report it reliably:

  1. Capture the source on the event that creates the contact. Forms, surveys, calendar bookings, the chat widget and order forms record attribution, but only within the same session. Keep UTMs lowercase and consistent, because HighLevel treats them as case-sensitive.
  2. Give every opportunity a value and a won date. Revenue in HighLevel is the sum of won opportunity values. There is no documented won date field, so add a custom date field and set it with a workflow when the status changes to Won.
  3. Read one sub-account in the native reports. The Lead Source report shows lead count and value by status for each source. Opportunity widgets let you choose first or latest attribution.
  4. Pick a credit rule. Report first touch, latest touch, or both side by side. They answer different questions.
  5. Join outside GHL for anything bigger. Revenue by campaign across sub-accounts, next to ad spend or by qualified lead, needs contacts and opportunities exported and joined in a warehouse.

What GoHighLevel attribution records

HighLevel stores two sources on each contact. First attribution is the first recorded interaction. Latest attribution is the most recent one, and later recorded events, such as an order form submitted after the contact exists, overwrite it. Both are contact-level context, not a record of every touch before a deal closed.

HighLevel’s attribution source documentation lists the events that record a source: form and survey submissions, calendar bookings, chat widget submissions once contact details are entered, one- and two-step order forms, and supported third-party forms through external tracking. Everything else is labeled differently:

  • Calls, SMS and email land in the Others source.
  • Contacts added by hand are tagged CRM UI, and contacts from Zapier are tagged Third-Party.
  • A visit with no referrer and no tracking parameters is recorded as Direct Traffic.
  • For ad traffic, the form has to be submitted on the landing page that carried the UTMs, in the same session.

What the native reports show

The sub-account Attribution report summarizes revenue closed, opportunities won, total leads and sessions, with revenue over time. The Lead Source report breaks leads and their value down by status (open, won, lost and abandoned) for each source, with an N/A row for leads without one. That is the closest native view of won value by source.

Opportunity widgets in custom dashboards can use first or latest attribution, grouped by session source and medium. According to the Reporting FAQs, revenue is the monetary value of won opportunities, not payments received.

These reports work per sub-account. HighLevel does not document an agency-wide attribution or revenue-by-source report, so an agency comparing clients ends up exporting each location.

The model agencies actually need

A useful GoHighLevel attribution report is not one source column. It is a ladder from spend to revenue, and each rung answers a different client question.

First and latest source touches lead into a CRM opportunity.
QuestionWeak answerBetter report
Where did the contact come from?First or latest sourceFirst and latest source, plus landing page and click ID
Was the lead real?Raw contact countQualified lead rate, spam rate, duplicate handling, and disposition
Did it become pipeline?Lead count by sourceOpportunities, pipeline value, owner, and stage by source
Did it close?Closed deals by original source onlyWon deals and win rate by source, campaign, and sales cycle
What should we cut?Lowest CPLHighest cost per qualified opportunity and lowest source-to-win rate
A cheap lead source can become expensive once you measure qualification, pipeline, and win rate.

Why first touch alone breaks

First touch answers “What introduced this lead?” It is weaker at “What got this deal over the line?” A contact can arrive through Facebook, come back through Google search, book a call from a retargeting ad and close six weeks later after sales follow-up. A first-touch report gives the whole deal to Facebook.

First touch explains where the lead began. It does not prove which source created qualified pipeline or closed the deal.

The minimum fields to preserve

Source context has to be captured before the lead reaches the CRM. Once a contact exists without it, a dashboard can tidy labels but cannot recover the missing click.

Minimum attribution payload
-- campaign context
utm_source, utm_medium, utm_campaign, utm_content, utm_term
-- ad click identifiers
gclid, gbraid, wbraid, fbclid, msclkid
-- page and identity context
landing_page, page_path, visitor_id, session_id, ghl_contact_id
-- CRM outcome context
opportunity_id, pipeline_stage, owner, lead_status, won_date, won_value

Common failure modes to watch

  • “Others” eats the report. Calls, SMS, email and leads with no matching source all land outside the clean paid-search or paid-social buckets.
  • Every contact becomes a lead. Spam, duplicates, existing contacts and low-intent form fills inflate CPL and make campaigns look healthier than they are.
  • Thank-you pages double count. Shared thank-you pages and duplicate funnel setups create conversion counts that do not match Google Ads, Meta or the CRM.
  • UTMs do not survive to the form. A redirect, a second page or a new session between the ad click and the submission drops the source.
  • Sources mean different things across locations. If source fields, tags and custom fields differ between sub-accounts, cross-client reporting becomes spreadsheet work again.

How to report revenue by source

Revenue by source is a join: the opportunity’s value and won date on one side, the contact’s source fields on the other, and a rule that decides which source gets credit. An opportunity missing a value, a won date or a source falls out of the revenue column.

Showing first and latest touch side by side is often the easiest view to explain to a client, because the two answer different questions and often rank channels differently.

SourceLeadsOpportunitiesWonWon valueValue per lead
Google Ads120306$42,000$350
Meta Ads200243$18,000$90
Organic search80205$35,200$440
Referral40124$24,000$600
Illustrative: example values only, not client data. Value per lead is won value divided by leads.

Once won deals carry source context, the next step is sending those outcomes back to the ad platforms. The companion post on GoHighLevel offline conversions for Google and Meta covers that.

The agency reporting template

A client report should make the funnel visible without pretending every platform will agree. Start with this table and make every row filterable by source, campaign, location, pipeline, owner and date range.

LayerMetricDecision it supports
SpendSpend by source and campaignWhere budget went
Raw demandContacts or form leadsHow much volume the campaign created
Lead qualityQualified lead rateWhether the volume was worth chasing
PipelineOpportunity rate and pipeline valueWhich sources create sales conversations
RevenueWon deals, win rate, and revenueWhich campaigns deserve more budget
The report gets better as it moves down the funnel. The bottom rows are where budget decisions should happen.

Setup checklist before you launch spend

  1. Use one lowercase UTM naming convention for Google, Meta and every other paid source.
  2. Make sure the form, calendar, chat or order form that creates the contact sits on the landing page the ad points to.
  3. Keep first-touch and latest-touch context separate instead of overwriting one source field.
  4. Add a won date field and a workflow that sets it when an opportunity is marked Won.
  5. Define qualified lead, spam, duplicate, booked call, no-show, opportunity and closed-won in writing.
  6. Trace one test lead from ad click to GHL contact to won opportunity before the first client report.

For the rest of the stack, pair this with a clean UTM system and the reconciliation rules in why your numbers never match.

Frequently asked questions

How do I see revenue by source in GoHighLevel?

For one sub-account, use the Attribution report and the Lead Source report. The Lead Source report shows lead count and opportunity value by status for each source, so won value can be read by source. Revenue there is the sum of won opportunity values, not payments received. For revenue by campaign across several sub-accounts, or next to ad spend, export contacts and opportunities and join them to source in a warehouse.

Does GoHighLevel record the date an opportunity was won?

HighLevel does not document a won date field on opportunities. A common workaround is a custom date field that a workflow sets when the opportunity status changes to Won, so revenue can be reported by the month it closed.

Sources and references

Updated October 19, 2026

Find what your tracking misses in about 10 seconds.

Run a Free Tracking Scan on your site and see every gap we find.