Most HubSpot portals either lose the second hand-raise or count it as brand-new demand. Separate MQL events from MQL people and both problems disappear.
Leadership reads 1,240 as demand growth. Nobody can say how many are the same buyers coming back.
Same 1,240 rows. Now every repeat hand-raise is a routed, SLA-timed event, and the person is counted once.
Jump to a section
It is rarely one broken workflow. It is six design gaps stacking on top of each other.
Each one below is a pain we hear from HubSpot teams almost word for word.
HubSpot tools can push Lifecycle stage forward but not back. Setting MQL → Lead quietly does nothing unless the field is cleared first.
Lifecycle stage carries current position, history and sales status. Clear it to recycle and you damage history. Leave it and the MQL trigger never fires again.
A contact still enrolled can't re-enroll, and multi-value "is any of" triggers aren't re-enrollable in contact workflows. The repeat MQL gets lost.
A contact property holds only the latest state. With no per-MQL record, re-MQLs show up as net-new funnel volume and conversion math drifts.
The native Dynamics 365 connector is one-to-one, so a repeat MQL creates no new D365 Lead. Salesforce has a cousin: a converted Lead leaves nowhere for a re-MQL to land.
Send a webhook needs Data Hub (formerly Operations Hub) Pro. Deal create and revenue attribution need Marketing Hub Enterprise. Legacy score properties stopped updating Aug 31, 2025.
The biggest gap is rarely conversion. It is MQLs nobody ever works.
Benchmark against your own cohorts first, then use these ranges to spot outliers.
Average time to first response on inbound leads
HBR, Oldroyd et al., 2011 (2,241 US firms)Inbound leads that never got a response
Chili Piper, 2022 (updated 2024)Higher odds of qualifying at 5 minutes vs 30 minutes
Oldroyd / InsideSales, 2007Swipe the table sideways to see all bands →
| Metric | Weak | Acceptable | Strong |
|---|---|---|---|
| MQL → SQL (B2B SaaS) | <15% | 15–30% | 35%+ |
| SQL → Opportunity | <35% | 38–45% | 48%+ |
| Lead → MQL | <30% | 35–41% | 44%+ |
| Inquiry → closed-won | <0.5% | ~1% | 2–5% |
| Speed to first response | >24 hrs | <1 hr | <5 min |
| Inbound leads never followed up | >25% | 5–15% | <5% |
| Opportunity win rate | <20% | 20–30% | 35%+ |
| Sales cycle (overall) | >120 days | ~84 days (median) | 46–75 days |
| Recycled-lead conversion | No credible published benchmark. Track re-MQL → SQL against first-MQL → SQL in your own portal. | ||
Sources: First Page Sage, B2B SaaS Funnel Conversion Benchmarks (Jun 2025); The Digital Bloom, 2025 B2B SaaS Funnel Benchmarks (Oct 2025); Forrester via Forbes (Mar 2022); HBR, Oldroyd et al. (2011); Chili Piper (2022, updated 2024); Oldroyd / InsideSales (2007). The follow-up bands are JayOh's interpretation of HBR, Chili Piper, Drift (2017) and InsideSales (2014) findings, not a published range.
Build the data model first, then the handler, monitor and recycle loop, then nurture and reporting.
Tier requirements are tagged on each step so you can price the build before you start.
Re-MQL re-enters the handler as a new event, never a new person
Entry criteria, exit criteria, an owner and an SLA for every stage. Decide whether contact or company drives reporting.
Every automation below keys off these. Stage changes without an observable trigger are where data rots.
Write a crosswalk: lifecycle ↔ SFDC Lead Status and Opportunity Stage, or ↔ D365 Lead status. Two-way lifecycle sync with Salesforce means most recent update wins, so assign an owner system per field.
Stage calculated properties plus the custom counters in the property spec (section 8).
Native history alone can't tell a first MQL from the latest one, or count how many cycles a contact has run.
mql_count, recycle_count, first_mql_date, last_mql_date, last_mql_source, recycle_reason, last_recycle_date and lifecycle_cycle_status.first_mql_date (set only if unknown) as the source of truth. Don't assume Date entered MQL survives re-entry.A fit score, an engagement score with recency rules, and one threshold that sets MQL.
Legacy score properties stopped updating Aug 31, 2025, so triggers built on them went quiet. Recency rules decay stale engagement.
lifecycle_cycle_status ≠ Open AND today ≥ recycle_eligible_date.A single contact workflow. The only place an MQL is processed.
One choke point keeps counting, routing and SLA timing consistent, which is what makes it run without manual intervention.
mql_count (confirm the increase option in your portal's Edit record action), set last_mql_date, set first_mql_date if unknown, copy the source, set status Open.D365: Send a webhook (Data Hub Pro or Ent) to Power Automate, which always creates a new D365 Lead on the existing Contact and Account. No Data Hub? Zapier or Make can call the D365 API. Salesforce: use the inclusion list on MQL criteria; for a converted Contact, create a Task or custom handoff record, and use Add to Salesforce campaign for member status.
A separate "MQL SLA Monitor" workflow.
It replaces manual chasing. Without it, the MQL stage becomes a graveyard.
lifecycle_cycle_status = Open, single value, re-enrollment ON.A "Recycle" workflow, ideally lead-based.
Recycling is the only way to get a re-fireable MQL trigger. Counters and the Lead record keep the history clearing would destroy.
recycle_count, set last_recycle_date and recycle_reason, set status Recycled.recycle_eligible_date = today + cool-down, then enroll in recycle nurture. Bad fit, competitor and spam go terminal and suppressed.Never remove the CRM match record to recycle. Keep the Contact ↔ Contact link permanent, treat each D365 Lead as a disposable event, and write its status back to HubSpot to trigger this workflow.
One nurture workflow per stage × persona or product cell. Campaigns feed content into tracks.
Workflow-per-campaign sprawl collides with sales outreach and runs into plan caps, reportedly 300 on Pro and 1,000 on Enterprise. Confirm yours in the products catalog.
nurture_track = Y.| Stage | Product A buyer | Product A user | Exit on |
|---|---|---|---|
| Lead | Problem education, 5 emails / 6 wks | Use-case demos, 5 / 6 wks | MQL, open deal |
| MQL (Open) | No nurture: sales SLA window | No nurture | Accepted, Recycled |
| Recycled | By reason: timing, budget, no response | Same, practitioner angle | Re-MQL, terminated |
| Customer | Onboarding → adoption → cross-sell | Adoption tips | Churn, expansion opp |
Every email, form, landing page, ad and event attached to a Campaign, with UTMs mapped to campaigns.
Attribution and journey reports filter by campaign. Untagged assets are invisible.
last_mql_campaign at each MQL.A "Lifecycle Engine" dashboard: funnel, events vs people, velocity and influence.
This is how the team sees which campaigns influence pipeline progression, not just contacts created.
mql_count = 1) from re-MQL (> 1).last_mql_campaign onto the Lead and Deal at creation and report Lead → Deal by campaign.A test-contact harness, weekly anomaly views and a change log.
Lifecycle bugs are silent. A trigger that stops firing looks exactly like a slow month.
mql_count > 4.mql_count and first_mql_date from Date entered MQL. Name workflows [LC] Stage – Track – Purpose.Lifecycle stage is current state. Counters, dates and Lead records are history.
Most double-counting bugs come from mixing the two.
MQL Handler, SLA Monitor, Recycle and Customer Conversion write lifecycle. Everything else only reads it.
One Lead per handoff, each with stage dates, Time to First Touch and a disqualification reason.
Never a multi-value "is any of" lifecycle trigger in a contact workflow that must re-enroll.
Long delays go in monitor workflows, so a re-MQL is never blocked by "currently enrolled."
And log it. No user or integration moves a stage backward without recycle_count firing.
Timing, budget and no response recycle. Fit, competitor and spam terminate and suppress.
Gate MQL on recycle_eligible_date so a recycled contact can't re-MQL tomorrow morning.
Without them, stale engagement re-qualifies a recycled contact immediately.
Show re-MQL conversion on its own line before leadership asks why MQLs rose but net-new didn't.
Suppress nurture during sequences, open Leads in Attempting or Connected, and open deals.
Campaigns feed content into stage × track cells. They never spawn new workflows.
In Dynamics or Salesforce, make each downstream Lead disposable. Don't break the match to recycle.
Eight anti-patterns we find in almost every lifecycle audit, and what each one costs.
None of them throws an error. All of them show up in the board deck.
The workflow "succeeds," the stage doesn't change and nothing routes.
Cost: recycled hand-raisers never reach sales.
The second MQL overwrites history and the funnel reports it as new.
Cost: inflated MQL volume, overstated conversion, misread CAC.
A contact that re-MQLs while still enrolled is ignored.
Cost: your hottest repeat leads get no handoff.
The link sticks, so no second Lead is created. Breaking the match record breaks history.
Cost: re-MQLs invisible to sales, or duplicate D365 records.
Campaign nurture, a sales sequence and the newsletter land in the same week.
Cost: unsubscribes and sales distrust of marketing.
Hundreds of overlapping workflows heading for the plan cap.
Cost: nobody can say what a contact receives next.
MQLs age in stage. HBR (2011) found 23% of firms never responded at all.
Cost: lost conversion while the MQL count looks healthy.
Old score properties stopped updating Aug 31, 2025. Cumulative time in stage stays empty while in stage.
Cost: MQL flow drops to zero and nobody notices.
Unworked MQLs leak. Recycled ones come back, if the loop can count them.
Drag any slider to change the inputs; results update instantly.
$94.8K per month from re-MQLs that would otherwise never reach sales.
First-cycle SQLs = 400 × 70% × 30% = 84.0
Re-MQLs = (400 − 84.0) × 50% × 20% = 31.6
Recovered pipeline = 31.6 × 30% × 40% × $25,000 = $94.8K / month
Steady-state monthly model. Assumes the SLA Monitor gets every re-MQL worked; your inputs, not benchmarks.
Build these fields before a single workflow.
One Copy button grabs all three tabs: properties, SLA and recycle rules, and the launch checklist.
| Property (internal name) | Object | Type | Set by | Logic / notes |
|---|---|---|---|---|
mql_count | Contact | Number | MQL Handler | +1 on every MQL entry. Never reset |
first_mql_date | Contact | Date | MQL Handler | Set only if unknown |
last_mql_date | Contact | Date | MQL Handler | Date of step on every MQL |
last_mql_source | Contact > Lead > Deal | Dropdown | MQL Handler | Score threshold / demo form / event / content / partner |
last_mql_campaign | Contact > Lead > Deal | Text or campaign ID | MQL Handler | Latest campaign touch; powers Pro-tier influence reports |
lifecycle_cycle_status | Contact | Dropdown | All state workflows | Open / Accepted / Recycled / Converted / Terminated |
recycle_count | Contact | Number | Recycle WF | +1 per recycle |
last_recycle_date | Contact | Date | Recycle WF | Date of step on every recycle |
recycle_reason | Contact | Dropdown | Recycle WF | Mirrors the Lead Disqualification Reason values |
recycle_eligible_date | Contact | Date | Recycle WF | Recycle date + cool-down; gates the MQL trigger |
nurture_track | Contact | Dropdown | Nurture router | Current stage x persona track; exactly one value |
| Lead type | Lead (native) | Dropdown | MQL Handler | New / Re-MQL / Re-attempt |
| Disqualification Reason | Lead (native) | Dropdown | Rep | Required at the Disqualified stage |
d365_lead_id / sfdc_lead_id | Lead / Contact | Text | Middleware write-back | Latest downstream lead ID for reconciliation |
| Rule | Condition | Automated action | Owner |
|---|---|---|---|
| Speed-to-lead SLA | Lead created, stage = New | Notify owner now; first touch < 1 business hour (hand-raisers < 5 min) | SDR |
| Escalation | No activity after 1 business day | Reassign via rotation + manager alert | SDR manager |
| Auto-recycle (unworked) | No activity after 5 business days | Lead > Disqualified, reason "SLA breach"; contact recycled; reported as SLA miss | System |
| Accept / reject window | Lead in Attempting or Connected 10 business days | Reminder; force disposition at 15 days | SDR |
| Recycle: timing / budget | Disqualified, reason Bad timing or Budget | Clear > Lead, recycle nurture, 60-90 day cool-down | System |
| Recycle: no response | 6+ attempts, no connect | Clear > Lead, alternate-channel nurture, 30 day cool-down | System |
| Terminate | Bad fit, competitor, student, spam, duplicate | Terminal stage + marketing suppression | System |
| Closed-lost recycle | Deal lost: Timing, No decision or Budget | Non-customer contacts recycle; win-back after 90 days | System |
| Loop guard | mql_count rises more than 2 in 30 days | Alert Marketing Ops; hold re-MQL | MOps |
Short answers. The playbook above has the build detail.
Click any question to open it.
By design. Forms, imports, workflows, the API and the Salesforce integration can only move Lifecycle stage forward. To go back, clear the value first, then set it, using two separate Edit record actions in a workflow.
Usually one of three things: the contact was still enrolled (enrolled records can't re-enroll), the trigger used a multi-value "is any of" (not re-enrollable in contact workflows), or the stage never actually changed because it wasn't cleared. Use a single-value trigger, re-enrollment ON and a handler that ends fast.
Count events and people separately. Create a Lead record for every MQL (the event) and increment mql_count on the contact (the person). Report first-cycle and re-MQL lines on their own, by MQL date cohort.
Not through the native connector alone. It links one HubSpot record to one D365 record and the link persists, and the HubSpot Lead object doesn't sync to D365 Leads. Send a webhook to Power Automate on every MQL, which needs Data Hub Pro or Enterprise, or use Zapier or Make. Keep the contact link permanent; don't remove the match record.
Partly. Pro gives you Contact Create Attribution. Deal Create and Deal Revenue Attribution need Marketing Hub Enterprise, and journey analytics needs Enterprise too. On Pro, stamp last_mql_campaign onto each Lead and Deal at creation and report Lead → Deal by campaign.
HubSpot retired the legacy score properties; they stopped updating on Aug 31, 2025. Any workflow triggering on them stopped firing. Rebuild on the Lead Scoring tool (Marketing Hub Pro; combined scores need Enterprise) and point every trigger at the new score.
Keeping the stage and using Lead Status preserves native history, but lifecycle funnel reports never show re-MQLs and re-engagement has to key off other fields. Our default is clear-then-set plus counters: you get a re-fireable trigger and true current state, and the counters restore the history you'd lose.
A pod owns the outcome, ships in two-week sprints and hands you documentation, not a black box.
Definitions before workflowsA journey working session plus a lifecycle and scoring survey sent to marketing and sales separately, so disagreement surfaces before anything is built.
Recycling is a rule, not a vibeHand-raisers auto-MQL, idle SALs recycle with a reason code, and score decay stops old engagement inflating MQL counts.
Events and people, measured separatelyMQL cohorts by MQL date, an MQL-count property and a Lead record per MQL, with touchpoints rolled up to account and opportunity.
Pod deliveryA consultant owns the outcome; GTM engineers build in sprints; you get the stage spec, SLA matrix and training.
Lead-to-MQL conversion
JayOh client resultFaster lead processing
JayOh client resultPipeline in 90 days
JayOh client resultEngagements delivered
Since 2016We audit your lifecycle, scoring and handoff, then build the handler, recycle path and reporting with your team.
We engineer growth systems. JayOh builds the RevOps architecture, GTM execution and data infrastructure that turn messy revenue operations into predictable pipeline for B2B SaaS and PE-backed teams.