HubSpot Contacts — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited HubSpot Contacts (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
| 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 |
Call hubspot_search_contacts with filter groups to find contacts:
Search by email domain (find all contacts at a company):
{
"filterGroups": [
{
"filters": [
{
"propertyName": "email",
"operator": "CONTAINS_TOKEN",
"value": "acmecorp.com"
}
]
}
],
"limit": 100
}Search by name:
{
"filterGroups": [
{
"filters": [
{
"propertyName": "firstname",
"operator": "EQ",
"value": "John"
},
{
"propertyName": "lastname",
"operator": "EQ",
"value": "Smith"
}
]
}
]
}Search by lifecycle stage (find all customers):
{
"filterGroups": [
{
"filters": [
{
"propertyName": "lifecyclestage",
"operator": "EQ",
"value": "customer"
}
]
}
],
"sorts": [
{
"propertyName": "lastname",
"direction": "ASCENDING"
}
],
"limit": 100
}Call hubspot_create_contact with the contact's properties:
Example: Create a new client contact:
email: [email protected]firstname: Janelastname: Doephone: 555-987-6543company: Acme Corporationjobtitle: IT Directorlifecyclestage: customerCall hubspot_update_contact with the contactId and the properties to change:
Example: Update lifecycle stage and lead status:
contactId: 12345lifecyclestage: customerhs_lead_status: CONNECTEDCall hubspot_retrieve_contact with the contactId:
Example:
hubspot_retrieve_contact with contactId=12345Lifecycle 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 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 |
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 | 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 |
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 |
hubspot_search_contacts with a filter on email using EQ operatorCONTAINS_TOKEN for partial domain matchingid for further operationshubspot_search_contacts with a filter on email using CONTAINS_TOKEN with the company's email domainhubspot_access_associations on the company object to get associated contactshubspot_search_contactshubspot_create_contact with email, name, phone, company, job title, and lifecyclestage=customerhubspot_create_association to link the contact to the company recordhubspot_create_note to document the new contact setuphubspot_update_contact with:lifecyclestage: customerhs_lead_status: CONNECTEDhubspot_create_note to log the conversion detailshubspot_create_task to create onboarding follow-up taskshubspot_search_companieshubspot_access_associations to get all contacts associated with the companyhubspot_retrieve_contactSingle Contact:
{
"id": "12345",
"properties": {
"email": "[email protected]",
"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:
{
"total": 3,
"results": [
{
"id": "12345",
"properties": {
"email": "[email protected]",
"firstname": "John",
"lastname": "Smith",
"company": "Acme Corporation"
}
},
{
"id": "12346",
"properties": {
"email": "[email protected]",
"firstname": "Jane",
"lastname": "Doe",
"company": "Acme Corporation"
}
}
]
}| 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 |
hubspot_owner_id so team members know who manages each relationship~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.