From hubspot-pack
Generates TypeScript examples for HubSpot CRM CRUD on contacts, companies, and deals using @hubspot/api-client. Use for new integrations, setup testing, or API learning.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hubspot-pack:hubspot-hello-worldThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create, read, update, and delete CRM records using the HubSpot API. Covers contacts, companies, and deals with real endpoints and SDK methods.
Create, read, update, and delete CRM records using the HubSpot API. Covers contacts, companies, and deals with real endpoints and SDK methods.
hubspot-install-auth setupcrm.objects.contacts.read, crm.objects.contacts.write@hubspot/api-client installedimport * as hubspot from '@hubspot/api-client';
const client = new hubspot.Client({
accessToken: process.env.HUBSPOT_ACCESS_TOKEN!,
});
// POST /crm/v3/objects/contacts
const contactResponse = await client.crm.contacts.basicApi.create({
properties: {
firstname: 'Jane',
lastname: 'Doe',
email: '[email protected]',
phone: '(555) 123-4567',
company: 'Acme Corp',
lifecyclestage: 'lead',
},
associations: [],
});
console.log(`Created contact: ${contactResponse.id}`);
// Output: Created contact: 12345
// GET /crm/v3/objects/contacts/{contactId}
const contact = await client.crm.contacts.basicApi.getById(
contactResponse.id,
['firstname', 'lastname', 'email', 'phone', 'lifecyclestage'],
undefined, // propertiesWithHistory
['companies'] // associations to include
);
console.log(`${contact.properties.firstname} ${contact.properties.lastname}`);
console.log(`Email: ${contact.properties.email}`);
console.log(`Stage: ${contact.properties.lifecyclestage}`);
// PATCH /crm/v3/objects/contacts/{contactId}
const updated = await client.crm.contacts.basicApi.update(
contactResponse.id,
{
properties: {
lifecyclestage: 'marketingqualifiedlead',
phone: '(555) 987-6543',
},
}
);
console.log(`Updated at: ${updated.updatedAt}`);
// POST /crm/v3/objects/companies
const company = await client.crm.companies.basicApi.create({
properties: {
name: 'Acme Corp',
domain: 'acme.com',
industry: 'TECHNOLOGY',
numberofemployees: '150',
annualrevenue: '5000000',
},
associations: [],
});
// Associate contact with company
// PUT /crm/v4/objects/contacts/{contactId}/associations/companies/{companyId}
await client.crm.associations.v4.basicApi.create(
'contacts',
contactResponse.id,
'companies',
company.id,
[{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 1 }]
);
console.log(`Associated contact ${contactResponse.id} with company ${company.id}`);
// POST /crm/v3/objects/deals
const deal = await client.crm.deals.basicApi.create({
properties: {
dealname: 'Acme Enterprise License',
amount: '50000',
dealstage: 'appointmentscheduled', // default pipeline stage ID
pipeline: 'default',
closedate: '2026-06-30T00:00:00.000Z',
hubspot_owner_id: '12345', // owner user ID
},
associations: [
{
to: { id: company.id },
types: [{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 5 }],
},
{
to: { id: contactResponse.id },
types: [{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 3 }],
},
],
});
console.log(`Created deal: ${deal.properties.dealname} ($${deal.properties.amount})`);
| Error | Code | Cause | Solution |
|---|---|---|---|
409 Conflict | 409 | Contact with email already exists | Use crm.contacts.basicApi.getById or search first |
400 Bad Request | 400 | Invalid property name or value | Check property names in Settings > Properties |
404 Not Found | 404 | Record ID doesn't exist | Verify ID or check if archived |
PROPERTY_DOESNT_EXIST | 400 | Custom property not created | Create in Settings > Properties first |
// POST /crm/v3/objects/contacts/search
const searchResults = await client.crm.contacts.searchApi.doSearch({
filterGroups: [
{
filters: [
{
propertyName: 'email',
operator: 'EQ',
value: '[email protected]',
},
],
},
],
properties: ['firstname', 'lastname', 'email'],
limit: 10,
after: 0,
sorts: [{ propertyName: 'createdate', direction: 'DESCENDING' }],
});
console.log(`Found ${searchResults.total} contact(s)`);
// DELETE /crm/v3/objects/contacts/{contactId}
await client.crm.contacts.basicApi.archive(contactResponse.id);
console.log('Contact archived');
Proceed to hubspot-local-dev-loop for development workflow setup.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin hubspot-packImplements HubSpot CRM contact-to-deal workflows: upsert contacts, create companies/deals, advance pipeline stages, log activities.
Provides expert patterns for HubSpot CRM integration: OAuth authentication, CRM objects, associations, batch operations, webhooks, and custom objects using Node.js and Python SDKs.
Provides patterns for HubSpot CRM integration: OAuth authentication, CRM objects, associations, batch operations, webhooks, custom objects using Node.js and Python SDKs.