HubSpot contact records: core and MSP-relevant custom fields, lifecycle stages, lead status values, contact ownership, CRM search filter patterns, and associations to companies and deals.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add WYRE-AI/msp-claude-plugins --skill contacts --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Contacts?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wyre-ai-contacts-610328f5)More formats (shields.io, HTML) on the badges page.
---
name: "HubSpot Contacts"
description: >
HubSpot contact records: core and MSP-relevant custom fields, lifecycle
stages, lead status values, contact ownership, CRM search filter patterns,
and associations to companies and deals.
when_to_use: >-
When searching, creating, updating, or auditing contact records in HubSpot CRM. Use when:
hubspot contact, hubspot lead, hubspot person, hubspot email lookup, contact search hubspot,
contact management hubspot, hubspot prospect, client contact hubspot, hubspot lifecycle, or lead
management hubspot.
---
# HubSpot Contact Management
## Overview
Contacts in HubSpot represent individual people -- clients, prospects, vendors, or any person your MSP interacts with. Contacts are the foundational entity in HubSpot CRM. They can be associated with companies, deals, tickets, and activities to build a complete picture of every relationship. For MSPs, contacts typically represent client employees, decision-makers, technical contacts, and billing contacts at managed companies.
## Anti-triggers
- **The organization rather than the person** — "look up Acme Corp" wants a
company record; use `hubspot-companies`.
- **The organization as an entity you invoice** — a HubSpot contact carries no
balance, terms, or tax details; the AR-side record is `xero-contacts` or
`qbo-customers`.
- **A company or person detected on the website but not yet in the CRM** —
that is intent data, not a contact record; use
`warmly-visitor-intelligence`.
- **`filterGroups`, sort, and pagination syntax** — the search grammar is
shared across every object type; use `hubspot-api-patterns`.
## MCP Tools
### Available Tools
| Tool | Description | Key Parameters |
|------|-------------|----------------|
| `hubspot_retrieve_contact` | Get a single contact by ID | `contactId` (required) |
| `hubspot_create_contact` | Create a new contact | `email` (required), `firstname`, `lastname`, `phone`, `company` |
| `hubspot_update_contact` | Update an existing contact | `contactId` (required), property fields to update |
| `hubspot_list_contacts` | List contacts with pagination | `limit`, `after` (cursor) |
| `hubspot_list_contact_properties` | List all available contact properties | None |
| `hubspot_search_contacts` | Search contacts by criteria | `filterGroups`, `sorts`, `limit`, `after` |
### Search Contacts
Call `hubspot_search_contacts` with filter groups to find contacts:
**Search by email domain (find all contacts at a company):**
```json
{
"filterGroups": [
{
"filters": [
{
"propertyName": "email",
"operator": "CONTAINS_TOKEN",
"value": "acmecorp.com"
}
]
}
],
"limit": 100
}
```
**Search by name:**
```json
{
"filterGroups": [
{
"filters": [
{
"propertyName": "firstname",
"operator": "EQ",
"value": "John"
},
{
"propertyName": "lastname",
"operator": "EQ",
"value": "Smith"
}
]
}
]
}
```
**Search by lifecycle stage (find all customers):**
```json
{
"filterGroups": [
{
"filters": [
{
"propertyName": "lifecyclestage",
"operator": "EQ",
"value": "customer"
}
]
}
],
"sorts": [
{
"propertyName": "lastname",
"direction": "ASCENDING"
}
],
"limit": 100
}
```
### Create a Contact
Call `hubspot_create_contact` with the contact's properties:
**Example: Create a new client contact:**
- `email`: `jane.doe@acmecorp.com`
- `firstname`: `Jane`
- `lastname`: `Doe`
- `phone`: `555-987-6543`
- `company`: `Acme Corporation`
- `jobtitle`: `IT Director`
- `lifecyclestage`: `customer`
### Update a Contact
Call `hubspot_update_contact` with the `contactId` and the properties to change:
**Example: Update lifecycle stage and lead status:**
- `contactId`: `12345`
- `lifecyclestage`: `customer`
- `hs_lead_status`: `CONNECTED`
### Retrieve a Contact
Call `hubspot_retrieve_contact` with the `contactId`:
**Example:**
- `hubspot_retrieve_contact` with `contactId=12345`
## Key Concepts
### Lifecycle Stages
Lifecycle stages track where a contact is in your MSP's sales and service process:
| Stage | Description | MSP Context |
|-------|-------------|-------------|
| `subscriber` | Signed up for updates | Newsletter subscriber |
| `lead` | Expressed interest | Downloaded a whitepaper or filled out a form |
| `marketingqualifiedlead` | Marketing qualified | Meets marketing criteria for outreach |
| `salesqualifiedlead` | Sales qualified | Confirmed interest in MSP services |
| `opportunity` | Active opportunity | In an active sales conversation |
| `customer` | Paying customer | Signed MSP agreement, receiving services |
| `evangelist` | Advocate | Actively refers new business |
| `other` | Custom stage | Does not fit standard stages |
### Lead Status
Lead status tracks the disposition of sales outreach:
| Status | Description |
|--------|-------------|
| `NEW` | New lead, not yet contacted |
| `OPEN` | Open lead, in active outreach |
| `IN_PROGRESS` | Engaged in conversation |
| `OPEN_DEAL` | Deal created, in pipeline |
| `UNQUALIFIED` | Does not meet qualification criteria |
| `ATTEMPTED_TO_CONTACT` | Outreach attempted, no response |
| `CONNECTED` | Connected, conversation initiated |
| `BAD_TIMING` | Interested but not ready |
### Contact Owner
The `hubspot_owner_id` property assigns a contact to a specific user in your HubSpot account. For MSPs, this is typically the account manager or sales rep responsible for the relationship.
## Field Reference
### Core Fields
| Field | Type | Description |
|-------|------|-------------|
| `email` | string | Email address (primary identifier) |
| `firstname` | string | First name |
| `lastname` | string | Last name |
| `phone` | string | Phone number |
| `mobilephone` | string | Mobile phone number |
| `company` | string | Company name (text field) |
| `jobtitle` | string | Job title |
| `address` | string | Street address |
| `city` | string | City |
| `state` | string | State or region |
| `zip` | string | Postal code |
| `country` | string | Country |
| `website` | string | Personal website |
| `lifecyclestage` | enumeration | Lifecycle stage |
| `hs_lead_status` | enumeration | Lead status |
| `hubspot_owner_id` | number | Assigned owner (user ID) |
| `createdate` | datetime | Record creation date |
| `lastmodifieddate` | datetime | Last modification date |
| `notes_last_updated` | datetime | Last note timestamp |
| `num_associated_deals` | number | Number of associated deals |
| `hs_email_last_send_date` | datetime | Last email sent |
| `hs_email_last_open_date` | datetime | Last email opened |
### MSP-Relevant Custom Fields
Many MSPs add custom properties for contacts. Common examples:
| Field | Type | Description |
|-------|------|-------------|
| `preferred_contact_method` | enumeration | Email, phone, or text |
| `technical_skill_level` | enumeration | Basic, intermediate, advanced |
| `decision_maker` | boolean | Is this person a decision-maker |
| `primary_contact` | boolean | Primary contact for the company |
## Common Workflows
### Find a Contact by Email
1. Call `hubspot_search_contacts` with a filter on `email` using `EQ` operator
2. If not found, try `CONTAINS_TOKEN` for partial domain matching
3. Review the results and note the `id` for further operations
### Find All Contacts at a Company
1. Call `hubspot_search_contacts` with a filter on `email` using `CONTAINS_TOKEN` with the company's email domain
2. Alternatively, use `hubspot_access_associations` on the company object to get associated contacts
3. For each contact, review role and lifecycle stage
### Create a New Client Contact
1. **Check for duplicates** - Search by email first using `hubspot_search_contacts`
2. **Create the contact** - Call `hubspot_create_contact` with email, name, phone, company, job title, and `lifecyclestage=customer`
3. **Associate with company** - Call `hubspot_create_association` to link the contact to the company record
4. **Log onboarding note** - Call `hubspot_create_note` to document the new contact setup
### Update Contact After Sales Conversion
1. Call `hubspot_update_contact` with:
- `lifecyclestage`: `customer`
- `hs_lead_status`: `CONNECTED`
2. Call `hubspot_create_note` to log the conversion details
3. Call `hubspot_create_task` to create onboarding follow-up tasks
### Contact Audit for a Client Company
1. Find the company with `hubspot_search_companies`
2. Call `hubspot_access_associations` to get all contacts associated with the company
3. Retrieve each contact with `hubspot_retrieve_contact`
4. Build a report with name, email, job title, lifecycle stage, and last activity date
5. Flag contacts without email addresses or with stale last activity dates
## Response Examples
**Single Contact:**
```json
{
"id": "12345",
"properties": {
"email": "john.smith@acmecorp.com",
"firstname": "John",
"lastname": "Smith",
"phone": "555-123-4567",
"company": "Acme Corporation",
"jobtitle": "IT Director",
"lifecyclestage": "customer",
"hs_lead_status": "CONNECTED",
"hubspot_owner_id": "67890",
"createdate": "2025-06-15T10:30:00.000Z",
"lastmodifieddate": "2026-02-10T14:15:00.000Z"
},
"createdAt": "2025-06-15T10:30:00.000Z",
"updatedAt": "2026-02-10T14:15:00.000Z"
}
```
**Search Results:**
```json
{
"total": 3,
"results": [
{
"id": "12345",
"properties": {
"email": "john.smith@acmecorp.com",
"firstname": "John",
"lastname": "Smith",
"company": "Acme Corporation"
}
},
{
"id": "12346",
"properties": {
"email": "jane.doe@acmecorp.com",
"firstname": "Jane",
"lastname": "Doe",
"company": "Acme Corporation"
}
}
]
}
```
## Error Handling
### Common Errors
| Error | Cause | Resolution |
|-------|-------|------------|
| Contact not found | Invalid contact ID | Verify the ID with `hubspot_search_contacts` |
| Duplicate email | Contact with this email already exists | Search for existing contact first |
| Invalid property | Property name not recognized | Use `hubspot_list_contact_properties` to check available properties |
| Invalid lifecycle stage | Stage value not valid | Use one of: subscriber, lead, marketingqualifiedlead, salesqualifiedlead, opportunity, customer, evangelist, other |
| Rate limited | Too many requests | Wait 10 seconds and retry |
## Best Practices
1. **Use lifecycle stages consistently** - Define clear criteria for each stage in your MSP's process
2. **Associate contacts with companies** - Always link contacts to their company record for full context
3. **Track lead status** - Update lead status as sales conversations progress
4. **Assign owners** - Set `hubspot_owner_id` so team members know who manages each relationship
5. **Log activities** - Create notes and tasks on contacts to maintain a complete activity history
6. **Audit regularly** - Review contacts quarterly for stale records and missing information
7. **Standardize job titles** - Use consistent job title formats for better reporting
8. **Respect data privacy** - PHI properties are excluded from MCP responses by design
## Related Skills
- [HubSpot API Patterns](../api-patterns/SKILL.md) - MCP tools reference and connection info
- [HubSpot Companies](../companies/SKILL.md) - Company management and associations
- [HubSpot Deals](../deals/SKILL.md) - Deals associated with contacts
- [HubSpot Tickets](../tickets/SKILL.md) - Support tickets for contacts
- [HubSpot Activities](../activities/SKILL.md) - Notes, tasks, and engagement tracking
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!