#The challenge
Hundreds of thousands of self-serve product signups poured into a HubSpot instance with no MQL or PQL definitions, no lead routing, and lifecycle stages that fit neither a self-serve nor a sales-led motion, let alone both. UTMs were not passing on form submissions, so attribution was broken at the source. Conversion rates and velocity dates could not be trusted, because stages never regressed and a legacy lead object ran in parallel with contacts. Reporting was fragmented enough that answering a retention question meant pulling revenue from outside the CRM entirely.
#The approach
Lifecycle re-architecture across both motions
Migrated the entire contact base onto a new nine-stage lifecycle spanning self-serve and sales-led (Self-Service → Lead → Engaged → MQL → SAL → SQL → Opportunity → Customer → Churned), deprecated the legacy HubSpot lead object, and consolidated roughly 12,000 lead records into a contact-only model.
Pipeline cleanup before reporting
Backed up every deal (500+ deals across 446 columns) and closed out roughly 350 stale deals from a retired product line as Closed Lost, so conversion and velocity reporting reflected the business as it actually runs.
Attribution truth engine
Rebuilt UTM and channel classification into 14 channels and 45 sub-channels, stood up a Snowflake-based attribution reconciliation engine with first-touch, last-touch and MQL-touch stamping, and built custom campaign-attribution reporting after the CRM's native campaigns object could not ingest the custom fields.
Renewal, churn and retention reporting
Automated renewal-opportunity creation from closed-won deals, built renewal and expansion pipelines with 90/60/30-day alerts and churn logic, and mapped the funnel into a GTM data platform with an executive daily digest.
Self-serve tooling for the marketing team
Delivered supporting internal tools including a campaign UTM builder and a unified webinar-registration workflow that embeds tracking in the form itself, so the team stopped depending on manual link hygiene.
#Outcomes
~800k contacts re-lifecycled
The entire contact base was migrated onto the new nine-stage lifecycle with zero contacts left on any of the 13 legacy stages.
~160k contacts attribution-backfilled
The attribution engine backfilled lead-source detail fields, up from fewer than 200 populated records, and reconciled native against warehouse attribution — parity-tested at zero mismatches across a 200-contact sample.
99.87% GTM data-integrity score
The full funnel (Lead → MQL → SAL → SQL → Customer) was mapped into a GTM data platform and scored 99.87% on data integrity.
Legacy lead object retired
Roughly 12,000 lead records were consolidated into a single contact-only lifecycle, removing a parallel object that had been quietly splitting the funnel in two.
Fake pipeline cleared
Roughly 350 stale deals from a retired product line were closed out after a full backup of every deal and column, so pipeline stopped overstating itself.