create-icp-tiers
Classify companies into Ideal Customer Profile (ICP) tiers based on firmographic data (industry + employee count).
Skill by tomgranot
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/tomgranot-create-icp-tiers
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design, backend, data, sales
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 2
api.hubapi.com· found in codecodeload.github.com· found in install command
Files it touches
~/.claude/skills/create-icp-tiers
What's inside
- Skill name
create-icp-tiers- Description
- 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.
- License
- MIT
- Metadata
- author: tomgranot · version: 1.1 · category: segmentation-scoring
- Instructions
- 266 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
- Instructions call the network
Files (4)
- SKILL.md
- after.py · scripts/
- before.py · scripts/
- execute.py · scripts/
SKILL.md (first lines)
# Create ICP Tier Property and Classification Workflows
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.
## Why This Matters
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.
## Prerequisites
- Super Admin permissions in HubSpot
- A HubSpot service key (`HUBSPOT_ACCESS_TOKEN` in `.env`; an existing legacy private app token also works) with company read/write and `crm.schemas.companies.write` scopes
- Python 3.10+ with [`uv`](https://github.com/astral-sh/uv)
- Access to Automation > Workflows (Marketing Hub Professional or higher)
- Data enrichment processes completed (company name, industry, geo values) so company data is as complete as possible
- Company properties **Number of Employees** and **Industry** should be well-populated. Check coverage:
- Industry: aim for 80%+ populated
- Employee count: aim for 80%+ populated
- Companies missing these fields will fall to "Not ICP" (conservative, intentional)
## Interview: Gather Requirements
Before executing, collect the following information from the user:
**Q1: What industries define your ideal customer?**
- Examples: Manufacturing, Professional Services, Logistics, Retail, Education, Media & Entertainment, Hospitality, Real Estate, Agriculture
- Default: No default -- this is highly business-specific and must be provided by the user
**Q2: What employee count ranges define your tiers?**
- Examples: Tier 1: 1,000+, Tier 2: 200-999, Tier 3: 50-199, Not ICP: under 50
- Default: Tier 1: 1,000+, Tier 2: 200-999, Tier 3: 50-199
**Q3: Are there any other firmographic criteria?**
- Examples: Annual revenue thresholds, geographic restrictions (US-only, EMEA, etc.), specific technologies used, funding stage
- Default: None -- industry and employee count are the primary classification axes
## Scripts
Script paths are relative to this skill's directory. Run them from your project directory so `.env`, `data/`, and `reports/` resolve there: prefix each path with wherever this skill is installed (`skills/create-icp-tiers/` in a clone of the repo).
| Stage | Script | Run with |
|-------|--------|----------|
| Before | [`scripts/before.py`](./scripts/before.py) | `uv run scripts/before.py` |
| Execute | [`scripts/execute.py`](./scripts/execute.py) | `uv run scripts/execute.py` |
| After | [`scripts/after.py`](./scripts/after.py) | `uv run scripts/after.py` |
`before.py` checks whether the tier property exists and audits industry/employee-count coverage. `execute.py` creates the ICP Tier property (review its configuration block first). `after.py` verifies coverage and tier distribution. The classification workflows themselves are built in the UI (see Execute).
## Plan
1. Define your ICP tier criteria (industry verticals + employee count thresholds)
2. Create the ICP Tier custom property via API or UI
3. Build 4 classification workflows (Tier 1, Tier 2, Tier 3, Not ICP)
4. Activate workflows in staggered sequence
5. Verify classification results (after state)
## Before
### Define Your ICP Tiers
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:
- A company in a Tier 1 industry with fewer than 1,000 but more than 200 employees -> Tier 2
- A company in a Tier 2 industry with fewer than 200 but more than 50 employees -> Tier 3
- Only companies below 50 employees in any ICP industry, or in non-ICP industries entirely, should be "Not ICP"
This ensures ICP-relevant companies are never lost due to size alone.
### Audit Current State
Run `uv run scripts/before.py`. The core queries:
```python
# Check if the ICP Tier property already exists
# Use your chosen property name (e.g., "company_segment", "buyer_tier", "icp_tier")
PROPERTY_NAME = "company_segment"
resp = requests.get(f"{BASE}/crm/v3/properties/companies/{PROPERTY_NAME}",
headers=HEADERS)
print("Property exists" if resp.status_code == 200 else "Property does not exist yet")
# Check data coverage for classification
for prop_name in ["industry", "numberofemployees"]:
resp = requests.post(f"{BASE}/crm/v3/objects/companies/search", headers=HEADERS, json={
"filterGroups": [{"filters": [
{"propertyName": prop_name, "operator": "NOT_HAS_PROPERTY"},
]}],
"limit": 1,
})
print(f"Companies missing {prop_name}: {resp.json()['total']}")
```
## Execute
### Step 1: Create the ICP Tier Property
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):** run `uv run scripts/execute.py`, which posts:
```python
# Configure your property name here
PROPERTY_NAME = "company_segment"
resp = requests.post(f"{BASE}/crm/v3/properties/companies", headers=HEADERS, json={
"name": PROPERTY_NAME,
"label": "ICP Tier",
"type": "enumeration",
"fieldType": "select",
"groupName": "companyinformation",
"description": "Automated ICP classification based on industry and employee count. "
"Set by workflow - do not edit manually.",From TomGranot/hubspot-admin-skills, MIT.
More from TomGranot/hubspot-admin-skills
- 0.675score
sandbox-self-test
tomgranot
Verify the entire toolkit against a disposable HubSpot developer test account or sandbox that you bring: seed synthetic fixtures, run every scripted skill's…
SkillAFreshness: A★ 77Claude Code +9 - 0.675score
hubspot-audit
tomgranot
Run a full, read-only HubSpot portal audit covering both the marketing and sales sides: database, deliverability, engagement, owners, pipelines, deal quality…
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
delete-no-email-contacts
tomgranot
Delete contacts with no email address from a HubSpot CRM instance.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
suppress-global-unsubscribes
tomgranot
Identify and suppress globally unsubscribed contacts to ensure legal compliance and reduce billing.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
new-contact-hygiene-workflow
tomgranot
Build a HubSpot workflow that auto-enriches and stages new contacts upon creation.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
merge-duplicate-companies
tomgranot
Identify duplicate company records by domain and name, export audit CSVs for review, and guide merging.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
bounce-monitoring-workflow
tomgranot
Build a workflow to protect sender reputation through automated bounce monitoring.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
lifecycle-progression-workflow
tomgranot
Build workflows to automate contact progression through the sales funnel: Lead to MQL to SQL to Opportunity to Customer.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
build-smart-lists
tomgranot
Create foundational segmented lists for marketing and sales operations via the Lists API, plus advanced UI-built segments: a master sendable list, ICP-based…
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
cleanup-deals
tomgranot
Find past-due, stale, incomplete, unexplained-loss, and likely test deals, then route each owner's flagged deals to them as one review task.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
assign-unowned-contacts
tomgranot
Assign an owner to marketing contacts that have no owner.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
engagement-suppression-workflow
tomgranot
Build a two-tier sunset workflow that re-engages dormant contacts before suppressing them.
SkillAFreshness: A★ 77Claude Code +9
Compare and alternatives
Featured in
Signals
- Stars
- 77
- Forks
- 18
- Open issues
- 0
- Last commit (this folder)
- Oct 12, 2026 (15 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Version
- 1.1
- License
- MIT
- Website
- hubspot.granot.io
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from tomgranot
- 0.675score
hubspot-audit
tomgranot
Run a full, read-only HubSpot portal audit covering both the marketing and sales sides: database, deliverability, engagement, owners, pipelines, deal quality…
SkillAFreshness: A★ 77Claude Code +9 - 0.675score
sandbox-self-test
tomgranot
Verify the entire toolkit against a disposable HubSpot developer test account or sandbox that you bring: seed synthetic fixtures, run every scripted skill's…
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
merge-duplicate-companies
tomgranot
Identify duplicate company records by domain and name, export audit CSVs for review, and guide merging.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
suppress-global-unsubscribes
tomgranot
Identify and suppress globally unsubscribed contacts to ensure legal compliance and reduce billing.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
assign-unowned-contacts
tomgranot
Assign an owner to marketing contacts that have no owner.
SkillAFreshness: A★ 77Claude Code +9 - 0.672score
lifecycle-progression-workflow
tomgranot
Build workflows to automate contact progression through the sales funnel: Lead to MQL to SQL to Opportunity to Customer.
SkillAFreshness: A★ 77Claude Code +9
Cite this page
create-icp-tiers skill. Agent Mart. https://agentmart.dev/skills/tomgranot-create-icp-tiers (last updated 2026-10-24)