workflow-automation
hubspot/agent-cli-skills
Manage HubSpot v4 workflows (list, create, update, delete) via the hubspot agent CLI.
What is workflow-automation?
Control HubSpot automation workflows programmatically using the `hubspot workflows` command suite. Use this skill to list, inspect, create, update, and delete v4 flows (not classic v3 contact workflows). Requires a HubSpot service key for authentication.
- List all v4 workflows with filtering and pagination support
- Retrieve full workflow definitions including actions, enrollment criteria, and branching logic
- Create new workflows from JSON templates with dry-run validation
- Update existing workflows with full-replace semantics and safety gates (digest/confirm)
- Delete workflows with destructive confirmation and audit trail recovery
How to install workflow-automation
npx skills add https://github.com/hubspot/agent-cli-skills --skill workflow-automation- HubSpot service key (create at Settings → Integrations → Service keys)
- Export HUBSPOT_ACCESS_TOKEN environment variable with the service key value
- hubspot agent CLI installed (not the hs developer CLI)
How to use workflow-automation
- 1.Set your service key: export HUBSPOT_ACCESS_TOKEN=<your-service-key>
- 2.List workflows: hubspot workflows list to see all v4 flows
- 3.Fetch a workflow template: hubspot workflows get <id> > workflow.json
- 4.Edit the JSON (preserve revisionId and type fields)
- 5.Dry-run create: hubspot workflows create --file workflow.json --dry-run
- 6.Apply create: hubspot workflows create --file workflow.json
- 7.For updates, run get → edit → dry-run with --digest → apply with --digest and --confirm flags
- 8.For deletes, run --dry-run first to get the digest, then re-run with --digest and --confirm <workflow-name>
Use cases
- Automate lead routing and nurture workflow creation across multiple HubSpot instances
- Duplicate and modify existing workflows programmatically without manual UI steps
- Audit and version-control workflow definitions by exporting to JSON
- Build branching workflows with convergence paths that route contacts through multiple conditions
- Integrate workflow management into CI/CD pipelines for marketing automation deployment
- HubSpot administrators automating workflow management at scale
- Marketing operations engineers building repeatable automation templates
- Integration developers embedding HubSpot workflow control in larger systems
- DevOps teams managing multi-instance HubSpot deployments
workflow-automation FAQ
The hubspot CLI (agent CLI) manages CRM data and automation with native workflow commands. The hs CLI (@hubspot/cli) is for developers building themes, modules, and extensions — it has no workflow management. Use hubspot workflows ... for this skill, not hs.
The v4 flows API requires a service key, not user OAuth. Create a service key at Settings → Integrations → Service keys and export it as HUBSPOT_ACCESS_TOKEN before running any workflow commands.
There is no search subcommand. Use hubspot workflows list | jq -c 'select(.name | test("pattern"; "i"))' for case-insensitive substring matching or select(.name == "exact name") for exact match.
Create --dry-run does not validate the body — it echoes back ok:true even if required fields like type or actions are missing. Only the live create call validates. Update --dry-run does reject missing required fields like revisionId. Always start from a full get response for updates.
No. The list and get commands cover only v4 flows (/automation/v4/flows). Classic contact-based workflows from /automation/v3/workflows are not returned or manageable through this skill.
Full instructions (SKILL.md)
Source of truth, from hubspot/agent-cli-skills.
name: workflow-automation
description: List, inspect, create, update, and delete HubSpot workflows (v4 flows API) from the hubspot agent CLI, not the hs developer CLI. Classic v3 contact-based workflows are not covered.
triggers:
- "workflow"
- "automation"
- "automated flow"
- "enrollment trigger"
- "find workflow by name"
- "duplicate workflow"
- "update workflow"
- "delete workflow"
- "create a workflow"
- "create a workflow with the hubspot cli"
- "build an automation"
- "does the cli support workflows"
Which CLI
Two different HubSpot CLIs share a confusing resemblance — don't mix them up:
hubspot— the HubSpot agent CLI that this skill library targets. It manages CRM data and automation, and it does have native workflow commands:hubspot workflows list|get|create|update|delete.hs— the HubSpot developer CLI (@hubspot/cli), for building dev projects: themes, modules, serverless functions, UI extensions, and private apps (hs project,hs upload,hs create). It does not create or manage workflow records.
To create or manage a workflow, use hubspot workflows ... — not hs.
If anything here ever drifts, hubspot workflows --help and hs --help are authoritative.
Resources
| File | When to use |
|---|---|
resources/workflow-json-reference.md | Body shape for create/update — the action graph, branching/convergence, enrollment, full-PUT pitfall |
resources/example-contact-flow.json | Minimal valid CONTACT_FLOW skeleton for hubspot workflows create --file |
resources/example-branching-flow.json | Illustrates branch convergence — two paths pointing connection.nextActionId at one shared downstream action |
Source of truth
hubspot workflows --help lists five subcommands: list, get, create, update, delete. There is no search — finding by name is list | jq. For JSONL piping, pagination, and destructive dry-run/digest/confirm patterns, this skill builds on bulk-operations/SKILL.md — re-read that first.
Auth — service key required
Every hubspot workflows command requires HUBSPOT_ACCESS_TOKEN (a service key). None of them work under hubspot auth login (user OAuth) — the CLI rejects them up front with This endpoint does not support user-level OAuth tokens. The automation scope the v4 flows API needs is not available to the CLI's user-level OAuth app, so set a service key before running anything in this skill:
export HUBSPOT_ACCESS_TOKEN=<service-key> # create at Settings → Integrations → Service keys
hubspot workflows list
1. List + find by name
hubspot workflows list # JSONL: id, name, isEnabled, type, objectTypeId, revisionId
hubspot workflows list --format table # for human scanning
# Find by name — case-insensitive substring
hubspot workflows list | jq -c 'select(.name | test("Welcome"; "i"))'
# Exact match
hubspot workflows list | jq -c 'select(.name == "MQL Nurture")'
List reads /automation/v4/flows only. Classic contact-based workflows from /automation/v3/workflows are not returned, so an empty result does not necessarily indicate a missing automation scope. V4 results are paginated at 100 per call; loop with --after until meta.next is empty — see bulk-operations/SKILL.md "Pagination". See resources/json-patterns.md in bulk-operations for more jq filters.
2. Get + read shape
hubspot workflows get 12345678 # one
hubspot workflows get 12345678 87654321 # batch positional
printf '%s\n' 12345678 87654321 | hubspot workflows get # batch stdin
hubspot workflows get 12345678 > workflow.json # save for editing
Get returns the full body (actions, enrollmentCriteria, revisionId, …) — the shape required by create/update. See resources/workflow-json-reference.md.
3. Create from JSON
hubspot workflows create --file workflow.json --dry-run
hubspot workflows create --file workflow.json
cat workflow.json | hubspot workflows create # stdin also works
Set type (CONTACT_FLOW or PLATFORM_FLOW), flowType (WORKFLOW), and objectTypeId (e.g. 0-1 for contacts) — all required on create. See resources/workflow-json-reference.md for the body shape and resources/example-contact-flow.json for the minimal template. Easiest path: get an existing similar workflow as a starting template rather than hand-writing the JSON.
Pitfall: create --dry-run does not validate the body. It echoes the JSON back with ok:true and makes no API call — a green dry-run proves only that the input is well-formed JSON, not that it's a valid create (a body missing type/flowType/objectTypeId/actions still returns ok:true). The only real validation is the live create. By contrast, update --dry-run does reject a body missing required fields like revisionId.
Branching and convergence. A LIST_BRANCH action forks the path on filter criteria; each branch — and the defaultBranch — carries a connection to the action it continues to. Because connections target actions by nextActionId, branches can converge: point two branches at the same actionId and both paths continue to one shared action, no duplication. See the branching section of resources/workflow-json-reference.md and resources/example-branching-flow.json.
4. Update — full PUT, get-modify-put round-trip
Update is a full replace. The body must include revisionId (from get) and type. Read-only fields (createdAt, updatedAt, dataSources) are stripped automatically. Update is gated: dry-run first, then re-run with --digest <hash> --confirm <flowId>.
# 1. Fetch current state
hubspot workflows get 12345678 > workflow.json
# 2. Edit workflow.json (preserve revisionId, type, and any field you want to keep)
# 3. Dry-run — emits a digest
hubspot workflows update 12345678 --file workflow.json --dry-run
# 4. Apply — confirm value is the flow id
hubspot workflows update 12345678 --file workflow.json \
--digest blast-xxxxxxxx --confirm 12345678
Pitfall: partial bodies silently clear fields. Sending only actions will wipe enrollmentCriteria. Always start from the full get response.
5. Delete — destructive, link to bulk safety flow
# 1. Dry-run — emits a digest + the confirm hint
hubspot workflows delete 12345678 --dry-run
# 2. Re-run with digest + confirm. Confirm value is the workflow's NAME, not its id.
hubspot workflows delete 12345678 --digest blast-xxxxxxxx --confirm "New lead routing"
The dry-run output includes an apply_command_hint — copy the exact confirm string from there to avoid quoting surprises. Workflows cannot be restored through the automation API after deletion; check hubspot history --since 1h for an audit record. The full safety pattern (digest, 5-minute expiry, history recovery) is documented in bulk-operations/SKILL.md "Safe destructive workflow".
Known limitations
listcovers only v4 flows. Classic contact-based workflows from/automation/v3/workflowsare not returned.- No
hubspot workflows search—list | jqis the workaround. hubspot segmentsprovides CRM lists (list,get,create,update,update-filters,delete,restore,members-list/members-add/members-remove). List-membership enrollment triggers are part of the workflow body (enrollmentCriteria), so configure them throughhubspot workflows create/update— get the list ID withhubspot segments list/getand copy theenrollmentCriteriashape from a realworkflows get(seeresources/workflow-json-reference.md). No UI step required.- Sales Hub sequences are a separate surface from workflows:
hubspot sequencesreads them (list --user-id <id>,get <id> --user-id <id>,enrollments <contact_id>) but is read-only — no create/update/delete/enroll, and it is not a CRM object type (Sales Hub Professional+,automation.sequences.readscope). Workflow create/update/delete stays underhubspot workflows. This surface grows; recheckhubspot --help/CHANGELOG.mdbefore assuming an API is missing. dataSourcesis read-only — cannot be rewired via update.
Related skills
More from hubspot/agent-cli-skills and the wider catalog.

audience-targeting
Build targeted contact segments by filtering on lifecycle, engagement, job title, geography, and firmographics—then export as JSONL.

bulk-operations
Foundation patterns for bulk operations in the HubSpot CLI — JSONL piping, pagination, dry-run, and recovery.

communication-history
Retrieve CRM activity history and assemble pre-call briefs from calls, emails, notes, meetings, and tasks.

crm-data-quality
Find incomplete records, normalize values in bulk, and dedupe contacts with HubSpot merge operations.

hf-cli
Hugging Face Hub CLI for managing models, datasets, spaces, buckets, and infrastructure.

huggingface-best
Find the best AI model for your task by querying HuggingFace benchmark leaderboards and filtering by device constraints.