When to use it, when not to
Use it
- 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.
Skip it
- 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. On newer portals the legacyHubSpot scoreproperty does not exist (checked on a test portal on 7 and 23 October 2026): use the score property created by your lead scoring tool. The one-click install leaves the score criterion and its re-enrollment trigger for you to add, and its notification subject leaves out the score. Add the criterion before switching the workflow on, or every Subscriber and Lead becomes an MQL. - 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 Score is greater than or equal to a
set threshold (for example 70) AND Lifecycle stage is not
already Marketing Qualified Lead or later. |
| Re-enrollment | on, re-enrollment trigger =
HubSpot Score has 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"
- 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://
- 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.
The UAT script of this spec holds 4 cases: a negative case, one case per branch, the expected result of each and a sign-off sheet. It comes as Markdown and as a CSV for your spreadsheet.
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: []Files and install
| File | What it holds |
|---|---|
| PDF and Markdown | The spec as you read it here, with the YAML build spec at the end. |
| Properties JSON | Creates the fields in one API call. |
| Workflow JSON | Documents the build: the workflow in Automation API v4 format, switched off. |
| UAT script | The test cases, the expected results and a sign-off sheet, as Markdown and CSV. |
Take the PDF and build it by hand. One-click install comes with a category pack or the full library.
Install marketing-ops-001
One email, and we tell you where this stands. When free installs open, that address is how you hear it first.
No card, no password, unsubscribe in one click.
Nothing deleted, enabled or enrolled.
marketing-ops-001Spec version 2026-09