Outcome. Contacts that cross a lead score threshold move automatically from Lead to Marketing Qualified Lead, with no manual review, and marketing ops gets a heads-up.
Workflow mapEnrollment, branches and actions at a glance
flowchart TD
A[HubSpot Score recalculated] --> B{Score >= threshold?}
B -->|No| Z[No action]
B -->|Yes| C{Lifecycle stage already MQL or later?}
C -->|Yes| Z
C -->|No| D[Set lifecycle stage: Marketing Qualified Lead]
D --> E[Set MQL date]
E --> F[Notify marketing ops]
F --> G[Add to Active MQLs list]
When to use it / when not to
- Use when a working lead-scoring model exists (native HubSpot Score or a custom score property) and score correlates with sales readiness.
- Use when Lead to MQL is currently a manual spreadsheet or Slack-ping review.
- Do not use if no scoring model exists yet. Build and validate scoring first. This fiche assumes lead scoring is already configured; the scoring model itself is out of scope here.
- Do not use for contacts who are already customers. Exclude via the lifecycle stage filter, see Known pitfalls.
Prerequisites
- Property: HubSpot Score (default internal name
hubspotscore), or a custom score property, object contact, field type number. Why: this is the value the enrollment threshold reads. - Property:
MQL date(internal namemql_date), object contact, field type date. Why: timestamp for reporting and for the aging alert in marketing-ops-007. - Confirm lifecycle stage property values in use match the default HubSpot set (Subscriber, Lead, Marketing Qualified Lead...). If custom lifecycle stages exist, adjust criteria.
- A distribution list or Slack channel for the marketing ops notification.
Enrollment
- Trigger type: event-based (property change).
- Criteria:
HubSpot Scoreis greater than or equal to a set threshold (for example 70) ANDLifecycle stageis not already Marketing Qualified Lead or later. - Re-enrollment: on, re-enrollment trigger =
HubSpot Scorehas been recalculated. Needed because score changes continuously as contacts engage; without re-enrollment a contact whose score dips before first evaluation never gets caught later. - Suppression: none needed beyond the lifecycle-stage filter in the enrollment criteria.
Steps
- If/then branch:
Lifecycle stageis Subscriber, Lead, or unknown (not already MQL, SQL, Opportunity, Customer, Evangelist, or Other)- Set lifecycle stage to Marketing Qualified Lead. There is no dedicated "Set lifecycle stage" action: use the "Edit record" action (the current name of Set property value) targeting the Lifecycle stage property (https://knowledge.hubspot.com/workflows/choose-your-workflow-actions).
- Set property value:
MQL date= current date - Send internal email notification to: marketing ops distribution, subject "New MQL: {{contact.firstname}} {{contact.lastname}} (score {{contact.hubspotscore}})"
- Add to static list: "Active MQLs"
- Else branch (already MQL or further)
- No action, exit workflow.
Known pitfalls
- Score is recalculated often (page views, email opens). Without
re-enrollment scoped to the score property only, this workflow can
re-check the same contact many times a day; keep re-enrollment tied to
HubSpot Scorealone. - A workflow can set lifecycle stage backward if branch logic is not careful. Always gate with the lifecycle-stage filter shown above, or pair this with marketing-ops-033.
- If both a workflow and a form's own "set lifecycle stage on submit" option try to write the property, the two can race. Check each form's options before enabling this workflow: the form-level setting is the "Set lifecycle stage" dropdown in the form's submission settings, and it never moves a contact backwards (https://knowledge.hubspot.com/forms/create-and-edit-forms).
- Native HubSpot Score does not reset on its own; it only changes via the scoring rule engine. Custom score properties behave differently depending on your calculated-property setup, verify before assuming a score drop elsewhere in your automation.
- Keep the threshold value in this one workflow. Sales will ask "why is this contact an MQL" and the answer needs to be a single documented number, not folklore.
Test plan
- Create a test contact with Lifecycle stage = Lead and a score below the threshold.
- Trigger scoring engagement (or manually set the score property, if your permissions allow) to push the score at or above the threshold.
- Open workflow history (Automation > Workflows > this workflow > History) and confirm enrollment fired shortly after the recalculation.
- Check the contact record timeline for "Lifecycle stage changed to
Marketing Qualified Lead" and confirm
MQL datepopulated. - Confirm the internal notification arrived and the contact appears on the "Active MQLs" list.
Variants
- Company-level scoring: same pattern, object company, using a custom company score property.
- Two-tier MQL (Grade A/B) with split notification cadence: see marketing-ops-019.
- Product-usage-driven promotion instead of score-driven: see marketing-ops-024.
Build spec
trigger:
type: event-based
event: property_changed
property: hubspotscore
criteria:
- hubspotscore: greater_than_or_equal 70
- lifecycle_stage: not_in [marketingqualifiedlead, salesqualifiedlead, opportunity, customer, evangelist, other]
reenrollment: true
reenrollment_property: hubspotscore
branches:
- condition: lifecycle_stage in [subscriber, lead, unknown]
actions:
- type: set_lifecycle_stage
value: marketingqualifiedlead
- type: set_property_value
property: mql_date
value: current_date
- type: send_internal_email_notification
to: marketing_ops_distribution
subject: "New MQL: {{contact.firstname}} {{contact.lastname}} (score {{contact.hubspotscore}})"
- type: add_to_static_list
list: "Active MQLs"
- condition: else
actions: []



