The most common attribution mistake is starting with the reporting layer. Companies buy a BI tool, try to connect it to their ad platforms, and wonder why the numbers still do not add up. Attribution is a plumbing problem. You need the pipes right before you can trust what flows through them. This is the sequence, in the correct order.

Start with GA4, not with Looker

GA4 is the event layer, the neutral system that captures user behaviour without being a paid media platform trying to claim credit for it. Every meaningful user action becomes a GA4 event with its session context preserved: source, medium, campaign, landing page, and the GA4 client_id that will become your join key downstream. The GA4 configuration is the first thing to get right: custom dimensions for first_touch_source (persisted in a cookie, not the session, first touch changes when the user comes back, session touch does not), consistent event naming taxonomy, and conversion event configuration that matches what you actually care about.

GTM is the event orchestrator

Google Tag Manager is where you instrument the behaviour. The GTM web container fires GA4 events and manages the cookie that stores first-touch attribution. The GTM server container receives those events, enriches them with server-side data (IP address, user agent, fbclid), and forwards them to Meta CAPI. Configure in sequence: (1) GA4 Configuration tag with user_id when available, (2) First-touch source cookie set on the first pageview and never overwritten, (3) Form submit triggers that capture GA4 client_id from the _ga cookie as a data layer variable, (4) Server-side CAPI forwarding for all conversion events with the enrichment payload.

CRM is the system of record

The CRM contact record needs three attribution fields that most setups are missing: GA4 client_id (from the _ga cookie, captured as a hidden field on every form), first_touch_source (from the persisted cookie, not the session UTM), and last_touch_campaign (from the session UTM at form submission). Implementation is a hidden field problem, when a form renders, JavaScript reads the cookie values and populates hidden fields that submit with the form. This data flows into the CRM contact record and stays with the contact through every deal stage. Without it, your CRM knows when someone converted. With it, your CRM knows where they came from.

Looker closes the loop

With GA4 session data and CRM deal data sharing a GA4 client_id join key, Looker can answer questions neither system can answer alone. Which campaigns generated which pipeline value. What is the CPL per campaign when cost is measured against deals, not form submissions. What is the average deal velocity by lead source. What is the LTV:CAC ratio by acquisition channel. The Looker model has two core tables: sessions (from GA4 via BigQuery export) and deals (from CRM export), joined on client_id. Everything else is a derived metric. The first version of this took four weeks to build. It replaced six separate agency reports and the monthly attribution argument.