Three agencies, three dashboards, zero agreement on what drove pipeline. Google Analytics said Google drove the conversion. Meta reported it too, because the user had clicked a Meta ad three days earlier. The CRM attributed it to the sales rep who followed up. Every platform was using last-click attribution, for itself. This is how one attribution chain ended that argument.
Why dashboards disagree by design
Attribution disagreement is not a bug. It is the expected output of every platform measuring itself. Google Analytics uses session-based attribution. Meta uses a 7-day click, 1-day view window. Your CRM uses the last activity before close. None of these are wrong in isolation, they are each measuring something real. The problem is that without a neutral arbiter, every channel claims 100% credit and the budget conversation becomes political. Which channel gets cut is decided by who argues most convincingly, not by which spend generated revenue.
Building the single source of truth
The solution is one chain, not one tool. GTM captures the full session context: source, medium, campaign, fbclid, gclid, landing page. GA4 receives events with UTM parameters preserved at every step of the funnel. The CRM contact record is updated at lead capture with the GA4 client_id (pulled from the _ga cookie as a hidden form field) and the first-touch UTM parameters. At every deal stage, MQL, SQL, Closed Won, the CRM record retains those original attribution fields. Looker joins the CRM pipeline data to GA4 session data on the shared client_id. One place, one answer: which campaign influenced which revenue.
What changes when the number is neutral
When the CMO and the CEO look at the same dashboard showing the same numbers, the channel-credit argument stops immediately. Budget decisions become traceable. "We should double down on Meta" goes from an opinion to a provable claim. "Google is not performing" stops being agency defensiveness and starts being a conversation about what Google is being asked to do. Teams stop defending their channel and start optimizing for the pipeline metric everyone can see. The political overhead drops to near zero.
What the implementation actually takes
This takes 3–4 weeks to implement correctly. The hardest parts in order: CRM field mapping, getting GA4 client_id into the contact record reliably across form providers requires testing every form submission path. UTM parameter consistency, most companies have 12 different campaign naming conventions accumulated over years of agency changes; you need to standardize before the data is joinable. Looker join logic, the session-to-deal relationship is many-to-many and requires deliberate modeling decisions about what "attribution" means in your business context. Every hour spent here replaces months of dashboard arguments.