{"skill":{"slug":"hubspot-by-altf1be","displayName":"HubSpot by altf1be","summary":"Full HubSpot platform CLI — CRM contacts/companies/deals/tickets, CMS blog posts/pages, Marketing emails/forms/lists, Conversations, Automation workflows. Pr...","description":"---\nname: hubspot-by-altf1be\ndescription: \"Full HubSpot platform CLI — CRM contacts/companies/deals/tickets, CMS blog posts/pages, Marketing emails/forms/lists, Conversations, Automation workflows. Private App token or OAuth 2.0 auth.\"\nhomepage: https://github.com/ALT-F1-OpenClaw/openclaw-skill-hubspot-by-altf1be\nmetadata:\n  {\"openclaw\": {\"emoji\": \"🟠\", \"requires\": {\"env\": [\"HUBSPOT_ACCESS_TOKEN\"]}, \"optional\": {\"env\": [\"HUBSPOT_CLIENT_ID\", \"HUBSPOT_CLIENT_SECRET\", \"HUBSPOT_REFRESH_TOKEN\", \"HUBSPOT_MAX_RESULTS\"]}, \"primaryEnv\": \"HUBSPOT_ACCESS_TOKEN\"}}\n---\n\n# HubSpot by @altf1be\n\nFull HubSpot platform CLI covering CRM, CMS, Marketing, Conversations, and Automation.\n\n## Setup\n\n1. Create a Private App in HubSpot: Settings > Integrations > Private Apps\n2. Set environment variables (or create `.env` in `{baseDir}`):\n\n```\n# Required (Private App mode)\nHUBSPOT_ACCESS_TOKEN=pat-na1-xxxxxxxx\n\n# OR use OAuth 2.0 mode (set all three):\n# HUBSPOT_CLIENT_ID=your-client-id\n# HUBSPOT_CLIENT_SECRET=your-client-secret\n# HUBSPOT_REFRESH_TOKEN=your-refresh-token\n\n# Optional\n# HUBSPOT_MAX_RESULTS=100\n```\n\n3. Configure the required **Private App scopes** in HubSpot (Settings > Integrations > Private Apps > your app > Scopes):\n\n| Scope | Description |\n|---|---|\n| `crm.objects.contacts.read` | View properties and other details about contacts |\n| `crm.objects.contacts.write` | Create, delete, or make changes to contacts |\n| `crm.objects.companies.read` | View properties and other details about companies |\n| `crm.objects.companies.write` | Create, delete, or make changes to companies |\n| `crm.objects.deals.read` | View properties and other details about deals |\n| `crm.objects.deals.write` | Create, delete, or make changes to deals |\n| `crm.objects.owners.read` | View details about users assigned to a CRM record |\n| `crm.schemas.contacts.read` | View details about property settings for contacts |\n| `crm.schemas.companies.read` | View details about property settings for companies |\n| `crm.schemas.deals.read` | View details about property settings for deals |\n| `tickets` | View, create, delete, or make changes to tickets |\n| `automation` | Workflows |\n| `content` | Sites, landing pages, CTA, email, blog, campaigns |\n| `conversations.read` | View messages, comments, threads, recipient/user/assignment details |\n| `forms` | Access to the Forms API |\n\n4. Install dependencies: `cd {baseDir} && npm install`\n\n## Commands\n\n### CRM — Contacts\n\n```bash\n# List contacts\nnode {baseDir}/scripts/hubspot.mjs contacts list\n\n# Search contacts by email\nnode {baseDir}/scripts/hubspot.mjs contacts search --query \"john@example.com\"\n\n# Read contact details\nnode {baseDir}/scripts/hubspot.mjs contacts read --id 123\n\n# Create a contact\nnode {baseDir}/scripts/hubspot.mjs contacts create --email \"jane@example.com\" --firstname Jane --lastname Doe\n\n# Update a contact\nnode {baseDir}/scripts/hubspot.mjs contacts update --id 123 --phone \"+1234567890\"\n\n# Delete a contact (requires --confirm)\nnode {baseDir}/scripts/hubspot.mjs contacts delete --id 123 --confirm\n```\n\n### CRM — Companies\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs companies list\nnode {baseDir}/scripts/hubspot.mjs companies search --query \"Acme\"\nnode {baseDir}/scripts/hubspot.mjs companies read --id 456\nnode {baseDir}/scripts/hubspot.mjs companies create --name \"Acme Corp\" --domain \"acme.com\"\nnode {baseDir}/scripts/hubspot.mjs companies update --id 456 --industry \"Technology\"\nnode {baseDir}/scripts/hubspot.mjs companies delete --id 456 --confirm\n```\n\n### CRM — Deals\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs deals list\nnode {baseDir}/scripts/hubspot.mjs deals search --query \"Enterprise\"\nnode {baseDir}/scripts/hubspot.mjs deals read --id 789\nnode {baseDir}/scripts/hubspot.mjs deals create --name \"Big Deal\" --amount 50000 --stage appointmentscheduled\nnode {baseDir}/scripts/hubspot.mjs deals update --id 789 --stage closedwon\nnode {baseDir}/scripts/hubspot.mjs deals delete --id 789 --confirm\n```\n\n### CRM — Tickets\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs tickets list\nnode {baseDir}/scripts/hubspot.mjs tickets search --query \"Bug\"\nnode {baseDir}/scripts/hubspot.mjs tickets read --id 101\nnode {baseDir}/scripts/hubspot.mjs tickets create --subject \"Login broken\" --priority HIGH\nnode {baseDir}/scripts/hubspot.mjs tickets update --id 101 --stage 2\nnode {baseDir}/scripts/hubspot.mjs tickets delete --id 101 --confirm\n```\n\n### CRM — Owners\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs owners list\nnode {baseDir}/scripts/hubspot.mjs owners list --email \"john@company.com\"\nnode {baseDir}/scripts/hubspot.mjs owners read --id 55\n```\n\n### CRM — Pipelines\n\n```bash\n# List deal pipelines (default)\nnode {baseDir}/scripts/hubspot.mjs pipelines list\n\n# List ticket pipelines\nnode {baseDir}/scripts/hubspot.mjs pipelines list --object-type tickets\n```\n\n### CRM — Associations (v4)\n\n```bash\n# List associations from contact to companies\nnode {baseDir}/scripts/hubspot.mjs associations list --from-type contacts --from-id 123 --to-type companies\n\n# Create an association\nnode {baseDir}/scripts/hubspot.mjs associations create --from-type contacts --from-id 123 --to-type companies --to-id 456 --type-id 1\n\n# Delete an association (requires --confirm)\nnode {baseDir}/scripts/hubspot.mjs associations delete --from-type contacts --from-id 123 --to-type companies --to-id 456 --confirm\n```\n\n### CRM — Properties\n\n```bash\n# List contact properties (default)\nnode {baseDir}/scripts/hubspot.mjs properties list\n\n# List deal properties\nnode {baseDir}/scripts/hubspot.mjs properties list --object-type deals\n```\n\n### CRM — Engagements\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs engagements notes\nnode {baseDir}/scripts/hubspot.mjs engagements emails\nnode {baseDir}/scripts/hubspot.mjs engagements calls\nnode {baseDir}/scripts/hubspot.mjs engagements tasks\nnode {baseDir}/scripts/hubspot.mjs engagements meetings\n```\n\n### CMS — Blog Posts\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs blog-posts list\nnode {baseDir}/scripts/hubspot.mjs blog-posts list --state PUBLISHED\nnode {baseDir}/scripts/hubspot.mjs blog-posts read --id 1001\nnode {baseDir}/scripts/hubspot.mjs blog-posts create --name \"My Post\"\nnode {baseDir}/scripts/hubspot.mjs blog-posts update --id 1001 --name \"Updated Title\"\n```\n\n### CMS — Pages\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs pages list\nnode {baseDir}/scripts/hubspot.mjs pages read --id 2001\n```\n\n### CMS — Domains\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs domains list\n```\n\n### Marketing — Email Campaigns\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs email-campaigns list\nnode {baseDir}/scripts/hubspot.mjs email-campaigns read --id 3001\n```\n\n### Marketing — Forms\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs forms list\nnode {baseDir}/scripts/hubspot.mjs forms read --id 4001\n```\n\n### Marketing — Marketing Emails\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs marketing-emails list\nnode {baseDir}/scripts/hubspot.mjs marketing-emails read --id 5001\nnode {baseDir}/scripts/hubspot.mjs marketing-emails stats --id 5001\n```\n\n### Marketing — Contact Lists\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs lists list\nnode {baseDir}/scripts/hubspot.mjs lists read --id 6001\n```\n\n### Conversations\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs conversations list\nnode {baseDir}/scripts/hubspot.mjs conversations read --id 7001\nnode {baseDir}/scripts/hubspot.mjs messages list --thread-id 7001\n```\n\n### Automation — Workflows\n\n```bash\nnode {baseDir}/scripts/hubspot.mjs workflows list\nnode {baseDir}/scripts/hubspot.mjs workflows read --id 8001\n```\n\n## Security\n\n- Auth method: Bearer token (Private App) or OAuth 2.0 with auto-refresh\n- No secrets or tokens printed to stdout\n- All delete operations require explicit `--confirm` flag\n- Built-in rate limiting with exponential backoff retry (3 attempts)\n- OAuth tokens cached in `~/.cache/openclaw/hubspot-token.json`\n- Lazy config validation (only checked when a command runs)\n\n## Dependencies\n\n- `commander` — CLI framework\n- `dotenv` — environment variable loading\n- Node.js built-in `fetch` (requires Node >= 18)\n\n## Author\n\nAbdelkrim BOUJRAF — [ALT-F1 SRL](https://www.alt-f1.be), Brussels 🇧🇪 🇲🇦\nX: [@altf1be](https://x.com/altf1be)\n","topics":["CRM","Marketing"],"tags":{"latest":"1.0.1"},"stats":{"comments":0,"downloads":516,"installsAllTime":19,"installsCurrent":0,"stars":1,"versions":2},"createdAt":1774016280515,"updatedAt":1778492064154},"latestVersion":{"version":"1.0.1","createdAt":1774017426224,"changelog":"Added required HubSpot Private App scopes documentation to SKILL.md","license":"MIT-0"},"metadata":{"setup":[{"key":"HUBSPOT_ACCESS_TOKEN","required":true}],"os":null,"systems":null},"owner":{"handle":"abdelkrim","userId":"s172w1sgvkex0h7wnrbwy5dcmd83qhzb","displayName":"Abdelkrim from Brussels","image":"https://avatars.githubusercontent.com/u/791663?v=4"},"moderation":null}