← All work

90 Seconds · May 2026 · GTM · GA4 · PostHog · HubSpot

Web Attribution.

Built the full attribution stack for 90 Seconds from zero. Every visitor identified, tracked and tied to a contact in HubSpot.

GTM → GA4

SPA page views tracked

PostHog

visitor identified at form submit

HubSpot

contact synced end-to-end

The problem.

When I joined 90 Seconds, we had no reliable way to know where pipeline came from. The site had some tracking in place, but it was inconsistent: pixels firing twice, SPA navigation not registering as page views, form submissions not connecting an anonymous visitor to a HubSpot contact.

That made attribution guesswork. We were investing in paid, SEO, email and events, and could not say with confidence what was working. Going into go-live on the new React site, this had to be fixed properly.

The approach.

I built the attribution stack end-to-end. I scoped, designed and shipped it.

  • GTM container. Set up the container from scratch. Moved the runtime config out of environment variables and into a system_settings table with an admin UI, so tracking IDs could be updated without a deploy.
  • SPA page view tracking. The new site is a React single-page app. Without explicit instrumentation, GA4 only sees the initial load. I wired route-change events to push page_view to the dataLayer on every navigation, so GA4 sees the full journey.
  • PostHog identify. On every HubSpot form submission, I fire a PostHog identify call with the submitter's email. That stitches the anonymous visitor session to a known person, so PostHog's person timeline becomes a real attribution record from first click to form fill.
  • Pixel audit. Found and removed a double-firing pixel that had been inflating event counts. Deduplication matters more than adding more tags.
  • HubSpot sync. Confirmed the form-to-contact flow was clean, with submissions creating or updating contacts in HubSpot with correct attribution fields.

The outcome.

We launched the new 90seconds.com with a clean, end-to-end attribution stack. Visitors are tracked across the full SPA journey in GA4. Form submitters are identified in PostHog and tied to HubSpot contacts. Channel and campaign data flows through consistently.

For the first time, we can look at a deal in HubSpot and trace it back through the marketing touchpoints that influenced it. That is what attribution is supposed to do.

← Back to all work