All case studies
Case Study

Google Ads Attribution Rebuild: Clinic Case Study

How I rebuilt Google Ads attribution for a multi-location medical practice: bookings keep their source, calls carry a source, no double counting.

Multi-location clinic·August 1, 2026·7 min read
Table of contentstap to expand

A multi-location US medical practice came to me unable to answer one question: which campaign actually brings in bookings and calls? The Google Ads spend was real, but the analytics under it had rotted into a state where no number could be trusted. I audited the stack, tore out the dead weight, and rebuilt the measurement so that bookings keep their source and count once, and phone calls finally carry a source. Here is exactly what was broken and what I did about it.

Quick answer

MeasurementBeforeAfter the rebuild
Online booking conversionLanded in Direct / Unassigned, source lostKeeps its original source, counts once per session
Phone calls in GA4Most had no sourceEvery tracked call carries a source and campaign
Google Business Profile / MapsCollapsed into DirectSplit out by a custom channel grouping
GTM / GA4 tagsDouble-firing, leftover Universal Analytics, hardcoded IDsDeduplicated, legacy removed, clean references
Owner's viewNo trustworthy reportLooker Studio dashboard: bookings and calls by source and campaign

I did not invent a lift number for this one, and I would be suspicious of anyone who did after a job like this. The honest, verifiable result is that the data now says something true. Bookings retain their source and are no longer counted twice, and calls that used to arrive anonymous now come with a campaign attached.

The problem: which campaign brings real bookings and calls?

The owner was spending on Google Ads across several locations and getting reports that contradicted each other. The Ads interface claimed conversions. GA4 disagreed. The call-tracking tool showed a third number. When three systems tell you three different stories, you stop making decisions and start guessing, which is an expensive way to run paid search.

Google Ads
GA4
Call tool
Illustrative: three tools reporting three different conversion counts for the same campaigns, the problem in one picture.

The root cause was not one bug. It was years of accumulated cruft in GA4 and Google Tag Manager, plus two measurement gaps that quietly erased the source of the two things that actually make this business money: online bookings and phone calls.

What was broken

The audit of GTM, GA4, and the call-tracking setup turned up a familiar pile of problems. This is what accumulates when a container gets edited by several hands over a few years and nobody ever removes anything.

  • Double-firing tags. The same conversion event fired from more than one tag, so key actions were counted twice. Any rate calculated on top of that was wrong before it started.
  • Leftover legacy Universal Analytics. UA tags and a hardcoded property ID were still sitting in the container long after UA stopped collecting, adding noise and confusion.
  • The booking conversion lost its source. The confirmation step ran in a context that started a fresh GA4 session with no referrer, so bookings filed as Direct or Unassigned. The campaign that earned the booking got no credit.
  • Calls had no source. A large share of phone calls arrived in GA4 with no source at all, because the call-tracking tool was never wired to push a call event with its attribution into GTM.
  • Google Business Profile and Maps collapsed into Direct. That traffic arrives with a weak referrer, and GA4's default channel grouping dumped it into Direct, hiding a real and separate acquisition channel.

None of this is exotic. It is the default end state of a tag setup that nobody prunes, and it is exactly the mess that good Google Ads conversion tracking is supposed to prevent.

What I rebuilt

I worked in one direction: make every conversion true, then make it legible. The rebuild went in this order.

  1. Removed the dead and duplicate tags. I pulled the leftover Universal Analytics tags, the hardcoded IDs, and the duplicate conversion tags. One action, one tag, one event. This alone stopped the double counting.
  2. Rebuilt the booking conversion to keep its source. I captured the original source (gclid and referrer) at first touch and carried it through to the confirmation step, so the booking event fires with the campaign that earned it instead of starting a blank session.
  3. Scoped the booking event to fire once per session. A session-scoped condition and a booking identifier used only for de-duplication mean a refresh or a back-button never inflates the count.
  4. Wired call source from the call-tracking tool. I connected the call-tracking tool into GTM so a completed call pushes an event with its source into GA4. Calls stopped arriving anonymous.
  5. Built a custom channel grouping. A rule for Google Business Profile and Maps traffic pulls it out of Direct into its own channel, so local discovery stops masquerading as people typing the URL from memory.
  6. Delivered a Looker Studio dashboard. The owner now sees bookings and calls broken out by source and campaign in one place, instead of reconciling three tools by hand.

