Automation & Analytics

Attribution tracking that ties ad spend to real bookings

Last-click in Google Analytics is not enough when the conversion is a phone call or a booked job. How last non-direct-click attribution, dataLayer UTMs, and CRM closed-loop reporting actually work.

Muhammad Jareer · September 11, 2026 · 5 min read

If the conversion happens on a phone call, a booking form, or a job that closes days later, Google Analytics last-click will mis-credit the sale. KeenCraft implements last non-direct-click attribution with dataLayer capture of UTM parameters and referrers, then writes that source onto the CRM record so ad spend can be tied to real bookings and invoices.

A trades business can spend five figures a month on Google Ads and still not know which campaign paid for which job. The form says 'contact us.' The phone rings from a missed-call widget. The invoice is raised three weeks later in a different tool. Analytics reports a conversion. The CRM reports a job. The two numbers never match.

That gap is not a reporting preference. It is how companies keep buying the wrong keywords. KeenCraft ran into it on a parking marketplace rebuild (PARKees) and again while building a multi-tenant CRM for trades. The rest of this article is the model we actually ship.

Why last-click lies to service businesses

Last-click is fine when the product is a SaaS checkout on the same domain as the ad landing page. It breaks when:

  • The customer researches on mobile, then books on desktop by typing the brand name.
  • The conversion is a phone call, not a form submit.
  • The sale closes in a CRM days or weeks after the first visit.
  • Staff create the booking record by hand and leave the source field blank.

Direct traffic then absorbs credit it did not earn. Paid search looks weaker than it is, or stronger than it is, depending on how cookies and call tracking were set up. Operators make budget decisions on that fiction.

Last non-direct-click, in operational terms

Last non-direct-click means: ignore pure direct visits when a known campaign or referrer already exists for that person. If someone clicks a Google Ad on Tuesday, comes back via bookmark on Thursday, and books on Thursday, the booking still belongs to the ad.

On PARKees, that model was implemented with dataLayer capture of UTM parameters and referrer data. The important part is not the Google Tag Manager checkbox. It is that the first-party site writes a durable source onto the session and then onto the booking.

What you have to capture on every landing

  • utm_source, utm_medium, utm_campaign, utm_content, utm_term when present.
  • The HTTP referrer when UTMs are absent (organic, partner, marketplace).
  • gclid / wbraid / gbraid for Google Ads click identifiers.
  • A first-party identifier (cookie or authenticated user id) that survives the booking flow.
  • Landing page path, so you can tell a service page from a blog post from a homepage.

Closed-loop: ads spend in, invoices out

The trades CRM is a live multi-tenant system KeenCraft built for local services. It auto-scores leads 1–100, maps form submissions into CRM records, runs email automations by job stage, tracks jobs from lead to invoice, and attributes revenue back to source, including Google Ads through officially verified OAuth.

That last clause matters. Unofficial scraping of Google Ads is how integrations break during verification and how accounts get banned. Official OAuth is slower to set up and is the only version that survives a real audit.

A closed loop, in the form we implement under automation and CRM integrations:

  1. Click or call lands with UTMs / gclid stored first-party.
  2. Form, chat, or voice agent creates a CRM lead with those fields copied, not re-typed.
  3. Lead scoring and stage automation keep the job moving without a human re-entering source.
  4. When the invoice is paid, revenue is attributed to the stored source, not to whoever last edited the record.
  5. Google Ads (or the equivalent) receives an offline conversion so bid strategy can see real jobs, not just form fills.

Phone calls are first-class conversions

For appointment businesses, the highest-value conversion often never hits a thank-you page. That is why KeenCraft's voice agents are designed to write the same source fields a web form would. If VoiceCake books a dental appointment from a missed-call number that was advertised, the CRM still needs to know which campaign paid for the ring.

Practically: pass a tracking number or a call-source parameter into the agent context, persist it on the appointment, and do not let a receptionist overwrite it with 'phone' as a vanity source. 'Phone' is a channel. It is not a campaign.

A setup sequence that does not require a 40-page analytics RFP

  1. Inventory the money events: form, call, chat, in-person booking, invoice paid.
  2. Put first-party UTM and referrer capture on every public page, including the blog.
  3. Copy those fields into the CRM on create. Never rely on staff memory.
  4. Choose last non-direct-click as the default reporting model for paid search. Keep last-click as a secondary view.
  5. Wire offline conversions only after the CRM source field is trusted.
  6. Review weekly: spend vs booked jobs vs paid invoices, not spend vs 'leads'.

This is not a full marketing stack replacement. It is the minimum architecture that stops you from scaling ads into a black hole. If you already have HubSpot, Salesforce, or Zoho, the same pattern applies; the CRM brand is less important than whether source survives from click to cash.

Questions this article answers

What is last non-direct-click attribution?+

A model that credits the last marketing touch that was not a direct visit. If a customer first arrives from Google Ads, leaves, and later types the URL, the booking still belongs to the ad, not to 'direct'.

Why is GA4 last-click not enough for service businesses?+

Because the money event is often a call, a calendar booking, or an invoice weeks later. Those events live in the CRM or the booking system, not in a thank-you page that Analytics can see.

How did KeenCraft implement this for PARKees?+

On the PARKees parking marketplace rebuild, KeenCraft designed a last non-direct-click model using dataLayer capture of UTM parameters and referrer data so marketing spend could be tied to real bookings.

Can Google Ads revenue be attributed inside a CRM?+

Yes, when OAuth is verified and conversion data is written back. A multi-tenant CRM KeenCraft built for trades and local services attributes revenue to source including Google Ads via officially verified OAuth.

Ready to build something that saves you money from day one?

Book a free 30-minute call. Tell me what you're trying to build or fix, and I'll tell you honestly whether KeenCraft is the right fit and what it would take.