Prereq: read
bulk-operations/SKILL.md
first — JSONL piping, dry-run/digest, history, and rate-limit hygiene live there. This skill is the upsert-by-natural-key workflow on top.
The core move: upsert, not search-then-create
hubspot objects upsert --type X --id-property
reads JSONL on stdin and creates-or-updates each row in
one CLI call per record
, keyed by a property (email for contacts, domain for companies). No race window, no branching. Do not loop
search
→ empty? →
create
.
Per line in:
{"id":"jane@example.com","properties":{"firstname":"Jane","jobtitle":"VP"}}
Per line out:
{"id":"123","ok":true,"data":{...,"new":true|false}}
or
{"ok":false,"error":{...}}
. Order matches input.
CSV/JSONL → upsert stream
Reshape with
jq
, preview with
--dry-run
, then execute. Always lowercase the natural key — CRM match is exact. Confirm available property names with
hubspot properties list --type contacts
; never hard-code a list. See
bulk-operations/resources/json-patterns.md
for reshape idioms.
csvjson external.csv
|
jq
-c
'.[]'
external.jsonl
Show more
Installs
860
Repository
hubspot/agent-cli-skills
GitHub Stars
18
First Seen
May 26, 2026
Security Audits
Gen Agent Trust Hub
Pass
Socket
Pass
Snyk
Pass