Skip to main content
skill CX Codex

workflow-automation · hubspot — Claude Code skill: what it does, how to install

Guides coding agents to manage HubSpot v4 automations via the hubspot agent CLI. Handles JSON inspection, branch flows, safe updates, and deletion.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add HubSpot/agent-cli-skills --skill workflow-automation -a claude-code
Open on GitHub

What workflow-automation does

This skill configures an agent to work with the HubSpot agent CLI (hubspot) rather than the hs developer CLI. It operates strictly on the v4 flows API (/automation/v4/flows), leaving classic v3 contact workflows untouched. Authentication requires either running hubspot auth login with the automation scope or exporting a HUBSPOT_ACCESS_TOKEN service key.

The tool exposes five subcommands: list, get, create, update, and delete. Finding a workflow by name requires piping list output into jq because there is no search command. While create --dry-run verifies JSON syntax, it skips API payload validation — only a live create call catches missing structural properties.

Updates execute a complete PUT replacement where omitted fields such as enrollmentCriteria are silently erased. Safe modification involves pulling the current JSON with get, testing edits through --dry-run, and supplying both the digest hash and flow ID on final execution. Deletion also enforces a dry-run confirmation, requiring the workflow name instead of its ID.

What it helps with

  • export HubSpot v4 workflow definitions into JSON files
  • filter and inspect automations by name using jq
  • deploy branching and converging flows from JSON templates
  • apply full-replace flow updates using safety digests

Example prompts for the agent

  • List all HubSpot workflows in table format
  • Export workflow 12345678 into workflow.json
  • Run a dry-run update for flow 12345678 using workflow.json

How to install workflow-automation

1Skills CLI (Vercel)

npx skills add HubSpot/agent-cli-skills --skill workflow-automation -a claude-code

2Manually: put the files in place

~/.claude/skills/workflow-automation/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/workflow-automation/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about workflow-automation

How do I install workflow-automation in Claude Code?

Run npx skills add HubSpot/agent-cli-skills --skill workflow-automation -a claude-code.

Can I manage classic v3 workflows with this skill?

No. The skill interacts exclusively with the /automation/v4/flows API endpoint, so legacy v3 workflows will not appear in results.

Why does updating a workflow require a dry-run first?

HubSpot updates perform a full PUT that clears omitted fields. The dry-run step generates a required digest hash used with --confirm <flowId> to avoid accidental data loss.

Source text

SKILL.md · Apache-2.0
---
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 — OAuth login or service key

**Every `hubspot workflows` command works with both `hubspot auth login` (user OAuth) and `HUBSPOT_ACCESS_TOKEN` (a service key).** The v4 flows API accepts user tokens; the `automation` scope it needs is now part of the CLI app's requestable scopes, so a plain `hubspot auth login` is enough:

```bash
hubspot auth login          # user OAuth — grant the "automation" scope when prompted
# or
export HUBSPOT_ACCESS_TOKEN=<service-key>   # create at Settings → Integrations → Service keys
hubspot workflows list
```

If a user token 403s with a missing-scope error, re-run `hubspot auth login` so the newly added `automation` scope is granted.

## 1. List + find by name

```bash
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

```bash
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

```bash
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 prints the standard dry-run preview (`mutation_kind`, `target`, `impact`) 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`, and the preview does not echo the body back). 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>`.

```bash
# 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

```bash
# 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

- `list` covers only v4 flows. Classic contact-based workflows from `/automation/v3/workflows` are not returned.
- No `hubspot workflows search` — `list | jq` is the workaround.
- `hubspot segments` provides 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 through `hubspot workflows create` / `update` — get the list ID with `hubspot segments list` / `get` and copy the `enrollmentCriteria` shape from a real `workflows get` (see `resources/workflow-json-reference.md`). No UI step required.
- Sales Hub sequences are a separate surface from workflows: `hubspot sequences` reads 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.read` scope). Workflow create/update/delete stays under `hubspot workflows`. This surface grows; recheck `hubspot --help` / `CHANGELOG.md` before assuming an API is missing.
- `dataSources` is read-only — cannot be rewired via update.

© HubSpot · Apache-2.0 · HubSpot/agent-cli-skills

Similar skills

All skills for Automation and no-code: n8n, Zapier, Make →

workflow-automation by other authors comes first.

workflow-automation sickn33 Teaches durable execution for multi-step jobs: when a step dies mid-flow, the workflow picks up where it stopped instead of replaying from the start. CX Codex +1 1,500installs workflow-automation JoelLewis A skill for designing human-in-the-loop processes: task routing, approval chains, maker-checker controls and SLA monitoring. CX Codex +1 646installs workflow-automation davila7 A skill that turns your agent into a workflow architect: durable execution, platform tradeoffs and patterns for jobs that must not lose state. 1,661installs remotion-render official Remotion Exports videos and static stills from Remotion projects using CLI commands. CX Codex GP ChatGPT 3installs recipe-share-event-materials official googleworkspace This skill reads Google Calendar attendees and gives them reader access to a Google Drive file. Use it when meeting materials need to reach every guest. CX Codex +1 29,700installs blogwatcher openclaw A skill that has the agent manage a list of blogs and RSS/Atom feeds through the blogwatcher CLI: add sources, scan for updates, mark articles read. CX Codex +1 5,400installs ego-browser citrolabs Connects the ego-lite Chromium browser to AI agents for web automation, form filling, screenshots, and QA testing using existing logged-in sessions. CX Codex +1 12,200installs composio ComposioHQ This skill routes Composio tasks for a personal agent or a product with user-connected accounts, from setup and integration to tool runs and troubleshooting. CX Codex +1 8,100installs remote-browser browser-use Controls an isolated Browser Use Cloud session via the CLI. It helps agents automate web tasks on machines where a local Chrome is absent. CX Codex +1 4,700installs

From the same set15

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor