
Communication History
Pull HubSpot calls, emails, notes, meetings, and tasks for a contact or deal so agents can prep briefs and transcript exports before customer conversations.
Install
npx skills add https://github.com/hubspot/agent-cli-skills --skill communication-historyWhat is this skill?
- Lists flat activity rows sorted newest-first with id, type, timestamp, title, body, status, owner_id
- Filters by record (--contact, --deal, --company, --ticket) and activity type CALL|EMAIL|NOTE|MEETING|TASK
- Supports --limit for recent N activities and client-side ISO date cutoffs
- Documents transcript and call-recording fetch patterns for meeting prep
- Points to bulk-operations SKILL.md and hubspot activities list --help as source of truth
Adoption & trust: 1 installs on skills.sh; 2 GitHub stars; trending (+100% hot-view momentum).
Recommended Skills
Cold Emailcoreyhaines31/marketingskills
Pricing Strategycoreyhaines31/marketingskills
Sales Enablementcoreyhaines31/marketingskills
Revopscoreyhaines31/marketingskills
Paid Adscoreyhaines31/marketingskills
Referral Programcoreyhaines31/marketingskills
Journey fit
Primary fit
CRM activity history supports revenue and retention work in Grow—understanding what was said before the next call or support touch. Lifecycle covers ongoing relationship context: assembling timelines from HubSpot activities rather than building the CRM integration itself.
SKILL.md
READMESKILL.md - Communication History
Read `bulk-operations/SKILL.md` first — JSONL piping, batch read, and `jq` reshape patterns (`resources/json-patterns.md`) apply. `hubspot activities list --help` is the source of truth. ## Output shape `activities list` returns one flat row per activity, sorted newest-first: `{id, type, timestamp, title, body, status, owner_id}`. `timestamp` is ISO 8601; `type` is `CALL|EMAIL|NOTE|MEETING|TASK`. Different from the raw `hs_call_*` / `hs_timestamp` (Unix ms) on the underlying objects — fetch those with `hubspot objects get --type calls` if needed. ## All activity for a record Pass exactly one of `--contact`, `--deal`, `--company`, `--ticket`. Use `--type CALL|EMAIL|NOTE|MEETING|TASK` to filter, `--limit N` for the most recent N: ```bash hubspot activities list --contact 73235 hubspot activities list --deal 67890 --type CALL hubspot activities list --contact 73235 --limit 10 ``` ## Client-side date filter ISO 8601 strings compare lexicographically. ```bash CUTOFF=$(date -v-30d +%Y-%m-%dT%H:%M:%SZ) # macOS # CUTOFF=$(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ) # Linux hubspot activities list --contact 73235 \ | jq -c --arg cutoff "$CUTOFF" 'select(.timestamp > $cutoff)' ``` ## Compact timeline ```bash hubspot activities list --contact 73235 --limit 20 \ | jq -r '"\(.timestamp[0:10]) \(.type) \(.title)"' ``` ## Pre-call brief Four piped commands: contact + company + open deals + activity. Use batch `objects get` over stdin — never `xargs -I{}` (see `bulk-operations/SKILL.md`). ```bash cid=73235 echo "=== Contact ===" hubspot objects get --type contacts $cid \ --properties email,firstname,lastname,phone,jobtitle,lifecyclestage --format table echo "=== Company ===" hubspot associations list --from contacts:$cid --to companies \ | jq -c '{id}' \ | hubspot objects get --type companies --properties name,domain,industry,annualrevenue --format table echo "=== Open Deals ===" hubspot associations list --from contacts:$cid --to deals \ | jq -c '{id}' \ | hubspot objects get --type deals --properties dealname,amount,dealstage,closedate,hs_is_closed \ | jq -c 'select(.properties.hs_is_closed != "true")' echo "=== Recent Activity ===" hubspot activities list --contact $cid --limit 10 \ | jq -r '"\(.timestamp[0:10]) \(.type) \(.title)"' ``` ## Transcripts Fetch the transcript for a single call by engagement ID: ```bash hubspot activities calls transcript get --call 54321 ``` Dump all call transcripts to a file: ```bash hubspot objects list --type calls --limit 100 --properties hs_call_title \ | jq -r '.id' \ | while read -r call_id; do hubspot activities calls transcript get --call "$call_id" done > /tmp/transcripts.jsonl ``` Output shape: `{"transcriptId":"...","engagementId":...,"transcriptSource":"...","utterances":[...],"createdAt":...}`. The `utterances` array contains the speech content; it will be empty if no transcript was recorded or uploaded. ## Constraints - `--limit` max 100 and no `--after` cursor — long histories can't be paged. `body` can be long; use the compact timeline for skimming.