Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
hubspot avatar

Sales Execution

  • 817 installs
  • 18 repo stars
  • Updated July 23, 2026
  • hubspot/agent-cli-skills

sales-execution is an agent skill that documents HubSpot CLI property names and enums for creating sales activities (calls, notes, meetings, tasks).

About

sales-execution is a HubSpot agent-cli-skills reference packaged for coding agents that create CRM activities from the terminal. Indie builders wearing sales hats often fail creates because HubSpot’s property surface is huge and enum values are not always visible through `hubspot properties get`. This skill compresses the fields you actually need for calls, notes, meetings, and tasks—including HTML-capable bodies, duration in milliseconds, and portal-specific disposition codes—so `hubspot objects create` commands succeed on the first try. It explicitly tells you to verify enum values against your portal when the CLI rejects a value, which matches how solo operators iterate on a live HubSpot account. Use it when you are automating post-demo notes, logging outbound calls, or backfilling meeting outcomes without opening the HubSpot UI for every record.

  • Quick reference for four HubSpot activity object types: calls, notes, meetings, and tasks
  • Documents required Unix-ms `hs_timestamp` fields and enum values CLI property listing does not surface
  • Covers call direction INBOUND/OUTBOUND and status enums through COMPLETED, MISSED, and NO_ANSWER
  • Meeting outcomes include SCHEDULED, COMPLETED, RESCHEDULED, NO_SHOW, and CANCELLED
  • Notes that `hubspot properties list --type calls` is noisy with on the order of ~80 properties—this skill narrows to act

Sales Execution by the numbers

  • 817 all-time installs (skills.sh)
  • +104 installs in the week ending Aug 2, 2026 (Skillselion tracking)
  • Ranked #99 of 853 Sales & Marketing skills by installs in the Skillselion catalog
  • Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/hubspot/agent-cli-skills --skill sales-execution

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs817
repo stars18
Last updatedJuly 23, 2026
Repositoryhubspot/agent-cli-skills

What it does

Log HubSpot calls, notes, meetings, and tasks from the agent CLI with correct property names, enums, and required timestamps so founders can run sales motion without guessing portal field IDs.

Who is it for?

Best when you use HubSpot CRM + agent CLI to record pipeline touchpoints during early customer development.

Skip if: Skip if you're not on HubSpot or developers and only need marketing email automation without CRM activity objects.

When should I use this skill?

You use `hubspot objects create --type {calls|notes|meetings|tasks}` and need exact property names, required timestamps, and enum literals.

What you get

You run correct `hubspot objects create` commands with required timestamps, valid enums, and the right HTML fields for each activity type.

  • Valid HubSpot activity create payloads with correct property keys
  • CLI commands for calls, notes, meetings, or tasks with required hs_timestamp fields

By the numbers

  • Four documented activity object types: calls, notes, meetings, tasks
  • Calls property list noise on the order of ~80 HubSpot properties when listing via CLI

Files

SKILL.mdMarkdownGitHub ↗

Resources

FileWhen to use
resources/activity-properties-reference.mdProperty names and enum values for calls/notes/meetings/tasks. Keep open while writing objects create — enum values are not discoverable via hubspot properties get today.

Read bulk-operations/SKILL.md first — this skill assumes its batching, pipe, and dry-run patterns.

The two non-obvious rules

1. Activities are invisible until associated. hubspot objects create --type calls ... alone produces a record nobody can see in the CRM UI. Always follow with hubspot associations create --from calls:<id> --to contacts:<id> (and the deal, if relevant) before stopping.

2. Timestamps differ between write and read.

PathFieldFormat
objects create --property hs_timestamp=...hs_timestampUnix ms (13 digits)
objects get --type calls <id> returnsproperties.hs_timestampUnix ms (string)
activities list --contact <id> returnstimestamp (flat, top-level)ISO 8601 (e.g. 2024-01-15T10:00:00Z)

Current Unix ms: $(date +%s)000 (macOS) or $(date +%s%3N) (Linux). activities list rows are {"id","type","timestamp","title","body","status","owner_id"} — the cross-type timeline read shape, no raw property names.

Create + associate, by type

# CALL
call_id=$(hubspot objects create --type calls \
  --property hs_call_title="Discovery call" \
  --property hs_call_body="Confirmed $50K budget, Q2 timeline." \
  --property hs_call_direction=OUTBOUND \
  --property hs_call_status=COMPLETED \
  --property hs_call_duration=1800000 \
  --property hs_timestamp=$(date +%s)000 \
  --format json | jq -r '.id')
