agentleFS
jholhewresjholhewres/devclaw-skills/skills/hubspot/SKILL.md

hubspot

Skill4 starsChanged 9 months agoMITView on GitHub

Manage HubSpot CRM — contacts, companies, deals, tickets

  • Reads credentials
  • Sends data out

We split this skill into the rules it gives an agent

3 rules. 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 9 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Create a private app with scopes: crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.companies.read, …

    line 18
  2. Distinctive:

    Use search endpoint for filtered queries (up to 3 filter groups)

    line 144
  3. Distinctive:

    Use batch endpoints for bulk operations (up to 100 records)

    line 148

“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

HubSpot

Manage HubSpot CRM via the REST API v3.

Setup

  1. Go to HubSpot → Settings → Integrations → Private Apps
  2. Create a private app with scopes: crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.companies.read, crm.objects.companies.write, crm.objects.deals.read, crm.objects.deals.write, content
  3. Copy the access token
  4. Store in vault:
    copilot config vault-set HUBSPOT_ACCESS_TOKEN=pat-na1-xxxxx

List Contacts

curl -s "https://api.hubapi.com/crm/v3/objects/contacts?limit=10&properties=firstname,lastname,email,phone,company" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" | jq '.results[] | {id, properties}'

Search Contacts

curl -s -X POST "https://api.hubapi.com/crm/v3/objects/contacts/search" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "filterGroups": [{"filters": [{"propertyName": "email", "operator": "CONTAINS_TOKEN", "value": "example.com"}]}],
    "properties": ["firstname", "lastname", "email", "phone"],
    "limit": 10
  }' | jq '.results[] | {id, properties}'

Create Contact

curl -s -X POST "https://api.hubapi.com/crm/v3/objects/contacts" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "properties": {
      "email": "contact@example.com",
      "firstname": "John",
      "lastname": "Doe",
      "phone": "+5511999999999",
      "company": "Company Name"
    }
  }' | jq '{id, properties}'

Update Contact

curl -s -X PATCH "https://api.hubapi.com/crm/v3/objects/contacts/CONTACT_ID" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"properties": {"phone": "+5511888888888"}}' | jq '{id, properties}'

List Companies

curl -s "https://api.hubapi.com/crm/v3/objects/companies?limit=10&properties=name,domain,industry,city,phone" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" | jq '.results[] | {id, properties}'

Create Company

curl -s -X POST "https://api.hubapi.com/crm/v3/objects/companies" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "properties": {
      "name": "Company Name",
      "domain": "company.com",
      "industry": "TECHNOLOGY",
      "city": "São Paulo",
      "phone": "+551130000000"
    }
  }' | jq '{id, properties}'

List Deals

curl -s "https://api.hubapi.com/crm/v3/objects/deals?limit=10&properties=dealname,amount,dealstage,closedate,pipeline" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" | jq '.results[] | {id, properties}'

Create Deal

curl -s -X POST "https://api.hubapi.com/crm/v3/objects/deals" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "properties": {
      "dealname": "Deal Name",
      "amount": "10000",
      "dealstage": "qualifiedtobuy",
      "pipeline": "default",
      "closedate": "2026-03-31"
    }
  }' | jq '{id, properties}'

List Tickets

curl -s "https://api.hubapi.com/crm/v3/objects/tickets?limit=10&properties=subject,content,hs_pipeline_stage,hs_ticket_priority" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" | jq '.results[] | {id, properties}'

Associate Objects

# Associate contact with company
curl -s -X PUT "https://api.hubapi.com/crm/v3/objects/contacts/CONTACT_ID/associations/companies/COMPANY_ID/contact_to_company" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN"

Deal Pipelines

curl -s "https://api.hubapi.com/crm/v3/pipelines/deals" \
  -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" | jq '.results[] | {id, label, stages: [.stages[] | {id, label}]}'

Tips

  • API rate limit: 100 requests/10s for private apps
  • Use search endpoint for filtered queries (up to 3 filter groups)
  • Properties must be explicitly requested via ?properties= parameter
  • Deal stages vary by pipeline — list pipelines first
  • Associations link contacts, companies, deals, and tickets
  • Use batch endpoints for bulk operations (up to 100 records)
  • Confirm before deleting any CRM records

Triggers

hubspot, crm, contato, contact, empresa, company, negócio, deal, ticket, pipeline, lead

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.