How do I rebuild Salesforce Flows as HubSpot workflows when migrating?
Concept by concept. Nothing converts a Flow into a workflow, so each Salesforce automation maps to a HubSpot enrollment filter plus native actions: Rotate record to owner for assignment rules, Edit record and Create record for lead conversion, scheduled enrollment for batch flows, a required property on a pipeline stage for approval gates. Sales Hub Professional covers most of it. The trap is the four patterns with no native equivalent: subflows, multi-step approvals, formula fields in entry criteria, record-level locking.
The 29 specs, in build order
Each spec states its minimum tier. Free ones open in full; the others show their public preview and the date their full spec lands.
Show the 2 other specs in this group
Show the 2 other specs in this group
Show the 3 other specs in this group
What a spec looks like
Every spec follows the same nine sections, so a team reads one and knows how to read all of them.
- Outcome, when to use it and when not to
- Prerequisites: properties, lists, tiers, with the JSON to create them
- Enrollment and re-enrollment, then every step with its parameters
- Known pitfalls, a test plan, variants, and the YAML build spec
What breaks, and how the specs prevent it
A form's own set lifecycle stage option never moves a contact backwards, and a workflow that writes a lower stage ends up fighting the rest of the portal. Migrated records land at whatever stage your mapping chose and stay there. One spec here corrects regressions against a Highest lifecycle stage reached property, and it needs a one-time backfill before you turn it on, or every contact reads as forward movement on the first pass.
Validation rules and duplicate rules stop a bad record at the point of save in Salesforce. HubSpot workflows run after the record exists, so every check here is detect and flag: a status property, a review list, a task with a real owner. There is no merge action on any tier either, so the duplicate queue produces a human decision, not a merge. Required properties on a pipeline stage and on the create form are the only preventive controls, and the create form setting only gates manual creation in the interface, not imports or API writes.
A flow entry condition can read a formula field. A HubSpot enrollment filter compares a property to a fixed value, does no arithmetic, and cannot rank picklist values, which is why the stage regression spec carries a numeric Stage Order property and a snapshot to compare against. Build the calculated property first, then filter on the plain number. Exiting works the same way: there is no Remove from workflow action, so unenrollment belongs to the target workflow's own criteria, checked as the record moves between steps rather than only at entry.
What this bundle builds
The inventory always comes back bigger than the scoping call suggested. Two hundred active Flows, forty of them scheduled, a dozen validation rules nobody can explain, and one approval process that three people depend on. Most of it does not need to move.
What this collection gives you is the working set: the twenty-nine HubSpot workflows that cover the Salesforce automation patterns which actually appear on every migration. Leads get an owner by rotation, by territory or by country, and the existing-customer exception routes to the account owner instead of the pool. The Convert button becomes a lifecycle stage change plus a deal created on qualification, with the company matched by email domain. Stage automation fires on a property change and writes forecast category, probability and the backward-move flag. The batch jobs come back as scheduled enrollment, and the date-anchored reminders as delays measured against a contract end date.
The last component is the one that decides whether the migration lands well. Approvals, validation rules, duplicate rules and case escalation all behave differently here, and the specs are written around what HubSpot can genuinely do rather than what the old system did.
How the pieces fit together
Assignment first, because everything downstream assumes an owner exists. Build the flat rotation, confirm the pool, then add the territory or country branches once that property is reliable, then the customer exception and the deactivated-owner sweep. Six shared properties carry through this whole component, starting with Lead routed date, which every later SLA and reporting spec reads.
Lead conversion next, and it is worth doing before the data import, not after. Agree the Lead Status to Lifecycle stage mapping, build the score threshold in one workflow so sales gets one answer, then the deal creation on qualification. The domain-matching spec needs the company domain data to be clean already, so run it after the company import, not during.
Stage automation and the scheduled jobs can be built in parallel by two people. Both depend on pipeline stage internal names, which you confirm once and reuse. Leave the approval and duplicate component for last: it depends on pipeline settings, on named approvers, and on somebody owning a review queue, an organizational decision more than a build.
What you get
- 29 specs, each as PDF and Markdown, with enrollment criteria, step list, diagram, test plan and the known pitfalls written out.
- A 38-row Salesforce to HubSpot mapping table on this page, free to read, covering the concepts that come up on every project.
- Properties JSON: 45 property definitions across contacts, companies, deals and tickets, including the flag and snapshot properties these workflows depend on.
- Workflow JSON in Automation API format, switched off, so nothing runs before you have read it.
- Custom coded actions: 4, all in the data-quality specs. The other 25 run on native actions.
- Tier stated per spec: 17 Sales Hub Professional, 4 Marketing Hub Professional, 3 Service Hub Professional, 4 Data Hub Professional, 1 Sales Hub Enterprise.
- 15 static lists and review queues named and specified, not left as an exercise.
- Test plans that cover the negative path: the record with no territory, the blank required field, the duplicate that is not a duplicate.
- Install in one click for Full and Agency buyers.
Who it is for, and who should skip it
This is for the migration agency running its fourth or fifth Salesforce exit and tired of rediscovering the same four gaps, and for the RevOps lead who has to tell an exec committee which automations survive the move and which ones need a process change. About sixteen hours of build sits here at an honest pace with testing.
Skip it if your Salesforce org is mostly standard objects with no custom automation, where the category packs are cheaper. Skip it if you are on Starter, since most of these specs will not load. And if the five patterns with no native equivalent are your actual problem, wait for the migration kit rather than buying around it.
Salesforce Flow to HubSpot workflow: the mapping
| Salesforce concept | What it does | HubSpot equivalent (native action or pattern) | Spec | Gap or note |
|---|---|---|---|---|
| Lead assignment rule | First matching rule sets the owner or drops the lead in a queue | If/then branch on a property, then Rotate record to owner against a static list or an active Team | lead-routing-001 | Branch order works like rule order, first match wins. No rule entry grid to import. |
| Case assignment rule | Routes a case to a support queue | Branch on a ticket queue property, then Rotate record to owner per pool | tickets-sla-001 | Service Hub Professional. The queue value has to be set upstream by a form, a chatflow or a classification workflow. |
| Queue (Lead, Case) | Group-owned bucket records sit in until someone claims them | No queue object. A static list plus a rotation pool, with a single user written as owner | lead-routing-002 | Gap: ownership is always one user. “Unclaimed” is a property value or a list, not a record state. |
| Round robin (Apex or a paid package) | Even distribution across a team | Rotate record to owner, native from Sales Hub Professional | lead-routing-002 | Even by assignment count at run time. Adding a rep does not rebalance past assignments. |
| Territory model | Assigns accounts by territory hierarchy and rules | Branch on a territory or country property, one rotation pool per territory | lead-routing-001, lead-routing-006 | Gap: no territory object, no inherited hierarchy. The mapping lives in branch conditions you maintain by hand. |
| Account team fallback on inbound inquiry | Existing customer reaches their account owner, not the pool | Branch on Contact owner is known, notify the current owner | lead-routing-019 | Depends on lifecycle stage being accurate, or the customer falls back into new-lead routing. |
| Mass transfer on user deactivation | Reassigns a leaver’s records in bulk | Deactivate to a placeholder user, then rotate those records back into the pool | lead-routing-012 | Gap: the admin has to pick the placeholder during deactivation. One workflow per object type. |
| Lead object | Pre-conversion record, separate from Contact | No Lead object. One contact from first touch, with Lifecycle stage carrying the funnel position | marketing-ops-001 | Gap: nothing to migrate Leads into except contacts. Decide the stage per Lead Status before the import. |
| Lead Status picklist | Tracks working state inside the Lead | Lifecycle stage plus the native Lead status property | marketing-ops-001 | Two fields, two owners. Write down which one sales reports on. |
| Lead scoring (Einstein, Pardot grade) | Numeric score that gates MQL | HubSpot Score in the enrollment filter, threshold kept in one workflow | marketing-ops-001 | Re-enrollment has to be scoped to the score property alone, or the workflow re-checks all day. |
| Convert Lead | Creates Account, Contact and Opportunity in one action with field mapping | Edit record on Lifecycle stage, then Create record for the deal with the contact associated | marketing-ops-002, sales-ops-025 | Gap: no conversion action and no field mapping screen. Rebuild it as two workflows. |
| Lead to Account matching on conversion | Finds the account by domain before creating one | Custom coded action searching companies by domain, then writing the association | data-quality-006 | Data Hub Professional. Free-mail and regional domains need explicit handling inside the code. |
| Unqualified Lead Status | Takes a bad-fit lead out of the funnel | Lifecycle stage Other plus a disqualification reason property | marketing-ops-015 | Reporting only works if the reason list is agreed before go-live. |
| Record-triggered flow, after save, on field change | Runs when a field changes | Filter-based workflow with re-enrollment on that property | deal-hygiene-002 | Re-enrollment is per property. A deal bouncing between two tracked stages fires again each time. |
| Record-triggered flow, before save, same-record update | Fast field update with no extra DML | Edit record inside the same workflow | deal-hygiene-005 | Gap: no before-save path. Every write is a normal update that can trigger other workflows. |
| Path on Opportunity | Stage drives fields and guided next steps | Branch on Deal stage, Create task per stage | deal-hygiene-002 | Renaming a stage in settings breaks the branch silently, with no error surfaced. |
| Forecast Category mapped from Stage | Native Salesforce mapping | Branch mapping each stage to a forecast category property | deal-hygiene-005 | The native forecast property may not be workflow-writable. Custom fallback property, then fix the reports. |
| Probability mapped from Stage | Native Salesforce mapping | Branch mapping each stage to a number property | deal-hygiene-011 | Gap: workflows do no arithmetic, so amount times probability needs a calculated property or the Forecast tool. |
| Formula field inside a flow entry condition | Entry criteria reads a computed value | Build the calculated property first, then filter on the plain number | deal-hygiene-011, deal-hygiene-020 | Gap: the enrollment filter has no formulas. One of the five patterns in the planned migration kit. |
| Picklist sort order compared inside a flow | Detects a backward move | Numeric order property plus a snapshot property, compared on each run | deal-hygiene-020 | Gap: workflows cannot rank enumeration values. The snapshot only updates when the workflow runs. |
| Cross-object field update, Opportunity to Account | Flow writes to the parent record | Deal-based workflow writing to the primary associated company and contact | marketing-ops-048 | Depends on the primary association being correct. Copying across an association at scale needs Data Hub. |
| Lifecycle or stage rollback inside a flow | Sets a status field to any earlier value | Correction workflow against a highest-stage-reached property | marketing-ops-035 | Gap: forms never move a contact backwards and the correction runs after a short delay, not in real time. |
| Validation rule | Blocks the save and shows an error message | Required properties per pipeline stage, plus a detect-and-flag workflow | deal-hygiene-004 | Gap: a workflow runs after the record exists. It can chase, never block. |
| Required field on a page layout | Blocks the save in the interface | Required property on the record create form | data-quality-001 | Gates manual creation in the interface only. Imports, API calls and workflow-created records walk past it. |
| Duplicate rule plus matching rule | Warns or blocks on save | Custom coded action searching the CRM at creation, review list and a task | data-quality-002, data-quality-008 | Gap: detect only. Two reps can work both records until someone clears the queue. |
| Merge from a duplicate alert | Merges the two records in place | Manual merge in the record interface | data-quality-002 | Gap: no merge action in workflows on any tier. The queue produces a human decision. |
| Approval process, single step | Submit for approval, lock the record, approve or reject | Approver property, task, gate property, and a required property on the stage before Closed Won | deal-hygiene-015 | Gap: no approval object, no record lock, no submit button. Field-level control needs Sales Hub Enterprise. |
| Approval process, multi-step or dynamic approver | Chained approvers, recall, delegation | No equivalent. Chained tasks and status properties, one step at a time | none yet | Gap: one of the five patterns in the planned five-spec migration kit. |
| Case escalation rule | Escalates on elapsed time against an entitlement | SLA goals on the help desk pipeline, workflow on SLA status Overdue | tickets-sla-005 | Service Hub Professional. Without SLA goals configured the property never populates and nothing enrolls. |
| Entitlement process and milestones | Time targets per account tier | SLA goals per pipeline and per priority | tickets-sla-005 | Gap: entitlements per account are not modelled. Account tier lives on a property and drives the branch. |
| Escalation level by level | L1 to L2 to L3 on elapsed time | Delay, check status, notify the next escalation contact property | tickets-sla-015 | Gap: no manager lookup below Enterprise teams. Each level is its own HubSpot user property. |
| Scheduled flow, nightly batch | Runs on a schedule over a filtered set | Scheduled workflow enrollment, criteria re-evaluated on each run | lead-routing-021, data-quality-048 | Runs on the portal timezone. No aggregate count of what a run touched, that needs a saved report. |
| Scheduled path inside a record-triggered flow | Waits, then re-checks | Delay for N days, then a branch | deal-hygiene-001 | The branch re-checks at expiry. A record changed in the same minute can race the evaluation. |
| Time-based workflow action on a date field | Fires N days before a date | Delay until X days before a date property | renewal-expansion-002 | Delays do not recalculate. If the date moves after enrollment, the schedule keeps the old one. |
| Flow that creates a record from a date | Opportunity created from a contract end date | Create record action, owner taken from the company owner | renewal-expansion-001 | Filter-based enrollment fires once when the record first matches. A flag property stops a second deal. |
| Subflow or invocable flow | Reusable logic called with inputs and outputs | Enroll in another workflow | none yet | Gap: no input parameters, no return value. The child reads the record and nothing else. In the planned kit. |
| Apex trigger or invocable Apex | Code that runs on save | Custom code action in JavaScript or Python | data-quality-002 | Data Hub Professional. Twenty seconds and 128 MB per execution, plus a rate limit you set per action. |
| Email alert from a flow | Sends a templated internal email | Send internal email notification | lead-routing-001 | Recipient can be the record owner or a user property. A hardcoded person breaks when they leave. |
| Process Builder and Workflow Rules | Older automation layered on the same object | One workflow per outcome, scoped by its enrollment filter | deal-hygiene-002 | Two workflows writing the same property will fight. Decide which one owns each field before build. |
Questions admins ask
Is there a Salesforce Flow to HubSpot workflow converter?
No. Nothing reads a Flow definition and produces a workflow, and no vendor tool does it either. The migration is a concept-by-concept rebuild: you inventory the active Flows, assignment rules, validation rules and approval processes, then map each one to an enrollment filter plus native actions. The mapping table on this page covers the thirty-eight concepts that come up on almost every project.
What is the HubSpot equivalent of a Salesforce assignment rule?
An If/then branch on a property, followed by Rotate record to owner against a static list or an active Team. Branch order works like rule order, first match wins. What you lose is the rule entry table: there is no grid to import, so each territory or queue becomes a branch condition somebody maintains by hand. Rotation is even by assignment count at run time, and adding a rep does not rebalance past assignments.
How do I replicate lead conversion in HubSpot?
There is no Lead object and no Convert action. A contact exists from first touch and Lifecycle stage carries the funnel position, so conversion becomes two workflows: Edit record moves the stage to Sales Qualified Lead, then Create record opens the deal with the contact associated and the owner taken from Contact owner. Matching the company by email domain is the third piece, and that one needs a custom coded action on Data Hub Professional.
Does HubSpot have approval processes?
Not as an object. The working pattern is an approver property, a notification, a task, and a gate property that only the approver should be able to set, with a required property configured on the pipeline stage before Closed Won so the deal cannot move without it. The workflow itself cannot block the stage change. Multi-step routing, recall and delegation have no equivalent at all, which is why they sit in the planned five-spec migration kit.
Can HubSpot workflows replace scheduled flows and Apex triggers?
Scheduled flows map to a scheduled workflow enrollment that re-evaluates its criteria on each run, on the portal timezone. Apex maps to a custom coded action in JavaScript or Python on Data Hub Professional, with twenty seconds and 128 MB per execution and a rate limit you set per action. Four of the twenty-nine specs here use one. The rest run on native actions at Professional.