From hubspot-admin
Classify companies into Ideal Customer Profile (ICP) tiers based on firmographic data (industry + employee count). Creates a custom property via API and 4 classification workflows in HubSpot UI.
npx claudepluginhub tomgranot/hubspot-admin-skillsThis skill uses the workspace's default tool permissions.
Classify every company in the CRM into an Ideal Customer Profile tier based on firmographic data. Creates a custom dropdown property and 4 automated workflows that continuously classify companies as they enter or change.
Discovers and defines Ideal Customer Profiles using firmographic criteria, buyer personas, scoring matrices, anti-ICP signals, and validation methodology. Useful for targeting, sales, and product strategy.
Create foundational segmented lists for marketing and sales operations. Includes a master sendable list, ICP-based lists, persona lists, engagement lists, and behavioral lists. All active (dynamic) lists.
Designs revenue operations for lead lifecycle rules, scoring, routing, handoffs, and CRM process automation. Use for marketing, sales, customer success workflow alignment.
Share bugs, ideas, or general feedback.
Classify every company in the CRM into an Ideal Customer Profile tier based on firmographic data. Creates a custom dropdown property and 4 automated workflows that continuously classify companies as they enter or change.
Without ICP classification, every inbound lead looks the same regardless of whether they come from a large enterprise in a target vertical or a tiny company in an irrelevant industry. Sales and marketing have no systematic way to prioritize outreach, allocate resources, or differentiate campaigns by company fit. ICP Tier is also a major input to the lead scoring model.
Before executing, collect the following information from the user:
Q1: What industries define your ideal customer?
Q2: What employee count ranges define your tiers?
Q3: Are there any other firmographic criteria?
Before building anything, define your criteria framework:
| Tier | Label | Industry Verticals | Employee Threshold |
|---|---|---|---|
| Tier 1 | Primary ICP | [Your primary verticals, e.g., Manufacturing, Professional Services, Logistics] | [e.g., 1,000+] |
| Tier 2 | Secondary ICP | [Your secondary verticals, e.g., Retail, Education, Media & Entertainment] | [e.g., 200+] |
| Tier 3 | Tertiary ICP | [Your tertiary verticals, e.g., Hospitality, Real Estate, Agriculture] | [e.g., 200+] |
| Not ICP | Not ICP | Everything else | Any |
Size-based demotion pattern: Companies in a higher-tier industry but below that tier's employee threshold should be demoted to the next tier down, not classified as "Not ICP". For example:
This ensures ICP-relevant companies are never lost due to size alone.
import os
from hubspot import HubSpot
from dotenv import load_dotenv
load_dotenv()
api_client = HubSpot(access_token=os.getenv("HUBSPOT_API_TOKEN"))
# Check if ICP Tier property already exists
# Use your chosen property name (e.g., "company_segment", "buyer_tier", "icp_tier")
PROPERTY_NAME = "company_segment"
try:
prop = api_client.crm.properties.core_api.get_by_name(
object_type="companies", property_name=PROPERTY_NAME
)
print(f"ICP Tier property exists: {prop.label}")
except Exception:
print(f"ICP Tier property '{PROPERTY_NAME}' does not exist yet")
# Check data coverage for classification
for prop_name in ["industry", "numberofemployees"]:
result = api_client.crm.companies.search_api.do_search(
public_object_search_request={
"filterGroups": [{
"filters": [{
"propertyName": prop_name,
"operator": "NOT_HAS_PROPERTY"
}]
}],
"limit": 0
}
)
print(f"Companies missing {prop_name}: {result.total}")
Choose a property name that fits your CRM conventions (e.g., company_segment, buyer_tier, or icp_tier). The name is configurable -- just be consistent across workflows and lists.
Via API (recommended):
from hubspot.crm.properties import ModelProperty, PropertyCreate
# Configure your property name here
PROPERTY_NAME = "company_segment"
api_client.crm.properties.core_api.create(
object_type="companies",
property_create=PropertyCreate(
name=PROPERTY_NAME,
label="ICP Tier",
type="enumeration",
field_type="select",
group_name="companyinformation",
description="Automated ICP classification based on industry and employee count. Set by workflow - do not edit manually.",
options=[
{"label": "Tier 1 - Primary ICP", "value": "tier_1_primary", "displayOrder": 0},
{"label": "Tier 2 - Secondary ICP", "value": "tier_2_secondary", "displayOrder": 1},
{"label": "Tier 3 - Tertiary ICP", "value": "tier_3_tertiary", "displayOrder": 2},
{"label": "Not ICP", "value": "not_icp", "displayOrder": 3},
]
)
)
Via UI: Settings > Properties > Company properties > Create property > Dropdown select with the four tier options.
Build 4 company-based workflows in the HubSpot UI. Workflows must use filter-based triggers ("When filter criteria is met") with AND logic.
Option 1: Manual UI Build. Follow the per-workflow specifications below. This is the most reliable method and gives you full control over every trigger and action.
Option 2: HubSpot Breeze AI. Navigate to Automation > Workflows > Create workflow > "Describe what you want" and paste the following prompt (repeat for each tier, adjusting the tier name, industries, and thresholds):
Create a company-based workflow that triggers when filter criteria is met:
- Number of Employees is greater than or equal to [THRESHOLD]
- AND Industry is any of [LIST YOUR INDUSTRIES]
- AND the custom property "ICP Tier" is unknown
The workflow should set the custom property "ICP Tier" to "[TIER VALUE]".
Enable re-enrollment for all trigger properties.
For the Not ICP catch-all workflow, use:
Create a company-based workflow that triggers when filter criteria is met:
- Custom property "ICP Tier" is unknown
The workflow should wait a delay (30-90 minutes) to let tiered workflows process first, then set the custom property "ICP Tier" to "Not ICP".
Enable re-enrollment.
CRITICAL WARNING: Breeze trigger limitations. Breeze creates event-based triggers (OR logic) instead of filter-based triggers (AND logic). This is especially dangerous for ICP classification because event-based triggers fire when any single property changes, regardless of other conditions, leading to incorrect tier assignments. After Breeze creates each workflow, you MUST manually verify and rebuild the triggers to use filter-based enrollment with AND logic. Breeze is best used for creating the workflow skeleton (actions, delays) -- the trigger conditions almost always need manual correction.
Additional Breeze limitations:
Option 3: Claude Anthropic Chrome Extension. The Claude Chrome extension lets Claude see and interact with the HubSpot workflow builder UI directly. You can describe each workflow's logic in natural language and Claude will click through the UI to build it. This is often more accurate than Breeze for the ICP workflows because of their complex multi-group filter logic and the critical requirement for AND-based triggers. Build the four workflows one at a time, activating in the staggered sequence described in Step 3.
Note on Fast Mode: If you're using Claude Code's Fast Mode to speed up workflow creation, be aware of the billing model: Haiku usage is included in your subscription, but Opus in Fast Mode consumes extra credits. For workflow building tasks (which are UI-heavy and may require many interactions), consider whether the speed tradeoff is worth the credit cost.
ICP TIER: Assign Tier 1 - Primary ICPIndustry variant tip: HubSpot has multiple labels for the same vertical. For example, "Manufacturing" might appear as "Manufacturing", "Industrial Automation", "Machinery", "Electrical/Electronic Manufacturing". Include ALL relevant variants in the "is any of" filter. Check what values actually exist in your data.
ICP TIER: Assign Tier 2 - Secondary ICPFilter Group 1 — Secondary industries at threshold:
Filter Group 2 — Primary industries demoted by size:
Number of Employees >= [e.g., 200]
AND Number of Employees <= [e.g., 999]
AND Industry is any of [your primary verticals and variants]
AND ICP Tier is unknown
Re-enrollment: ON
Action: Set ICP Tier = "Tier 2 - Secondary ICP"
ICP TIER: Assign Tier 3 - Tertiary ICPICP TIER: Assign Not ICPActivate workflows in staggered sequence to prevent race conditions:
The stagger ensures higher-priority tiers process first. The "ICP Tier is unknown" filter on Tiers 2-4 prevents overwriting, and the delay on Not ICP provides additional buffer.
Wait 2-4 hours for all workflows to process, then verify.
# Use the same property name you chose in Step 1
PROPERTY_NAME = "company_segment"
# Check coverage
result = api_client.crm.companies.search_api.do_search(
public_object_search_request={
"filterGroups": [{
"filters": [{
"propertyName": PROPERTY_NAME,
"operator": "NOT_HAS_PROPERTY"
}]
}],
"limit": 0
}
)
print(f"Companies without ICP Tier: {result.total} (should be 0)")
# Check distribution
for tier_value in ["tier_1_primary", "tier_2_secondary", "tier_3_tertiary", "not_icp"]:
result = api_client.crm.companies.search_api.do_search(
public_object_search_request={
"filterGroups": [{
"filters": [{
"propertyName": PROPERTY_NAME,
"operator": "EQ",
"value": tier_value
}]
}],
"limit": 0
}
)
print(f" {tier_value}: {result.total}")
Verification checklist:
automation-access scope, you can read workflow definitions via the Workflows API and programmatically verify that triggers match your spec.