The booking event that now fires carries only what measurement needs and nothing a medical practice must protect:

{
  "event": "booking_confirmed",
  "booking_id": "b_8f3a2c",        // used only to de-duplicate, never a patient identifier
  "value": 180,                     // a service price band, not a bill and not PHI
  "currency": "USD",
  "source_preserved": true,         // gclid / referrer captured at first touch
  "session_scoped": true            // fires once per session
}

That last point matters more here than in most industries. GA4 is not HIPAA compliant and never will be, so the entire rebuild was designed to keep protected health information out of analytics. Only a source, a timestamp, and a non-identifying value ever leave the system, any phone identifier that has to move between tools is hashed, and no patient data is persisted anywhere in the tracking layer. You can measure marketing honestly without ever putting a patient into a tool that was not built to hold one. If you later want to push real booking value back into Ads, the same discipline carries into an offline conversion tracking setup where an anonymous click id plus a value is the only thing that travels.

The result

Counted by the accountPaid visits
0117234350467NovDecJanFebMarAprMayJunfix
Schematic on synthetic data. The account reported far more conversions than there were paid visits until the fix in April, after which the counted line drops to meet reality.

The deliverable was not a bigger number. It was a trustworthy one. After the rebuild:

  • Online bookings retain their traffic source and count once per session, so the campaign that earned a booking gets the credit and nothing gets double-counted.
  • Tracked phone calls carry a source and campaign instead of vanishing into an anonymous, sourceless majority.
  • Google Business Profile and Maps traffic shows as its own channel rather than inflating Direct.
  • The owner has a Looker Studio dashboard that answers the original question directly: which campaigns produce bookings and calls, by source.
Default groupingCustom grouping
Direct
Organic
Paid Search
Referral
Business Profile
Schematic on synthetic data: same total sessions, different story. Business Profile only exists as a channel once you build the rule, and Direct stops absorbing it.

From there, the practice can actually manage spend. You cannot optimize toward a conversion the system keeps mislabeling, and you certainly cannot optimize toward a call it never saw. Fix the measurement first and every budget decision after it gets easier.

If your paid search reports argue with each other and you have quietly stopped trusting any of them, that is the symptom I fix. Send me your GTM container and a screenshot of your GA4 conversions, and I will tell you within a call whether it is a cleanup or a rebuild, and what the conversion tracking setup would involve before either of us commits to anything.

Tags

google-ads-attributionconversion-trackingga4gtmcallrail

Frequently asked questions

Why do my Google Ads conversions show up as Direct or Unassigned in GA4?

The traffic source is usually being lost between the click and the conversion event. If the booking or thank-you step runs on a different page, subdomain, or embedded widget, GA4 can start a fresh session with no referrer and file the conversion as Direct or Unassigned. Preserving the original source through the funnel fixes it.

How do I stop a GA4 conversion from being counted twice?

Scope the conversion so it can only fire once per session, and remove any duplicate tags that fire the same event. Double counting almost always comes from two tags firing on the same action or a tag that fires on every page view instead of the single confirmation step.

Why does GA4 not show a source for my phone calls?

GA4 only knows about calls you send it. Without a call-tracking tool wired into GTM to push a call event with its source, phone conversions arrive with no campaign attached, which is why a large share of calls land with no source at all.

Why does Google Business Profile traffic show as Direct in GA4?

Maps and Google Business Profile links often arrive without a clean referrer, so GA4's default channel grouping collapses them into Direct. A custom channel grouping with a rule for that traffic pulls it back out so it stops hiding inside Direct.

Is GA4 HIPAA compliant for a medical practice?

No. GA4 is not HIPAA compliant and Google will not sign a BAA for it. The workaround is to keep protected health information out of analytics entirely: send only a source, a timestamp, and a non-identifying value, and hash any identifiers that have to move between systems.

How long does a Google Ads attribution rebuild take?

For a single practice with GA4, GTM, and a call-tracking tool already in place, the audit and rebuild is usually a two to four week engagement. Most of the time goes into verifying every conversion end to end rather than the config changes themselves.

Want this loop closed on your account?

I connect your EHR, booking system, and calls to Google Ads so it counts patients who actually showed up. HIPAA-conscious, fixed price, verified in the account.

More case studies