skills/integrations/hubspot/hubspot-connect/SKILL.md
Connect and operate HubSpot CRM workflows for contacts, companies, deals, associations, emails, calls, notes, and meetings. Use when the user asks for HubSpot CRM setup or record operations.
npx skillsauth add beam-ai-team/beam-next-skills hubspot-connectInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
User-facing meta-skill for HubSpot CRM integration.
Before creating/updating/archiving contacts, companies, deals, associations, or engagements in HubSpot, show the portal/account, record IDs or matching keys, payload summary, associations, and expected side effects. Require explicit user approval in the current turn before mutating CRM records or writing files. Read-only listing/search with an approved scope does not require additional approval.
Single entry point for all HubSpot CRM operations:
Follows the master/connect pattern - references hubspot-master for shared scripts and references.
Load this skill when user says:
Before ANY HubSpot operation, validate configuration:
uv run python skills/integrations/hubspot/hubspot-master/scripts/check_hubspot_config.py --json
| ai_action | What to Do |
|-------------|------------|
| proceed_with_operation | Config OK → Continue |
| prompt_for_access_token | Ask user for access token, save to .env |
| create_env_file | Create .env with token |
| add_missing_scopes | Guide user to add scopes in HubSpot |
| verify_token | Token exists but invalid |
Display this complete setup guide to user:
I need to set up HubSpot integration first.
---------------------------------------------------
HUBSPOT PRIVATE APP SETUP
---------------------------------------------------
STEP 1: Create Private App
─────────────────────────
1. Log into HubSpot
2. Click gear icon (Settings) → Integrations → Private Apps
3. Click "Create a private app"
4. Name: "Beam Next Integration"
STEP 2: Select Required Scopes
──────────────────────────────
In the "Scopes" tab, enable these permissions:
CRM (Required):
☑️ crm.objects.contacts.read
☑️ crm.objects.contacts.write
☑️ crm.objects.companies.read
☑️ crm.objects.companies.write
☑️ crm.objects.deals.read
☑️ crm.objects.deals.write
Engagements (Optional - for emails/calls/notes/meetings):
☑️ crm.objects.emails.read
☑️ crm.objects.emails.write
☑️ crm.objects.calls.read
☑️ crm.objects.calls.write
☑️ crm.objects.notes.read
☑️ crm.objects.notes.write
☑️ crm.objects.meetings.read
☑️ crm.objects.meetings.write
STEP 3: Get Your Token
──────────────────────
1. Click "Create app"
2. Copy the access token shown
3. Token starts with: pat-na1-... or pat-eu1-...
[!] IMPORTANT: Save this token securely - you won't see it again!
---------------------------------------------------
Please paste your HubSpot access token:
After user provides token:
# Write to .env
HUBSPOT_ACCESS_TOKEN=pat-na1-xxx
# Re-run config check to verify
uv run python skills/integrations/hubspot/hubspot-master/scripts/check_hubspot_config.py --json
If user gets 403 errors after setup, they're missing scopes:
[!] Missing HubSpot permissions!
The operation failed because your Private App is missing required scopes.
To fix:
1. Go to HubSpot Settings → Integrations → Private Apps
2. Click on "Beam Next Integration" (or your app name)
3. Go to "Scopes" tab
4. Add the missing scope: [scope name from error]
5. Click "Commit changes"
6. IMPORTANT: Copy the NEW access token (it changes after scope updates)
7. Update your .env with the new token
Then try again!
Trigger: Before any operation
Script: check_hubspot_config.py --json
Output: Config status, required actions
Trigger: "list contacts", "show contacts", "get contacts"
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_contacts.py --json
Display Format:
Found 10 contacts:
1. John Doe
Email: [email protected]
ID: 12345
Company: Acme Corp
2. Jane Smith
Email: [email protected]
ID: 12346
...
Trigger: "create contact", "add contact", "new contact"
Required: Email Optional: First name, last name, phone, company
uv run python skills/integrations/hubspot/hubspot-master/scripts/create_contact.py \
--email "[email protected]" \
--firstname "John" \
--lastname "Doe" \
--json
Trigger: "search contacts", "find contact", "lookup contact"
uv run python skills/integrations/hubspot/hubspot-master/scripts/search_contacts.py \
--email "[email protected]" \
--json
or
uv run python skills/integrations/hubspot/hubspot-master/scripts/search_contacts.py \
--name "John" \
--json
Trigger: "update contact", "edit contact", "modify contact"
Required: Contact ID
uv run python skills/integrations/hubspot/hubspot-master/scripts/update_contact.py \
--id 12345 \
--phone "+1234567890" \
--json
Trigger: "list companies", "show companies"
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_companies.py --json
Trigger: "create company", "add company", "new company"
uv run python skills/integrations/hubspot/hubspot-master/scripts/create_company.py \
--name "Acme Corp" \
--domain "acme.com" \
--industry "Technology" \
--json
Trigger: "search companies", "find company"
uv run python skills/integrations/hubspot/hubspot-master/scripts/search_companies.py \
--name "Acme" \
--json
Trigger: "list deals", "show deals", "show pipeline"
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_deals.py --json
Trigger: "create deal", "add deal", "new deal", "new opportunity"
uv run python skills/integrations/hubspot/hubspot-master/scripts/create_deal.py \
--name "Enterprise Deal" \
--amount 50000 \
--stage "qualifiedtobuy" \
--json
Trigger: "update deal", "edit deal", "change deal stage"
uv run python skills/integrations/hubspot/hubspot-master/scripts/update_deal.py \
--id 12345 \
--stage "closedwon" \
--json
Trigger: "search deals", "find deal"
uv run python skills/integrations/hubspot/hubspot-master/scripts/search_deals.py \
--name "Enterprise" \
--min-amount 10000 \
--json
Trigger: "get associations", "linked records", "related contacts", "contacts on deal"
# Get contacts associated with a deal
uv run python skills/integrations/hubspot/hubspot-master/scripts/get_associations.py \
--object-type deals \
--object-id 12345 \
--to-type contacts \
--json
Trigger: "associate contact with company", "link deal to contact", "connect records"
Creates the default association label for the object pair (v4 batch API).
uv run python skills/integrations/hubspot/hubspot-master/scripts/create_association.py \
--from-type contacts \
--from-id 12345 \
--to-type companies \
--to-id 67890 \
--json
Trigger: "delete contact", "remove deal", "archive company"
Destructive — only run after user confirms. The script requires --yes.
uv run python skills/integrations/hubspot/hubspot-master/scripts/delete_crm_object.py \
--object-type contacts \
--id 12345 \
--yes \
--json
Trigger: Various engagement operations
List Emails:
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_emails.py --json
Log Email:
uv run python skills/integrations/hubspot/hubspot-master/scripts/log_email.py \
--subject "Follow up" \
--body "Meeting follow-up email" \
--json
List Calls:
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_calls.py --json
Log Call:
uv run python skills/integrations/hubspot/hubspot-master/scripts/log_call.py \
--title "Sales Call" \
--body "Discussed pricing" \
--duration 30 \
--json
List Notes:
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_notes.py --json
Create Note:
uv run python skills/integrations/hubspot/hubspot-master/scripts/create_note.py \
--body "Important note about this contact" \
--json
List Meetings:
uv run python skills/integrations/hubspot/hubspot-master/scripts/list_meetings.py --json
Create Meeting:
uv run python skills/integrations/hubspot/hubspot-master/scripts/create_meeting.py \
--title "Product Demo" \
--body "Demo of new features" \
--start "2025-12-15T14:00:00Z" \
--end "2025-12-15T15:00:00Z" \
--json
When user mentions:
| Phrase | Route To | |--------|----------| | "list contacts", "show contacts" | Workflow 1 | | "create contact", "add contact" | Workflow 2 | | "search contacts", "find contact" | Workflow 3 | | "update contact", "edit contact" | Workflow 4 | | "list companies", "show companies" | Workflow 5 | | "create company", "add company" | Workflow 6 | | "search companies", "find company" | Workflow 7 | | "list deals", "show pipeline" | Workflow 8 | | "create deal", "new opportunity" | Workflow 9 | | "update deal", "change stage" | Workflow 10 | | "search deals", "find deal" | Workflow 11 | | "associations", "linked records" | Workflow 12 | | "link", "associate", "connect record" | Workflow 12b | | "delete", "remove", "archive" (CRM record) | Workflow 12c | | "emails", "calls", "notes", "meetings" | Workflow 13 |
Common Errors:
| Error | Solution | |-------|----------| | 401 Unauthorized | Token invalid - check HUBSPOT_ACCESS_TOKEN | | 403 Forbidden | Missing scope - add to Private App | | 404 Not Found | Record doesn't exist | | 409 Conflict | Duplicate record - search first | | 429 Rate Limited | Wait and retry |
On Error:
hubspot-master/references/error-handling.mdAfter listing records, cache for session:
# Store in conversation context
contacts_cache = [
{"name": "John Doe", "id": "12345", "email": "[email protected]"},
{"name": "Jane Smith", "id": "12346", "email": "[email protected]"}
]
When user says "update John Doe", match to cached contact ID.
User: "list my hubspot contacts"
AI:
Let me check your HubSpot configuration first...
[OK] Configuration valid
Found 10 contacts:
1. John Doe
Email: [email protected]
ID: 12345
Company: Acme Corp
2. Jane Smith
Email: [email protected]
ID: 12346
Company: TechStart Inc
...
What would you like to do?
- "create contact" to add a new contact
- "search contacts by company" to filter
- "update John Doe" to modify a record
User: "create a new deal for Acme Corp worth $50,000"
AI:
Creating deal...
[OK] Deal created!
ID: 98765
Name: Acme Corp - $50,000
Amount: $50,000
Stage: qualifiedtobuy
Would you like to associate this deal with a contact or company?
Version: 2.0 Updated: 2026-03-23 Status: Production Ready
tools
Build a Palantir-shape, PDF-native use-case proposal document for a sophisticated enterprise account: research-grounded use cases (each with description, challenge, impact, value), an operating-graph ontology page, a recommended PoC with a week-by-week plan, and a closing page that asks for one decision. Load when a client asks us to 'propose high-impact use cases', requests a use-case presentation/catalog for a function (finance, HR, ops), or when a technical evaluation team will review candidates to pick a PoC. NOT for single-account cold outreach (use prospect-brief), full process diagnostics (use operating-diagnostic), or priced proposals (use proposal-creation).
development
Convert Beam Figma slide designs into high-fidelity, editable HTML presentation decks. Use when Codex is asked to audit Figma slides, extract slide templates, rebuild Beam slides as HTML decks, decide whether Figma imagery should be exported or rebuilt in HTML/CSS, create Beam/Prism-compatible deck templates, or improve fidelity of existing Beam HTML slide rebuilds.
development
Use the Beam AI reusable slide library: individual HTML slide templates extracted from Beam Figma rebuilds, kept separate from deck themes and full deck templates. Load when the user asks for a slide library, specific Beam slide patterns, reusable Figma-inspired slides, Prism slide-library items, or slide-level HTML templates.
development
Use Beam AI deck and report design packs, HTML templates, and curated examples to create sales decks, customer intro decks, RPO decks, and DIN A4 use-case proposal reports. Load when the user asks for Beam-branded presentation templates, Prism-compatible deck templates, Beam report templates, customer intro decks, commercial proposals, or reusable HTML deck/report examples.