← All articles
END-TO-END ATTRIBUTION FLOW Ad click GCLID + UTMs GTM persists UTMs CRM lead record created Qualification status + value Offline import into Google Ads Smart Bidding retrained on value No native CRM integration required at any step
Attribution

Solving Google Ads attribution with disconnected sales processes and no CRM link

Andy Hendricks Aug 19, 2026 7 min read

When a client sells exclusively through third-party distributors, "how is the Google Ads campaign performing?" is an impossible question to answer.

I ran into this while managing Google Ads for a B2B equipment manufacturer. The campaigns were straightforward lead generation, equipment inquiries from contractors and other trades businesses. However, managing the account was not straightforward at all, for three reasons that compounded each other:

I was reporting off GA4 form-fill conversions and nothing else. When the client asked whether the campaigns were actually producing customers, I didn't have an answer.

Why this breaks down

Campaign UTMs assume a short, single-session journey. Google Ads' auto-tagging (and manual UTMs) attach parameters to the landing page URL. If the conversion happens on that same page, or within the same session via a form, you're in a good position for attribution. However, if the visitor has to navigate through several more pages, a product configurator, then a locator tool, then an external distributor site or a phone call, those parameters have to be deliberately carried forward. By default, they aren't. Every internal link click is a fresh page load with no guarantee the query string survives, and once a visitor leaves your domain for the distributor's, it's gone and your CRM will attribute every lead as Direct Traffic.

Enhanced conversions and offline conversion imports need a matched, valued event to send back. Both features work the same way mechanically. Google needs a conversion action tied to a GCLID (or hashed first-party identifiers, for enhanced conversions) and, ideally, a monetary value. If the only conversion event you have is a website form submission, that's the only thing you can feed back. If the real qualification event happens off-site, days or weeks later, in a system Google Ads has never talked to, you have nothing to train your algorithm.

GA4 conversions alone can't train value-based bidding. Target ROAS and Target CPA strategies bid toward whatever signal you give them. If that signal is "form submitted," the algorithm will get very good at generating form submissions, which is not the same as getting good at generating qualified leads or closed revenue. Without a downstream value signal, you're optimizing for a high funnel outcome and can't prove success beyond it.

Fix 1: Persisting UTMs through the site journey with GTM

The first problem was structural: campaign source data was getting lost before it ever reached a form. The product selector and distributor locator meant a visitor could be four or five pages deep, with multiple internal navigations, before submitting an inquiry. None of those internal links were carrying the original UTM parameters forward.

I worked with a web developer to implement UTM persistence through Google Tag Manager, following this approach from Analytics Mania:

  1. On page load, capture the UTM parameters from the URL (or from a first-party cookie/storage if they were captured on an earlier page in the same visit).
  2. Store them, typically in a cookie or in localStorage, so they persist across page views within the session, not just the current URL.
  3. Use a custom JavaScript variable and a set of triggers to append the stored UTM values to internal links and, critically, to the hidden fields of the lead form, regardless of how many pages the visitor navigated through first.
  4. Make sure whatever CRM sync exists (form handler, Dynamics web-to-lead, etc.) is actually mapped to pull those hidden fields into lead records.

Once this was live and validated, campaign source data started reliably showing up on lead records in Dynamics. That was the first point at which I could say, with certainty, "this lead came from this campaign," instead of relying on GA4's surface level reports.

Fix 2: Building an internal lead qualification step before distributor handoff

Persisted UTMs solved which traffic source the lead came from, but leads were still going straight to third-party distributors, who had no reason or obligation to report qualification or close data back to the client or myself.

To close that gap, we worked with the client to add a lightweight internal step before distributor routing. Someone on the client's side made brief contact with the inbound lead, helped with initial product questions, and confirmed basic fit before handing it to a distributor. That same team then ran a short follow-up process afterward, checking back to find out whether the lead had actually received a quote and, eventually, whether it closed.

The gap between "lead" and "revenue" is a process gap, not a tracking gap.

If you're running paid media for a client who doesn't control the final sale, the fix is rarely more tracking. You need a process to capture what happened between "lead" and "revenue," and if the client's current process doesn't produce that, no pixel will solve it.

Fix 3: Manual offline conversion upload for enhanced conversions

With qualification and close data now living in Dynamics alongside campaign source data, I could build the piece that actually fed back into Google Ads: a manual offline conversion import.

Since Dynamics had no native Google Ads integration, this meant a recurring export-and-upload process rather than an automated sync:

  1. Export qualified and closed-won records from Dynamics, filtered to the reporting period, including the fields needed for matching and valuation: GCLID (captured as part of the UTM persistence work, stored on the lead record), conversion date/time, conversion action name, and a value (for a quoted lead, an estimated value; for closed-won, actual deal value).
  2. Format the export to match Google Ads' offline conversion import spec: correct column headers, date formatting, and separate conversion actions set up in Google Ads for "Qualified Lead" and "Closed Won" so each stage could be tracked and valued distinctly rather than collapsed into one generic conversion.
  3. Upload manually through the Google Ads conversions interface (or the Google Ads API/Sheets connector, if you want to reduce the manual step). I started manual to validate match rates and data quality before automating anything.
  4. Check match rates after each upload. GCLID-based matching only works if the click ID made it all the way from ad click to the CRM record intact, which is exactly what Fix 1 and Fix 2 were built to solve. Low match rates here are usually a sign that UTM/GCLID persistence broke somewhere upstream, not a problem with the offline import itself.

After this, Google Ads had real quote and close values to bid toward on a value-based strategy, meaning the algorithm could start distinguishing between a campaign that generated a lot of form fills and a campaign that generated a lot of quoted, closeable opportunities.

End to end process

  1. Ad click: GCLID and UTM parameters attached to landing page.
  2. GTM captures and persists UTM parameters (and GCLID) across the multi-step site journey.
  3. Lead form submission passes persisted parameters into the CRM (Dynamics), attached to the new lead record.
  4. Internal qualification step updates that same record with qualified, quoted, or closed-won status and value, before or alongside distributor handoff.
  5. Recurring export from Dynamics, filtered to qualified/closed records, formatted for Google Ads' offline conversion import spec.
  6. Manual upload into Google Ads as distinct conversion actions (Qualified Lead, Closed Won), each carrying real value.
  7. Smart Bidding strategies retrained on actual downstream value instead of top-of-funnel form fills.

Takeaways