Case study · IT equipment leasing · Anonymized

An IT leasing company's broken ad attributionattribution, rewired in HubSpot

Updated · June 20269 min readBy Buildrhaus

How we took a company spending on Google Ads with no idea what it returned, attribution silently broken since late 2023, and traced it back to a single lost cookie, then rebuilt the reporting end to end.

Confidential · anonymizedWe never publish a client's name or logo without written consent, so the company here is hidden. The architecture and the figures are real and unchanged.

TL;DR · What we built

An IT equipment leasing company was spending on Google Ads and flying blind: clicks still reached HubSpot, but they stopped attaching to contacts around November 2023, so nobody could say which paid campaigns generated pipeline. We isolated the three ways a contact is created, form, API and added-to-cart, and traced exactly where the tracking broke: UTM parameters lost on page changes, and API-created contacts missing the hutk cookie, which made HubSpot stamp their source as offline.

We fixed the tracking so original source reads Paid Search again, realigned the lifecycle across Contact, Company and Deal over three parallel pipelines, audited every workflow, and rebuilt reporting by source and campaign. Along the way the realignment surfaced the kind of silent contradiction nobody had caught: 880 companies with a won order but zero customers in the lifecycle. This page is the long version.

01 · The brief

The problem: paying for ads, blind on the return

The company leases and manages IT equipment for businesses, and a real share of its demand comes from paid search. Money went out to Google Ads every month, and on the surface HubSpot looked healthy: clicks and impressions still flowed in, contacts still appeared. The problem was underneath. Around November 2023, those ad-sourced contacts stopped carrying their attribution, at both contact and deal level. The clicks arrived; the link to where they came from did not.

The consequence is the one every paid-acquisition team dreads: you cannot tell which campaigns generate pipeline. Budget keeps flowing to keywords and campaigns on faith, because the data that would tell you what works has quietly gone dark. Reporting still drew charts, but the most important column, original source, was lying, so every decision built on top of it was a guess wearing the costume of a number.

The mandate was not "rebuild our CRM". HubSpot was the right tool and the team lived in it. The mandate was: find out why the attribution broke, fix it, and make the reporting trustworthy again, so a euro spent on ads can be traced to the pipeline it creates.

02 · The diagnosis

The root cause: a cookie that fell on the floor

Before changing anything, the audit traced exactly where attribution leaked. A contact in this business gets created or updated in three different ways, and each one had to be checked on its own, because a single broken path is enough to poison the whole report.

Three paths, one broken

The three ways in were a form submission, a creation through the API, and an added-to-cart event. Walking each one showed two distinct failures. UTM parameters were being lost on page changes, so the campaign signal never survived the journey to the form. And contacts created through the API never carried the hutk cookie, the tracking token HubSpot uses to tie a person back to their session, so HubSpot had no choice but to stamp their original source as offline.

WORKFLOW / GOOGLE ADS → HUBSPOT ATTRIBUTION Where the source was lost A Google Ads click reaches HubSpot three different ways Google Ads click utm + hutk cookie Form submission utm lost on page change API creation no hutk cookie passed Added to cart event not tracked HUBSPOT Original source stamped from what survived the trip Paid Search the goal: correct source Offline attribution lost Nov 2023 the month ad attribution went dark UTM lost on page change · API contacts missing the hutk cookie → source = offline
The three contact-creation paths into HubSpot, and the two failures that quietly stamped paid traffic as offline.
03 · The build

The build: fix the tracking, then realign the whole model

Finding the leak was half the work. The other half was fixing it at the source and making sure the rest of the model could be trusted again, across every object, not just the contact.

The attribution fix

The repair moved tracking off the Contacts API and onto the JavaScript trackPageView and trackEvent calls, which carry the session and the cookie HubSpot needs, and remapped the forms so the UTM signal survived the journey. The whole fix was documented so original source reads Paid Search correctly instead of falling back to offline. Form and added-to-cart tracking were restored in HubSpot.

Three pipelines, realigned

