Pull a report of your HubSpot contacts by lifecycle stage. Count the "Customers." Now compare that number to your actual customer count.
If you're like most companies, HubSpot thinks you have far more customers than you do. That's because lifecycle stages in HubSpot don't automatically go backward. Someone who became a customer five years ago and churned four years ago? Still showing as Customer. That SQL who went cold and never responded again? Still an SQL.
Over time, lifecycle stages become a historical high-water mark, not a current status. Your reports lie. Your automation triggers wrong. And any segmentation based on lifecycle stage is built on fiction.
Why Lifecycle Stages Drift
HubSpot designed lifecycle stages to progress forward. Subscriber → Lead → MQL → SQL → Opportunity → Customer. The assumption was that going backward was rare and should require deliberate action.
In practice, backward movement is constant:
Customer Churn
Customers cancel. Contracts expire. Companies go out of business. But the contacts from those accounts stay marked as Customer forever unless someone changes them.
Result: Your "Customer" count includes every customer you've ever had, not your current customers.
Dead Opportunities
A deal stalls. The contact goes quiet. The opportunity is closed-lost. But the contact's lifecycle stage stays at Opportunity (or SQL, depending on how you set it). They're not an active opportunity anymore, but the system thinks they are.
Disqualified Leads
An MQL turns out to be a competitor, a student, or someone completely outside your ICP. Sales disqualifies them. The lifecycle stage stays MQL because nobody demotes it.
Job Changes
A contact was an SQL at Company A. They leave. They're no longer relevant to the deal at Company A, but their lifecycle stage stays SQL. Maybe they reappear at Company B, but that's a different context entirely.
No Defined Criteria
Many companies never defined what each lifecycle stage actually means. Is someone an MQL because they downloaded an ebook? Attended a webinar? Hit a lead score threshold? Without clear definitions, stages get assigned inconsistently and never cleaned up.
Assessing the Damage
Before fixing anything, understand how broken things are.
Stage Distribution Report
Create a report showing contact count by lifecycle stage. Look for obvious problems:
- More "Customers" than actual customers
- Large numbers of SQLs with no recent activity
- MQLs from three years ago who've never progressed
- Empty stages that should have contacts
- Stages with unclear purposes that nobody remembers defining
Cross-Reference With Reality
For the Customer stage specifically, export your "Customer" contacts and compare against your actual customer list (from your billing system, customer success platform, or contracts). The delta shows how many churned customers are still marked as current.
For SQLs and Opportunities, check how many have associated deals that are closed-lost or have had no activity in 6+ months.
Contact vs. Company Alignment
Lifecycle stage exists on both contacts and companies. They should generally align (if a contact is a Customer, their company should be too), but often don't.
Create a report that shows contacts whose lifecycle stage doesn't match their associated company's stage. The mismatches indicate inconsistent data management.
Three Approaches to Cleanup
How aggressive you get depends on how broken things are and how much historical context matters.
Option 1: Full Reset
Clear all lifecycle stages and rebuild based on current reality.
How it works: Export current lifecycle data for historical record. Clear lifecycle stage for all contacts. Use workflows to re-assign stages based on current criteria (active deals = Opportunity, current customers = Customer, recent engagement = MQL, etc.).
Pros: Cleanest result. Every contact has an accurate current status. Reports immediately become trustworthy.
Cons: Loses historical progression data. Any reporting on "time in stage" or "stage progression" breaks. Can trigger workflow enrollments if you're not careful.
Best for: Databases where lifecycle stages have been so neglected that incremental fixing isn't feasible. New RevOps teams inheriting a mess.
Option 2: Selective Cleanup
Fix specific problematic stages while preserving others.
How it works: Keep Customer and Opportunity stages intact (or verify them individually). Reset earlier stages like MQL and SQL. Let contacts re-qualify based on current engagement.
Pros: Preserves the stages that matter most for revenue reporting. Less disruptive than full reset.
Cons: Customers and Opportunities still need manual verification. Doesn't address contacts who should be at earlier stages but are stuck at later ones.
Best for: Organizations that trust their Customer data but know early-stage data is garbage.
Option 3: Forward-Only Correction
Don't reset anything. Apply correct logic to new contacts and stage transitions going forward. Accept that historical data is imperfect.
How it works: Define clear criteria for each stage. Build workflows that manage stage transitions. Let existing inaccuracies age out over time. Use filters in reports to exclude old data.
Pros: No workflow triggers. No historical data loss. Lowest risk.
Cons: Reports remain polluted for years. Segments based on lifecycle stage are unreliable. Doesn't actually fix the problem, just stops making it worse.
Best for: Organizations with low tolerance for disruption, or where historical data has compliance or audit value.
Executing a Reset
If you're going with Option 1 or 2, here's how to do it safely.
Export Everything First
Before changing anything, export your contacts with:
- Contact ID
- Current lifecycle stage
- Lifecycle stage date (when it was set)
- Associated company
- Any other fields relevant to stage determination
Store this export securely. You might need it for historical reporting or to undo mistakes.
Audit Your Workflows
Clearing and re-setting lifecycle stages can trigger workflow enrollments. Before the reset:
- Go to Automation > Workflows
- Filter to active workflows
- Search for workflows that use Lifecycle Stage as an enrollment trigger or branch condition
- For each one, either pause it during the reset OR add suppression logic (e.g., "don't enroll if Contact property 'Reset in progress' is Yes")
A reset that touches 50,000 contacts can trigger 50,000 workflow enrollments. If those workflows send emails, create tasks, or update other records, you'll have a mess. Audit and pause before you clear.
Clear Stages in Batches
Don't clear everyone at once. Work in segments:
- Start with a test batch (a few hundred contacts from a non-critical segment)
- Clear their lifecycle stage
- Run your re-assignment workflows
- Verify results make sense
- Proceed to larger batches
To clear lifecycle stage, you can use a workflow with "Clear property value" action, or an import with a blank lifecycle stage column.
Re-Assign Based on Current Criteria
Build workflows that set lifecycle stages based on verifiable current conditions:
Customer: Associated deal status is Closed Won AND (subscription is active OR contract end date is in the future OR however you track current customers)
Opportunity: Associated deal status is Open AND deal stage is not disqualified
SQL: (Your SQL criteria) AND not Customer AND not Opportunity
MQL: (Your MQL criteria) AND not SQL AND not Customer AND not Opportunity
Work backward from Customer. This ensures someone doesn't get set to MQL when they should be Customer.
Contact and Company Alignment
Lifecycle stage exists on both objects. They should match, but HubSpot doesn't sync them automatically.
The Problem
A contact becomes a Customer. Their company stays at Lead. Or a contact is reset to Lead, but the company stays at Customer. Now your contact-level and account-level reports tell different stories.
The Fix
Build workflows that sync lifecycle stages from contacts to companies:
Option A: Highest stage wins. When any contact at a company reaches a new stage, update the company to that stage (if it's higher than the current company stage). This is conservative but means companies can never go backward.
Option B: Roll up from contacts. Periodically recalculate company stage based on the highest stage among associated contacts. This handles backward movement but requires scheduled workflow runs.
Choose based on your reporting needs. If you report heavily on company-level pipeline, alignment matters more.
Ongoing Maintenance
Lifecycle stage cleanup isn't a one-time project. It's a process.
Churn Handling
When a customer churns, their lifecycle stage should change. Build a workflow or process that:
- Identifies churned customers (from your billing system, deal closure, or manual flagging)
- Updates their lifecycle stage to something appropriate (maybe a custom "Former Customer" stage, or back to Lead/MQL depending on your re-engagement strategy)
Dead Opportunity Cleanup
Opportunities that haven't progressed in 90+ days are probably dead. Set up regular reviews to close-lose stale deals and reset the associated contacts' lifecycle stages.
Quarterly Audit
Run your lifecycle stage distribution report quarterly. Compare against reality. Catch drift before it becomes a major cleanup project.
Should You Customize Stages?
HubSpot allows custom lifecycle stages. Whether you should use them depends on your business.
Good Custom Stages
- Former Customer: Distinguishes churned customers from people who've never been customers. Useful for win-back campaigns.
- Partner: For contacts who are partners, not customers or prospects.
- Evangelist: For highly engaged non-customers (influencers, references).
Bad Custom Stages
- Stages that duplicate deal stages (lifecycle stage isn't meant to track deal progression granularity)
- Stages with no clear definition or criteria
- Too many stages that fragment your data without adding insight
Warning About Deleting Stages
If you delete a default lifecycle stage in HubSpot, you cannot recreate it. Some HubSpot features depend on specific stages existing. Rename stages instead of deleting them if you want to change labels.
Common Questions
Why don't lifecycle stages go backward automatically?
HubSpot's default assumes forward progression. The system prevents accidental demotion from bad data or automation. But it means churned customers and dead opportunities stay at advanced stages forever unless you deliberately change them.
Will resetting stages break my workflows?
Potentially. Workflows using lifecycle stage as enrollment triggers will fire when stages change. Audit all active workflows before a reset. Pause them or add suppression logic to prevent unwanted triggers.
Should contacts and companies have the same lifecycle stage?
Generally yes. HubSpot doesn't sync them automatically. Build workflows that update company stage when contact stage changes, typically using the highest stage among all associated contacts.
Can I create custom lifecycle stages?
Yes. You can rename, add, reorder, and delete stages. Be careful with deletion (it's permanent). Custom stages should map to real, measurable funnel states, not every possible status.
Lifecycle stages telling the wrong story?
Fix My StagesRelated: How to Clean HubSpot Data | HubSpot Duplicate Cleanup | Data Cleaning Services