Rebuilding Attribution for a Scaling Paid Media Program

Client: FinTech Company
Engagement: March–May 2024, December 2024
Tools: Google Tag Manager, GA4, Google Ads, HubSpot, Meta Ads

Background

In early 2024, the marketing team was investing more in Google Ads than ever before, scaling aggressively during Q1 tax season. The problem was that the attribution data feeding those spend decisions wasn’t trustworthy.

Traffic was overcounted as Direct in GA4. Conversion events weren’t covering the onboarding funnel. HubSpot’s source data was a mess because the core sign-up form wasn’t tracked by the platform. Scaling spend into that environment meant optimizing toward signals that didn’t accurately reflect what was actually happening. Our POC couldn’t prove value to their team, and the company couldn’t tie budget expenditure to revenue.

The Build

GTM Event Architecture for the Onboarding Funnel. The core deliverable was a complete GTM event layer covering the entire onboarding funnel, built to route cleanly to both GA4 and Google Ads. Each stage was mapped to specific events, documented in a shared glossary alongside the existing GA4 and Mixpanel event inventory. Because the product is a single-page application, several events required history change triggers in GTM rather than standard page view triggers. The full event set was pushed live, tagged as Key Events in GA4, and imported as Conversions in Google Ads.

HubSpot UTM Overhaul. When we started, six HubSpot workflows were writing (and overwriting) the same set of UTM fields. Two of the six relied on Custom Code actions, written in JavaScript and largely untouched and invisible to the current team. All of this was in place as a patch-job; sign-ups happened on a non-HubSpot form, and tracking those submissions through the HubSpot tracking code was simply impossible.

To get things to a cleaner state, we deprecated the unnecessary workflows and rewrote the Custom Code actions to cleanly parse UTM values from page URLs into UTM fields. We also instituted our typical first-last stamping automation for UTM values, ensuring the team had a clear understanding of where revenue came from within the CRM. A UTM cleanup spreadsheet was also built with a template formula to parse query parameters from URL fields directly in Sheets, enabling the team to audit and bulk-correct historical source data independently.

Revisiting the Team

Eight months after the initial engagement, the team returned to extend the same tracking foundation to Meta. The existing Meta pixel was only tracking basic page views — HubSpot lifecycle events weren’t feeding through, and no conversion events were configured in Meta Ads.

The approach mirrored the Google Ads build: GTM tags for each existing conversion event, declared as conversion actions in Meta Ads, wired to the Advantage Plus campaigns already running. History change triggers were again required for the SPA. By this point, Google Ads tracking had been running reliably for eight months with close alignment between GTM and HubSpot data — the foundation from the initial build was holding and the team continued to receive actionable data from their ad platforms.


← Back to Projects