Create Segment Lists
Build a library of segment lists that enable targeted marketing, accurate reporting, and proper suppression. These lists form the foundation of segment-based operations.
Prerequisites
- A HubSpot private app access token (
HUBSPOT_ACCESS_TOKEN in .env) with crm.lists.read and crm.lists.write scopes
- Python 3.10+ with
uv
- ICP tier property created (run
/create-icp-tiers first)
- Lifecycle stages cleaned up (run
/fix-lifecycle-stages first)
Interview: Gather Requirements
Before executing, collect the following information from the user:
Q1: What are your key customer segments?
- Examples: Industry verticals (Manufacturing, Professional Services, Retail, Education, Logistics), company size tiers (Enterprise, Mid-Market, SMB), geographic regions (North America, EMEA, APAC)
- Default: Core business segments (Customers, Partners, Competitors, Internal) plus ICP tiers and engagement-based segments
Q2: What engagement criteria define "active" for your business?
- Examples: Email open or click in last 90 days, website visit in last 60 days, form submission in last 30 days, meeting booked in last 90 days
- Default: Any email engagement (open or click) within the last 90 days
Recommended Segments
Core Business Segments
| List Name |
Type |
Criteria |
| All Customers |
Active |
Lifecycle stage = Customer |
| All Partners |
Active |
Contact type = Partner (or custom property) |
| Competitors |
Static |
Manually curated from known competitor domains |
| Internal Employees |
Active |
Email domain matches company domain |
| Suppressed Contacts |
Active |
Marketing status = non-marketing OR globally unsubscribed |
ICP-Based Segments
| List Name |
Type |
Criteria |
| ICP Tier 1 |
Active |
ICP tier property = Tier 1 |
| ICP Tier 2 |
Active |
ICP tier property = Tier 2 |
| ICP Tier 3 |
Active |
ICP tier property = Tier 3 |
| Non-ICP |
Active |
ICP tier property = Non-ICP or unknown |
Industry Segments
| List Name |
Type |
Criteria |
| [Industry Name] |
Active |
Industry = [value] |
| (Create one per target industry) |
|
|
Engagement Segments
| List Name |
Type |
Criteria |
| Highly Engaged (90 days) |
Active |
Email open or click in last 90 days |
| Disengaged (6+ months) |
Active |
No email engagement in 180+ days |
| Never Engaged |
Active |
No email opens ever AND created 30+ days ago |
Step-by-Step Instructions
Stage 1: Plan
- Run the requirements interview above and decide which segments are relevant to the business.
- Check for existing lists that overlap — merge or rename rather than creating duplicates.
Stage 2: Before
- Confirm the properties these lists depend on are populated (ICP tier, lifecycle stage, industry).
- Inventory existing lists (
POST /crm/v3/lists/search) and record the baseline count.
Stage 3: Execute — Create Lists
Use the Lists API (v3) to create active (smart) lists:
import os, requests
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.environ["HUBSPOT_ACCESS_TOKEN"]
BASE = "https://api.hubapi.com"
HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
# Example: Create "All Customers" list
resp = requests.post(f"{BASE}/crm/v3/lists", headers=HEADERS, json={
"name": "All Customers",
"objectTypeId": "0-1", # contacts
"processingType": "DYNAMIC",
"filterBranch": {
"filterBranchType": "OR",
"filterBranches": [{
"filterBranchType": "AND",
"filterBranches": [],
"filters": [{
"filterType": "PROPERTY",
"property": "lifecyclestage",
"operation": {
"operationType": "ENUMERATION",
"operator": "IS_ANY_OF",
"values": ["customer"],
},
}],
}],
"filters": [],
},
})
resp.raise_for_status()
Create each list, verify member count, and document the list ID.
For static lists (Competitors), create the list and manually add contacts or import from a CSV.
Stage 4: After
- Check member counts for each list — do they match expectations?
- Verify no contacts appear in mutually exclusive lists (e.g., both Customer and Competitor).
- Confirm lists are visible to the appropriate teams.
Rollback
- Lists can be deleted via the API or UI.
- Deleting a list does not affect the contacts in it — only the list definition is removed.
- Check if any workflows or emails reference the list before deleting.
Tips
- Use a consistent naming convention:
[Category] - Segment Name (e.g., [ICP] - Tier 1, [Industry] - Manufacturing).
- Review segment membership quarterly — segments should grow or shrink in expected ways.
- Use these lists as building blocks for email sends, ad audiences, and workflow enrollment triggers.
1---2name: create-segment-lists3description: "Create business segment lists in HubSpot for customers, partners, competitors, employees, ICP tiers, and industries. Enables segment-based targeting, suppression, and analytics."4license: MIT5metadata:6 author: tomgranot7 version: "1.1"8 category: ongoing-maintenance9---1011# Create Segment Lists1213Build a library of segment lists that enable targeted marketing, accurate reporting, and proper suppression. These lists form the foundation of segment-based operations.1415## Prerequisites1617- A HubSpot private app access token (`HUBSPOT_ACCESS_TOKEN` in `.env`) with `crm.lists.read` and `crm.lists.write` scopes18- Python 3.10+ with [`uv`](https://github.com/astral-sh/uv)19- ICP tier property created (run `/create-icp-tiers` first)20- Lifecycle stages cleaned up (run `/fix-lifecycle-stages` first)2122## Interview: Gather Requirements2324Before executing, collect the following information from the user:2526**Q1: What are your key customer segments?**27- Examples: Industry verticals (Manufacturing, Professional Services, Retail, Education, Logistics), company size tiers (Enterprise, Mid-Market, SMB), geographic regions (North America, EMEA, APAC)28- Default: Core business segments (Customers, Partners, Competitors, Internal) plus ICP tiers and engagement-based segments2930**Q2: What engagement criteria define "active" for your business?**31- Examples: Email open or click in last 90 days, website visit in last 60 days, form submission in last 30 days, meeting booked in last 90 days32- Default: Any email engagement (open or click) within the last 90 days3334## Recommended Segments3536### Core Business Segments3738| List Name | Type | Criteria |39|-----------|------|----------|40| All Customers | Active | Lifecycle stage = Customer |41| All Partners | Active | Contact type = Partner (or custom property) |42| Competitors | Static | Manually curated from known competitor domains |43| Internal Employees | Active | Email domain matches company domain |44| Suppressed Contacts | Active | Marketing status = non-marketing OR globally unsubscribed |4546### ICP-Based Segments4748| List Name | Type | Criteria |49|-----------|------|----------|50| ICP Tier 1 | Active | ICP tier property = Tier 1 |51| ICP Tier 2 | Active | ICP tier property = Tier 2 |52| ICP Tier 3 | Active | ICP tier property = Tier 3 |53| Non-ICP | Active | ICP tier property = Non-ICP or unknown |5455### Industry Segments5657| List Name | Type | Criteria |58|-----------|------|----------|59| [Industry Name] | Active | Industry = [value] |60| (Create one per target industry) | | |6162### Engagement Segments6364| List Name | Type | Criteria |65|-----------|------|----------|66| Highly Engaged (90 days) | Active | Email open or click in last 90 days |67| Disengaged (6+ months) | Active | No email engagement in 180+ days |68| Never Engaged | Active | No email opens ever AND created 30+ days ago |6970## Step-by-Step Instructions7172### Stage 1: Plan73741. Run the requirements interview above and decide which segments are relevant to the business.752. Check for existing lists that overlap — merge or rename rather than creating duplicates.7677### Stage 2: Before78791. Confirm the properties these lists depend on are populated (ICP tier, lifecycle stage, industry).802. Inventory existing lists (`POST /crm/v3/lists/search`) and record the baseline count.8182### Stage 3: Execute — Create Lists8384Use the Lists API (v3) to create active (smart) lists:8586```python87import os, requests88from dotenv import load_dotenv8990load_dotenv()91TOKEN = os.environ["HUBSPOT_ACCESS_TOKEN"]92BASE = "https://api.hubapi.com"93HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}9495# Example: Create "All Customers" list96resp = requests.post(f"{BASE}/crm/v3/lists", headers=HEADERS, json={97 "name": "All Customers",98 "objectTypeId": "0-1", # contacts99 "processingType": "DYNAMIC",100 "filterBranch": {101 "filterBranchType": "OR",102 "filterBranches": [{103 "filterBranchType": "AND",104 "filterBranches": [],105 "filters": [{106 "filterType": "PROPERTY",107 "property": "lifecyclestage",108 "operation": {109 "operationType": "ENUMERATION",110 "operator": "IS_ANY_OF",111 "values": ["customer"],112 },113 }],114 }],115 "filters": [],116 },117})118resp.raise_for_status()119```120121Create each list, verify member count, and document the list ID.122123For static lists (Competitors), create the list and manually add contacts or import from a CSV.124125### Stage 4: After1261271. Check member counts for each list — do they match expectations?1282. Verify no contacts appear in mutually exclusive lists (e.g., both Customer and Competitor).1293. Confirm lists are visible to the appropriate teams.130131## Rollback132133- Lists can be deleted via the API or UI.134- Deleting a list does not affect the contacts in it — only the list definition is removed.135- Check if any workflows or emails reference the list before deleting.136137## Tips138139- Use a consistent naming convention: `[Category] - Segment Name` (e.g., `[ICP] - Tier 1`, `[Industry] - Manufacturing`).140- Review segment membership quarterly — segments should grow or shrink in expected ways.141- Use these lists as building blocks for email sends, ad audiences, and workflow enrollment triggers.