hubspot associations create --from calls:$call_id --to contacts:149
hubspot associations create --from calls:$call_id --to deals:456

# NOTE
note_id=$(hubspot objects create --type notes \
  --property hs_note_body="Sent proposal. Follow-up Friday." \
  --property hs_timestamp=$(date +%s)000 \
  --format json | jq -r '.id')
hubspot associations create --from notes:$note_id --to deals:456

# MEETING — start/end in Unix ms; reuse start as hs_timestamp
start=$(date +%s)000; end=$(( ${start%000} + 3600 ))000
meeting_id=$(hubspot objects create --type meetings \
  --property hs_meeting_title="Demo — Acme" --property hs_meeting_outcome=COMPLETED \
  --property hs_meeting_start_time=$start --property hs_meeting_end_time=$end \
  --property hs_timestamp=$start --format json | jq -r '.id')
hubspot associations create --from meetings:$meeting_id --to contacts:149

# TASK — hs_timestamp is the DUE DATE, not creation time
due=$(( $(date -v+7d +%s) * 1000 ))   # macOS; Linux: date -d '7 days' +%s
task_id=$(hubspot objects create --type tasks \
  --property hs_task_subject="Confirm proposal received" \
  --property hs_task_priority=HIGH \
  --property hs_task_status=NOT_STARTED \
  --property hs_task_type=CALL \
  --property hs_timestamp=$due \
  --format json | jq -r '.id')
hubspot associations create --from tasks:$task_id --to deals:456

Open tasks for a contact — two CLI calls, no xargs

associations list emits {"id","type"} per row; objects get reads from stdin in one batch call (see bulk-operations/SKILL.md "Read in batch").

hubspot associations list --from contacts:149 --to tasks \
| hubspot objects get --type tasks \
    --properties hs_task_subject,hs_task_status,hs_task_priority,hs_timestamp \
| jq -c 'select(.properties.hs_task_status != "COMPLETED")'

Bulk: follow-up task per deal in a stage

The deal ID and the task ID must travel together. Persist the deal payload to a file, create tasks (output order matches input order — see bulk-operations), then zip the two ID lists line-by-line and stream association pairs in one call.

due=$(( $(date -v+7d +%s) * 1000 ))

# 1. Per-deal payload, deal_id retained alongside the create payload.
hubspot objects search --type deals --filter "dealstage=appointmentscheduled" \
  --properties dealname \
| jq -c --argjson due "$due" '{deal_id: .id, payload: {properties: {
    hs_task_subject: ("Follow up: " + .properties.dealname),
    hs_task_priority: "HIGH", hs_task_status: "NOT_STARTED", hs_task_type: "CALL",
    hs_timestamp: ($due|tostring)
  }}}' > /tmp/deal_tasks.jsonl

# 2. Create tasks; one CLI call for the whole batch.
jq -c '.payload' /tmp/deal_tasks.jsonl \
| hubspot objects create --type tasks > /tmp/created_tasks.jsonl

# 3. Zip and stream association pairs through stdin.
paste \
  <(jq -r '.deal_id' /tmp/deal_tasks.jsonl) \
  <(jq -r '.id'      /tmp/created_tasks.jsonl) \
| jq -Rc 'split("\t") | {from:("tasks:"+.[1]), to:("deals:"+.[0])}' \
| hubspot associations create

For >100 rows, apply the dry-run / digest / confirm pattern from bulk-operations/SKILL.md.

Known constraints

Activities must be associated immediately or they're invisible in the CRM UI. properties get doesn't return enum option values for activity types — use the reference. No sequences/cadences in the CLI.

Related skills

How it compares

CRM activity field reference for the HubSpot CLI—not a full outbound sequencing or enrichment integration.

FAQ

Who is sales-execution for?

Developers and small teams using HubSpot’s agent CLI skills to record calls, notes, meetings, and tasks from Claude Code, Cursor, or Codex.

When should I use sales-execution?

In grow/lifecycle work whenever you automate logging a sales call, meeting outcome, or follow-up task right after customer conversations.

Is sales-execution safe to install?

It is reference documentation; still review Security Audits on this page and treat HubSpot API tokens as secrets with least-privilege scopes.

Sales & Marketingfinancepricing

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.