HubSpot
Workflows
The automation engine of your CRM — the layer where everything connects. Triggers, filters, actions, branches, delays, and the essential workflows every portal must have.
An automated sequence of actions that executes when conditions are met — the digital employee who never sleeps, never forgets, and scales to any volume.
A HubSpot Workflow is a rule-based automation: "When [trigger] happens, and [conditions] are true, execute [actions] in sequence." Once activated, a workflow runs 24/7 without any human input — for every contact that qualifies, forever.
What workflows replace
| Manual process | Workflow replacement | Impact |
|---|---|---|
| Rep manually sets Lifecycle Stage | Auto-set when lead score hits threshold | Instant, consistent, zero missed updates |
| Admin emails CS when deal closes | Workflow sends Slack notification instantly | Seconds vs hours — no dropped handoffs |
| Rep creates follow-up tasks each morning | Tasks auto-created based on contact behaviour | Nothing falls through the cracks |
| Marketer sends welcome email manually | Sent within seconds of form submission | Strikes while engagement is highest |
| Nobody re-engages Bad Timing contacts | Lead Status resets automatically on follow-up date | Free pipeline from previously dead leads |
| SDR manager checks for uncovered MQLs | Manager alerted when MQL sits untouched 48h | SLA enforcement without manual monitoring |
Every manual task you did repeatedly as an SDR — logging call outcomes, setting follow-up reminders, updating lead statuses after calls — is something a workflow can do automatically. As an admin, you build these systems once and they run for every rep on the team, consistently, forever. That's the scale shift.
Every workflow has exactly three required parts. Understanding each deeply is the foundation of everything else.
Property changed
Date reached
List joined
Deal stage changed
Industry = SaaS
Score > 40
Is customer? No
Optional but critical
Send email
Create task
Notify user
Branch / Delay
| Part | What it does | Analogy |
|---|---|---|
| Enrollment Trigger | The event that causes HubSpot to check whether a record should enter this workflow. Checked continuously. | The alarm that rings when the condition is met |
| Enrollment Filters | Additional conditions that must be true AFTER the trigger fires for a record to actually enroll. Optional but almost always needed. | The bouncer checking the guest list after the alarm rings |
| Actions | Everything the workflow does after a record enrolls — run in sequence, top to bottom. Includes delays and branches. | The step-by-step instructions in the employee handbook |
Workflows run on a specific object — and the object type determines what triggers, filters, and actions are available.
| Type | Acts on | Common use cases | Frequency of use |
|---|---|---|---|
| Contact | Contact records | Lead nurture, MQL promotion, lifecycle updates, welcome emails, lead scoring, re-engagement | ~80% of all workflows |
| Deal | Deal records | Stage automation, close notifications, task creation, deal rotation, forecast updates | ~10% |
| Ticket | Ticket records | SLA escalation, support routing, CSAT survey triggers, category auto-tagging | ~5% |
| Company | Company records | Account lifecycle sync, ABM automation, company scoring | ~3% |
| Quote | Quote records | Approval flows, expiry reminders, signed quote follow-up | ~1% |
| Conversation | Conversation records | Post-chat follow-up, CSAT surveys, ticket linking | ~1% |
Master Contact-based workflows first — they represent the vast majority of real-world automation. Once you deeply understand trigger → filter → action logic for contacts, the same mental model applies to every other object type.
How HubSpot processes workflows under the hood — know these rules before building anything.
Three enrollment configurations — choosing the wrong one is the most common workflow mistake.
A lead nurture workflow without an unenrollment condition for Lifecycle Stage = Customer will keep sending "discover why you should try us" emails to people who already bought. Every time. Until someone manually removes them. Set unenrollment conditions on every nurture and sequence workflow before activating.
The event that starts every workflow — eight categories, each with a different use case.
| Trigger category | Example trigger | Best for | Speed |
|---|---|---|---|
| Contact property | Lifecycle Stage changes to MQL | Stage-based automation, score thresholds | Near real-time |
| Form submission | Contact submits "Demo Request" form | Post-form sequences, lead follow-up | Instant (~seconds) |
| List membership | Contact joins "Hot Leads" active list | List-based enrollment, segmented flows | Minutes |
| Date-based | Contact's Follow-up Date = today | Renewals, re-engagement, anniversary emails | Runs once daily |
| Deal property | Deal Stage changes to Closed Won | Post-sale automation, onboarding triggers | Near real-time |
| Email engagement | Contact opens or clicks a specific email | Behaviour-based branching, hot lead alerts | Minutes |
| Page view | Contact visits /pricing URL | Intent-based workflows, sales alerts | Minutes |
| Ticket / Conversation | New ticket created in Support inbox | SLA workflows, support routing | Near real-time |
Everything a workflow can do — organised by category. These are your tools.
If/then logic that makes workflows intelligent — routes contacts down different paths based on their data.
A branch splits the workflow into two or more paths. Each path has its own sequence of actions. After the branch, paths can rejoin or remain separate. Branches can be nested inside other branches.
| Branch type | What it checks | Use case |
|---|---|---|
| If/then branch | A property value on the enrolled record | Route by company size, industry, lifecycle stage, score, or any property |
| Is enrolled in sequence? | Whether the contact is in an active Sales sequence | Avoid emailing contacts who are mid-sequence |
| Test branch (A/B) | Random 50/50 split | Email subject line testing, CTA testing |
| Weighted branch | Custom percentage split (e.g. 70/30) | Gradual rollout of a new email template |
| Time-based branch | Time of day or day of week | Send different messages to contacts in different timezones |
Pausing execution at a specific point — the timing layer that makes automation feel human.
| Delay type | What it does | Best for |
|---|---|---|
| Fixed delay | Wait exactly X minutes, hours, days, or weeks before the next action | Email sequences, follow-up reminders, onboarding step spacing |
| Until a specific date | Wait until a Contact property date (e.g. Contract End Date) is reached | Renewal reminders, anniversary emails, trial expiration |
| Until a day and time | Wait until a specific day of week AND time of day | Ensuring automated actions fire during business hours only |
Instead of sending an automated task creation or notification at 3am on a Sunday, add a "delay until Monday at 9:00am" action. Your automated workflows then feel like deliberate human-timed actions rather than obviously robotic blasts. This small detail dramatically improves rep adoption and response rates from automated outreach.
The complete onboarding workflow — showing every node type in a real-world sequence.
Every HubSpot portal needs these 8 workflows. Without them, the CRM runs on manual processes and data degrades.
-
01Lifecycle Stage: Lead → MQL promotionTrigger: Lead Score ≥ threshold AND meets ICP criteria (industry, size, title)Set Lifecycle = MQL Set Lead Status = New Set MQL Date = Today Notify assigned SDR Create review task
-
02Deal close → Customer promotion + onboardingTrigger: Associated Deal Stage = Closed WonSet Lifecycle = Customer Set Customer Date = Today Notify CS Slack Send welcome email Create onboarding task Enrol in onboarding sequence
-
03Blank Lifecycle Stage — catchall defaultTrigger: Lifecycle Stage is unknown AND Contact is createdSet Lifecycle = Lead Set Lead Status = New
-
04Bad Timing re-engagementTrigger: Lead Status = Bad Timing AND Follow-up Date = today (date-based, re-enrollment enabled)Set Lead Status = New Clear Follow-up Date Notify owner Create re-engagement task
-
05Stale MQL alert — SLA enforcementTrigger: Lifecycle = MQL AND Lead Status = New AND MQL Date > 2 business days agoNotify SDR manager Create urgent task for manager
-
06Form submission — post-form follow-upTrigger: Contact submits [specific form]Set Lifecycle = Lead Set Lead Status = New Send confirmation email Notify SDR Create follow-up task
-
07Deal stage automationTrigger: Deal Stage changes to [key stage]Create task for deal owner Send internal notification Update contact lifecycle
-
08Date-stamp properties — funnel velocity dataTrigger: Lifecycle Stage = MQL (or SQL, or Customer) — separate workflows per stage, re-enrollment OFFSet MQL Date = Today (don't overwrite) [Repeat for SQL Date, Customer Date]
Automation → Workflows → Create workflow
- Choose the object type — Contact, Company, Deal, Ticket, etc. This determines what triggers, filters, and actions are available.
- Choose: Start from scratch or Use a template — For learning: use templates to understand structure. For production: always start from scratch to ensure every condition is deliberate.
- Set the enrollment trigger — Click "Set up trigger." Choose the event type and configure the specific condition (property, form, list, date).
- Add enrollment filters — After the trigger, narrow who actually enrolls. This is where you add industry = SaaS, company size ≥ 50, lifecycle = Lead, etc.
- Configure re-enrollment — In the left panel Settings tab: decide if contacts can re-enroll. Default is off. Enable only if needed.
- Add actions — Click the "+" to add actions. Build in logical order: set properties first (data before actions), then send emails, then notify, then create tasks.
- Add delays between timed actions — Between sequential emails or tasks, insert delays. Use "until a day and time" for actions that should feel human-timed.
- Add branches where paths diverge — Insert an If/Then branch when different contacts should receive different experiences based on their properties.
- Set unenrollment conditions — Settings → Unenrollment and suppression. Add: "Contact's Lifecycle Stage is any of Customer, Evangelist" for all nurture workflows.
- Name the workflow with your convention —
[Contact] MQL Promotion — Lead Score 50+. Add a description with purpose, owner, and last-updated date. - Check eligible contact count — Before activating, HubSpot shows how many existing contacts are eligible. Verify this matches your expectations. If wrong, fix the trigger/filter before activating.
- Activate — Toggle "Turn on." Decide: enroll existing eligible contacts, or only new contacts going forward? For most workflows: only new contacts going forward.
A workflow library without governance becomes unmaintainable within 6 months. Structure from day one.
The naming convention
Contact / Deal / Ticket
MKT / SALES / CS / AUTO
What this workflow does
What starts it
Examples
| Workflow name | What it tells you instantly |
|---|---|
[Contact] MKT — MQL Promotion — Lead Score 50+ | Contact workflow, owned by marketing, promotes MQLs when score hits 50 |
[Deal] SALES — Onboarding Start — Closed Won | Deal workflow, sales-owned, starts onboarding on deal close |
[Contact] CS — Bad Timing Re-engage — Follow-up Date | CS-managed contact workflow, re-engages bad timing leads on their follow-up date |
[Contact] AUTO — Lifecycle Default — New Contact | Automated catchall, sets default lifecycle on any new contact without one |
[Ticket] CS — SLA Escalation — 2hr No Response | Ticket workflow, escalates when no agent response in 2 hours |
Quarterly governance checklist
- 🔍Review all active workflows — any that enrolled 0 contacts in 30 days should be investigated (trigger broken or audience too narrow)
- 🗄️Pause and archive any workflow for a campaign or initiative that has ended — don't leave inactive workflows cluttering the list
- 📝Verify every workflow has a description — purpose, owner, last updated date
- ⚠️Check for conflicting workflows — two workflows both trying to set the same property can create unexpected results
- 📊Review enrollment counts — any workflow with unusually high or low enrollment vs expectation needs investigation
How building 8 core workflows transformed a B2B SaaS company's revenue operations in 3 weeks.
A 20-person B2B SaaS startup had been using HubSpot for 8 months with zero automation. Every lifecycle stage was manually updated. Every handoff (Marketing → Sales, Sales → CS) depended on a Slack message. 40% of deals closed without any post-sale CRM update. The sales manager had no idea which MQLs had been covered. The CS team found out about new customers 2–3 days after close.
Week 1 — Data foundation
- 01Built Workflow 03 (blank lifecycle default) first. Ran overnight — assigned Lifecycle Stage = Lead to 840 contacts that had none. CRM data went from 43% coverage to 97% in 8 hours.
- 02Built Workflow 08 (date-stamp properties). Created MQL Date, SQL Date, Customer Date custom properties. Retroactively stamped Customer Date from deal close dates via import. Now had funnel velocity data for the first time.
Week 2 — Handoff automation
- 03Built Workflow 01 (MQL promotion). Facilitated joint session with CMO and VP Sales to agree on MQL criteria. Workflow activated — first 12 MQLs auto-promoted with SDR notifications within the first 3 hours.
- 04Built Workflow 02 (deal close → customer onboarding). CS team notified within seconds of every new close. First week: 3 deals closed, all 3 onboarding sequences started automatically, CS manager called it "magic."
- 05Built Workflow 05 (stale MQL alert). First alert fired within 6 hours of activation — an MQL had been sitting at "New" for 72 hours. SDR had "missed it in their inbox." Problem identified and fixed.
Week 3 — Pipeline automation + re-engagement
- 06Built Workflow 04 (Bad Timing re-engagement). 47 existing Bad Timing contacts with Follow-up Dates populated. First week: 8 re-engaged automatically, 2 booked calls.
- 07Built Workflow 06 (form submissions). Connected to all 3 active lead-gen forms. Every form submission now triggers lifecycle stage set, SDR notification, and confirmation email within 30 seconds.
30-day outcome
| Metric | Before | After (30 days) |
|---|---|---|
| Contacts with lifecycle stage set | 43% | 99% |
| Avg. time from deal close to CS notification | 2.8 days | 45 seconds |
| MQLs covered within 4 hours | Unknown (no tracking) | 94% |
| New customers without an onboarding task | 40% | 0% |
| Revenue from re-engaged Bad Timing contacts | $0 | $24,000 (2 closed in first month) |
| Admin time spent on manual stage updates | ~6 hrs/week | 0 hrs/week |
A marketing agency built a "Welcome to our community" workflow with a trigger of "Lifecycle Stage changes to Lead." They intended this to fire for all new leads going forward. But when they clicked Activate, they missed HubSpot's warning — there were 1,247 existing contacts who currently had Lifecycle Stage = Lead. HubSpot enrolled all of them immediately. 1,247 people received a "Welcome! So glad you just joined us!" email simultaneously. Many were clients of 2+ years. Several called the account manager confused. The unsubscribe rate for that email was 14%.
- 1.Added a date-based enrollment filter: Contact Create Date is after [today's date]. This immediately excluded all existing contacts — only new contacts going forward would enroll.
- 2.Added an unenrollment condition: Lifecycle Stage = Customer or Evangelist. Any existing customer who somehow meets the trigger won't receive the welcome email.
- 3.Sent an apology email to the 1,247 contacts — personalised to acknowledge the error.
Before activating any workflow: look at the eligible contact count in the bottom left of the workflow editor. If it shows more contacts than expected, add a date filter or pause and investigate. Always disable "Enroll existing contacts that currently meet the trigger" unless you explicitly want to process historical records. This check takes 10 seconds. The cleanup takes 10 hours.
A SaaS company's previous admin built one massive "Lead Management" workflow with 47 actions: MQL promotion, SDR notification, lead nurture emails (8 of them), deal creation for high-score leads, Slack integration, task creation, lifecycle stage updates, AND a 14-day re-engagement sequence. When a contact wasn't receiving nurture emails correctly, nobody could figure out where the failure was. The workflow had been edited 11 times by 3 different people. Actions at step 31 referenced a property that was being set by step 44 (which ran after step 31). It had become unmaintainable.
- 1.Paused the monolithic workflow and rebuilt as 7 separate, named workflows: MQL Promotion, SDR Notification, Welcome Email, 14-Day Nurture Sequence, High Score Deal Creation, Slack Integration, Re-engagement.
- 2.Each workflow had one job. Maximum 8–10 actions. Each had a clear name and description.
- 3.The troubleshooting that had taken 4 hours in the monolithic workflow now took 8 minutes because each workflow's purpose and scope was obvious.
One workflow, one purpose. A workflow should do one thing clearly. If you find yourself saying "this workflow handles X and also Y and also Z," stop and split it. The test: can you explain this workflow's entire purpose in one sentence? If not, it's doing too much. Small, focused, named workflows are the hallmark of a mature HubSpot admin.
A digital agency had a marketing team generating 150 leads/month from content. The leads were being manually emailed by one marketing coordinator — 20+ hours/week. The coordinator could only get to about 40% of leads in the first week. The other 60% received their first email 1–2 weeks late, by which point engagement was minimal.
- 1.Enrollment trigger: Lifecycle Stage = Lead AND Lead Source = Organic Search or Social. Filter: Not a current customer.
- 2.Action 1: Set Lead Status = New. Action 2: Set Lead Date = Today. Action 3: Send Email 1 — "The guide you requested + 3 quick tips." Sent immediately on enrollment.
- 3.Day 3 delay → Branch: Did they open Email 1? If yes: send Email 2 — case study. If no: send alternate Email 2 — different subject line angle.
- 4.Day 7 delay → Branch: Did they click any email? If yes: enrol in SDR sequence (warm lead). If no: delay 7 more days, then send re-engagement email with survey link.
- 5.Unenrollment: Lifecycle Stage = MQL or beyond (they've been promoted). OR Email opt-out is true. OR Contact submits any form (they self-qualified).
100% of leads now received Email 1 within 60 seconds of becoming a Lead — up from 40% in the first week. The marketing coordinator's 20 hours/week of manual emailing dropped to 2 hours/week (reviewing results and making content updates). Lead-to-MQL conversion rate increased from 8% to 17% — because timely, behaviour-branched emails significantly outperformed a manually-managed flat sequence. The coordinator's time was reinvested into content creation, which increased organic lead volume by 23% over the same quarter.
- 01 — No unenrollment conditions on nurture workflowsEvery lead nurture workflow must unenroll contacts when Lifecycle = Customer. Without this, paying customers receive "discover why you should try us" emails indefinitely. Add unenrollment conditions before activating any outbound sequence.
- 02 — Not enabling re-enrollment when the trigger can fire multiple timesA lead scoring workflow that only runs once misses contacts who later hit a higher threshold. Check: should this workflow run once per contact, or every time the trigger condition is met? Wrong setting = workflow appears to "stop working" for returning contacts.
- 03 — Activating without checking eligible contact countHubSpot shows how many existing contacts will immediately enroll. If this number is wildly different from your expectation — stop. Fix the trigger or add a date filter before activating. Activating with too many eligible contacts can send thousands of unexpected emails in seconds.
- 04 — Overwriting manually-set properties without "don't overwrite"A workflow setting Lead Status = New every time a contact reaches MQL erases a rep's manually-set "In Progress" or "Bad Timing" status silently. For properties reps also manage, always enable "Don't overwrite existing values."
- 05 — Building monolithic workflows with too many actionsA 45-action workflow that handles everything is impossible to debug, maintain, or hand off to another admin. Split into focused, single-purpose workflows. One workflow, one job.
- 06 — No naming convention or descriptionAfter 6 months: 80 workflows named "Test," "Copy of," "New MQL flow v3." Impossible to audit. Future admins spend hours reverse-engineering what each does. Enforce naming and descriptions from day one.
- 07 — Testing in productionNever build and activate a new workflow directly in your live portal. Test in sandbox. Verify triggers, filters, actions, and re-enrollment behaviour with test contacts. Then rebuild in production. This is especially critical for any workflow that sends emails.
- 📋One workflow, one purpose. If you can't explain a workflow in one sentence, it's doing too much. Split it. Small, focused, named workflows are infinitely easier to build, debug, maintain, and hand off.
- 🏷️Naming convention on every workflow.
[Object] [Team] Purpose — Trigger. Non-negotiable. Enforce it for every workflow in every portal you manage. - 📝Description field is documentation. Purpose, owner, last-updated date, any gotchas. Future-you will thank present-you every single time.
- 🧪Test in sandbox before production. Always. No exceptions for workflows that send emails, set properties, or create records.
- 🔢Check eligible count before activating. The 10-second check that prevents hour-long cleanup sessions. If the count is unexpected, investigate before proceeding.
- 🚪Set unenrollment conditions on every nurture flow. Lifecycle = Customer is the minimum. Add: email opted out, form submission (self-qualified), sequence enrolled (already in sales outreach).
- 📅Use "delay until day and time" for human-feeling automation. Actions that fire at 3am on Sunday erode trust in the system. Delays until Monday 9am make automation feel intentional.
- 🗓️Quarterly workflow audit. Review all active workflows. Pause/archive inactive ones. Check enrollment counts. Look for conflicts. Governance is how you maintain a healthy system as it grows.
Do this in your free HubSpot sandbox — approximately 60 minutes across three workflows.
Workflow 1 — Blank lifecycle catchall (10 min)
- Automation → Workflows → Create workflow → Contact-based → Start from scratch
- Trigger: Contact property → Lifecycle Stage → is unknown
- Action: Set contact property → Lifecycle Stage → Lead. Enable "Don't overwrite."
- Name it:
[Contact] AUTO — Lifecycle Default — New Contact. Add description. - Before activating: check eligible count. Activate with "Enroll existing contacts" ON — you want all blank-stage contacts to get a stage.
Workflow 2 — Form submission follow-up (20 min)
- Create a new Contact-based workflow. Start from scratch.
- Trigger: Marketing → Form submission → any form you created earlier.
- Enrollment filter: Lifecycle Stage is not equal to Customer (don't enroll existing customers).
- Actions: (1) Set Lifecycle Stage = Lead. (2) Set Lead Status = New. (3) Send internal email notification to yourself. (4) Create task: "Follow up with {{contact.firstname}} — form submitted today."
- Unenrollment: Lifecycle Stage = Customer.
- Name it. Add description. Activate with "Don't enroll existing" option.
- Submit your test form from the previous module. Check: did the Contact get the stage? Did you receive the notification? Was a task created?
Workflow 3 — Branching based on company size (30 min)
- Create a new Contact-based workflow. Trigger: Lifecycle Stage changes to Lead.
- Filter: Lead Status = New (only newly created leads, not existing ones).
- Action: Delay until next business day at 9:00am.
- Add an If/Then branch: condition = Company Employees ≥ 50.
- YES path: Set Lead Status = In Progress. Create task: "Enterprise lead — call today."
- NO path: Set Lead Status = New. Send email: a self-serve resource email (you can use any published email).
- Unenrollment: Lifecycle Stage is any of Customer, Evangelist.
- Name it. Add description. Activate for new contacts only.
- Create two test contacts manually: one with Employees = 100, one with Employees = 10. Watch them flow through different paths.
| Concept | Key point |
|---|---|
| What is a workflow | Automated rule: when [trigger] + [filters] → execute [actions]. Runs 24/7 without human input. |
| Three required parts | Enrollment Trigger + Enrollment Filters + Actions |
| Trigger | The event that starts the enrollment check (property change, form submit, date, list join) |
| Filter | Secondary AND conditions — narrows who actually enrolls after the trigger fires |
| Actions | Execute sequentially, top to bottom. Set property, send email, create task, notify, branch, delay. |
| Single enrollment (default) | Contact enters once, never re-enters — even if trigger fires again |
| Re-enrollment | Must be explicitly enabled — allows re-entry when trigger conditions are met again |
| Unenrollment | Conditions to pull contacts out mid-workflow — ALWAYS set on nurture workflows: Lifecycle = Customer |
| Branch | If/then split — routes contacts down different paths based on conditions |
| Delay | Pauses execution — fixed time, until a date, or until a specific day/time (use for business hours) |
| "Don't overwrite" | Protects existing property values from being overwritten — use for rep-managed and date-stamp properties |
| Object types | Contact (~80%), Deal, Ticket, Company, Quote, Conversation |
| Naming convention | [Object] [Team] Purpose — Trigger descriptor |
| Must-have description | Purpose · Owner · Last updated date — in every workflow, no exceptions |
| Eligible count check | Always check before activating — if count is unexpected, investigate before proceeding |
| Architecture rule | One workflow, one purpose. Split if you can't explain it in one sentence. |
| 8 essential workflows | MQL promotion · Deal close onboarding · Blank stage catchall · Bad timing re-engage · Stale MQL alert · Form follow-up · Deal stage automation · Date-stamp properties |
| Admin interview gold | "I build small, focused, named workflows — one purpose per workflow. Always test in sandbox. Always check eligible count. Always set unenrollment on nurture flows." |
Workflows are the operational nervous system of your CRM. Every data quality standard, every inter-team handoff, every SLA — enforced through workflows. They do three things that define a mature RevOps practice: they make data quality automatic (not aspirational), they make handoffs instant and reliable (not dependent on humans remembering), and they make your CRM self-documenting (every action logged, every change traceable). A HubSpot portal with well-designed workflows runs itself at the data layer. The admin's job shifts from manual execution to system design, monitoring, and refinement. That is the transition from admin to RevOps practitioner — and workflows are where it happens.