Playbooks
Why Marketing Reports and GoHighLevel Revenue Never Match
Reports disagree because they count different events, dates, identities, attribution windows, and revenue definitions. Reconcile definitions before reconciling numbers.
The short answer
Reports disagree because they count different events, dates, identities, attribution windows, and revenue definitions. Reconcile definitions before reconciling numbers.
What the failure looks like
Advertising platforms claim one conversion total, HighLevel shows another opportunity value, payments show a third amount, and accounting closes a fourth. Each report can be internally correct while answering a different question.
Diagnose before changing anything
Select several affected records and trace them from the original event through every system, workflow, owner, and report. Record timestamps and identifiers. A global fix based on one screenshot can hide the true boundary and create a second failure.
- Write the exact event and date used by each report
- Distinguish leads, opportunities, bookings, sales, payments, and recognized revenue
- Compare gross, net, recurring, refunded, and tax treatment
- Trace identity across click, contact, opportunity, invoice, and customer IDs
- Review timezone and late-arriving updates
- Reconcile a small transaction sample end to end
The most likely root cause
Teams use the word revenue for pipeline value, closed opportunity value, checkout amount, collected cash, and accounting revenue. Platforms also use different attribution windows and identities. The discrepancy is a data-contract failure before it is a dashboard failure.
Design the repaired system
Publish metric definitions and source-of-truth systems. Give every major event an immutable timestamp and identifier. Store transaction IDs on opportunities where appropriate. Use accounting or the authoritative operating system for realized revenue, and treat advertising attribution as a modeled view.
Implementation sequence
Make the smallest change that produces a testable improvement. Use synthetic records first, then a controlled production sample. Document the original and final behavior so future administrators can distinguish design from accident.
- Create a metric dictionary
- Choose authoritative systems by event
- Map identifiers across systems
- Normalize timezone and currency
- Reconcile representative records
- Build exception reports for missing links
- Publish known timing and attribution differences
Measure whether the repair worked
Track reconciliation variance by cause: missing ID, duplicate record, timing, refund, tax, currency, attribution, manual adjustment, or unknown. The unknown category should shrink as contracts improve.
Failure modes to prevent
Avoid forcing all systems to display the same number, overwriting historical source, treating opportunity value as cash, and adjusting dashboards manually without recording the underlying exception.
Operational handover
Assign an owner, alert path, review cadence, and rollback instruction. The repair is complete only when the operating team can detect recurrence without waiting for a customer complaint or a month-end report.