Attribution sits on top of the data model, so the model had to be coherent. We brought the lifecycle into line across Contact, Company and Deal, running over three parallel pipelines, Company Lifecycle, Orders and MDM, with the stages fully mapped. Doing that surfaced the kind of contradiction that hides in plain sight: 880 companies showed a won order but zero customers in the lifecycle, a gap nobody had quantified until the pipelines were forced to agree.

Workflows audited, reporting rebuilt

Every HubSpot workflow was reviewed and given a verdict, keep, change or cut, removing the ones that wiped lifecycle without a delay, blocked legitimate backward moves or created duplicates. On the clean foundation, we built reporting on deals, companies and contacts by source and by campaign through the funnel. The whole pipeline architecture was documented and handed over to the internal RevOps team.

04 · The results

What changed for the team

Forget the dashboards that looked fine. What changed is that the numbers became true, and the spend became traceable.

Nov 2023
the month ad attribution silently broke, traced to a lost hutk cookie and dropped UTMs
3
pipelines realigned across Contact, Company and Deal, with the lifecycle made coherent
880
companies found with a won order but zero customers in the lifecycle, a contradiction surfaced and chased

The headline is traceability, not a vanity chart. Form and added-to-cart tracking were restored, original source reads Paid Search again, and reporting now ties deals, companies and contacts to the source and campaign that produced them. The team went from spending blind to being able to ask which campaign generated which pipeline and get a straight answer.

Underneath, the model is coherent. Three pipelines agree, the workflows no longer corrupt the lifecycle, and the silent contradictions, like 880 won-but-not-customer companies, are visible instead of buried. The architecture was documented and handed to the internal RevOps team, so the fix outlives the engagement.

05 · The stack

What it runs on

A focused build on the tools the team already used, each piece doing one job and the company holding the keys.

  • HubSpot — the system of record: lifecycle across Contact, Company and Deal, three pipelines, and the rebuilt source and campaign reporting.
  • Google Ads — the paid-acquisition channel whose attribution was traced back into HubSpot end to end.
  • Google Tag Manager — where the trackPageView and trackEvent fix carries the session and cookie HubSpot needs.
  • Clay and Amplemarket — enrichment behind keeping company and contact records current.

No tool swap, no black box. The pipeline architecture and the attribution fix were documented and handed over, which is the same way every build we ship works.

06 · Quick answers

This case, FAQ

Who is the client in this case study?
An IT equipment leasing and management company. The company is anonymized: we never publish a client's name, logo or any identifying detail without written consent. The architecture and the figures are real, the identity is removed.
What was actually broken?
Google Ads clicks and impressions still landed in HubSpot, but they stopped attaching to contacts around November 2023. The team could no longer tell which paid campaigns generated pipeline. The root cause was twofold: UTM parameters were lost on page changes, and contacts created through the API never carried the hutk tracking cookie, so HubSpot flagged their source as offline.
How did you fix the attribution?
We isolated the three ways a contact gets created or updated, form, API and added-to-cart, and traced where each broke. The fix moved tracking to the trackPageView and trackEvent JS calls instead of the Contacts API, and remapped the forms, so that the original source reads Paid Search correctly. Form and added-to-cart tracking were restored in HubSpot.
What else did the engagement cover?
Beyond attribution, we realigned the lifecycle consistency across Contact, Company and Deal over three parallel pipelines, audited every workflow to decide what to keep, change or cut, and built reporting on deals, companies and contacts by source and by campaign through the funnel. The pipeline architecture was documented and handed over to the internal RevOps team.
Can you do the same for our setup?
Yes. It starts with a free diagnostic of your current setup, then a focused build: trace where tracking breaks, fix the attribution end to end, realign the lifecycle across objects, audit the workflows and rebuild reporting by source and campaign, documented and handed over. We quote on your real situation after the diagnostic.

Is your ad spend traceable?

Tell us how your attribution, pipelines and reporting run today, in text or a voice memo. We reply within 24 hours with where the system hits its ceiling, what that costs you, and a costed path to fix it. Free, no deck, no follow-up sequence.

Free 30-minute diagnostic