К основному содержанию
скилл CX Codex

build-smart-lists — скилл для Claude Code: что делает и как установить

Скилл создаёт базовые динамические списки в HubSpot через Lists API v3 и даёт шаблоны для ручной сегментации в интерфейсе. Пригодится для наведения порядка перед запуском рассылок и приоритизации лидов.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add TomGranot/hubspot-admin-skills --skill build-smart-lists -a claude-code
Открыть на GitHub

Что делает build-smart-lists

Скилл автоматически разворачивает десять базовых динамических списков в HubSpot через Lists API v3. Скрипт scripts/execute.py генерирует выборки контактов по этапам жизненного цикла (Lead, MQL, SQL, Customer), статусу рассылки и активности за последние 90 дней, а также три сегмента компаний по уровням ICP. Если список с таким именем уже есть, скрипт пропускает его по коду ответа 409. Идентификаторы созданных списков сохраняются в CSV-отчёте.

Для запуска требуется Python 3.10+ с менеджером пакетов uv. Без токена HUBSPOT_ACCESS_TOKEN в файле .env с правами crm.lists.read и crm.lists.write скрипт не выполнит запросы к API. Также в CRM должно быть заполнено свойство сегмента компании (company_segment). Иначе списки ICP сформируются с ошибками.

Вторая часть сегментации настраивается вручную через интерфейс HubSpot. Скилл даёт правила для восьми сложных списков: отсева отписавшихся контактов, выборки ключевых лиц компании и кандидатов на реактивацию. Задать окно активности можно через параметр ACTIVE_WINDOW_DAYS.

Какие задачи решает

  • Развернуть десять базовых динамических списков через Lists API v3
  • Сегментировать компании по уровням ICP Tier 1, Tier 2 и Tier 3
  • Найти неактивные контакты без открытий писем за 180 дней
  • Сформировать мастер-список контактов, доступных для маркетинговых рассылок

Примеры запросов агенту

  • Запусти скрипт создания базовых списков в HubSpot с окном активности в 90 дней
  • Помоги настроить динамический список лиц, принимающих решения, в интерфейсе HubSpot
  • Проверь требования для развёртывания списков ICP через HubSpot API

Как установить build-smart-lists

1Через Skills CLI (Vercel)

npx skills add TomGranot/hubspot-admin-skills --skill build-smart-lists -a claude-code

2Вручную: положить файлы

~/.claude/skills/build-smart-lists/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/build-smart-lists/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о build-smart-lists

Как установить build-smart-lists в Claude Code?

Выполните команду npx skills add TomGranot/hubspot-admin-skills --skill build-smart-lists -a claude-code. Файл навыка сохранится по пути ~/.claude/skills/build-smart-lists/SKILL.md.

Что делает скилл build-smart-lists?

Он автоматически создаёт десять системных динамических списков в HubSpot через API и даёт инструкции по ручной настройке расширенных сегментов в интерфейсе. База разделяется по этапам воронки, уровням ICP и дате последних открытий писем.

Какие доступы и зависимости нужны для работы?

Нужны права Super Admin или Marketing Hub Admin в HubSpot и ключ в .env с разрешениями crm.lists.read и crm.lists.write. Для запуска скрипта требуется Python 3.10+ и утилита uv.

Исходный текст

SKILL.md · MIT
---
name: build-smart-lists
description: "Create foundational segmented lists for marketing and sales operations via the Lists API, plus advanced UI-built segments: a master sendable list, ICP-based lists, persona lists, and engagement lists. All active (dynamic) lists."
license: MIT
metadata:
  author: tomgranot
  version: "1.1"
  category: segmentation-scoring
---

# Build Smart Lists for Segmentation

Create the core active (dynamic) lists that serve as the foundation for all marketing campaigns, sales prioritization, and database health monitoring. Ten foundation lists are created automatically via the Lists API (v3); a further set of advanced segments is built in the UI.

## Why This Matters

Without predefined lists, every email campaign requires building filters from scratch, there is no standardized definition of "who can we actually email", and there is no persona-based segmentation. The marketing team cannot quickly answer basic questions like "How many senior decision-makers can we email right now?" or "How many engaged contacts do we have?"

## Prerequisites

- Super Admin or Marketing Hub Admin permissions
- A HubSpot service key (`HUBSPOT_ACCESS_TOKEN` in `.env`; an existing legacy private app token also works) with `crm.lists.read` and `crm.lists.write` scopes
- Python 3.10+ with [`uv`](https://github.com/astral-sh/uv)
- ICP Tier property created and workflows processed (create-icp-tiers skill) — the script assumes the property name `company_segment` with values like `tier_1_primary_icp`; adjust its configuration block if yours differ
- Lead scoring model created (build-lead-scoring skill) is recommended but not required
- Lifecycle Stage property populated for customers and partners (fix-lifecycle-stages skill)

## 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/build-smart-lists/` in a clone of the repo).

| Stage | Script | Run with |
|-------|--------|----------|
| Execute | [`scripts/execute.py`](./scripts/execute.py) | `uv run scripts/execute.py` |

`execute.py` creates the 10 foundation lists below via `POST /crm/v3/lists`, skips lists that already exist (409), and writes a CSV audit trail of created list IDs. There are no before/after scripts: the before-state inventory is a single Lists API query (see Before), and verification is a member-count review in the UI.

## Interview: Gather Requirements

Before executing, collect the following information from the user:

**Q1: What defines "engaged" for your business? (e.g., activity in last 60-120 days)**
- Examples: Email open or click in last 90 days, website visit in last 60 days, form submission in last 30 days
- Default: Email open or click in the last 90 days (set `ACTIVE_WINDOW_DAYS` in the script; shorter cycles suit high-velocity sales, longer cycles suit enterprise)

**Q2: What job titles represent your target personas?**
- Examples: CEO, COO, CFO, CTO, CRO, VP of Operations, VP of Marketing, Director of Operations, Director of Marketing, Head of Procurement, Engineering Manager
- Default: C-suite and VP/Director-level leaders across business functions (used for the UI-built persona list)

## The List Library

### Foundation lists (created by the script)

| # | List Name | Object | Key Filter |
|---|-----------|--------|-----------|
| 1 | All Marketing Contacts | Contacts | `hs_marketable_status` = true |
| 2 | All Leads | Contacts | Lifecycle stage = Lead |
| 3 | All MQLs | Contacts | Lifecycle stage = MQL |
| 4 | All SQLs | Contacts | Lifecycle stage = SQL |
| 5 | All Customers | Contacts | Lifecycle stage = Customer |
| 6 | ICP Tier 1 Companies | Companies | ICP Tier = Tier 1 |
| 7 | ICP Tier 2 Companies | Companies | ICP Tier = Tier 2 |
| 8 | ICP Tier 3 Companies | Companies | ICP Tier = Tier 3 |
| 9 | Engaged Last 90 Days | Contacts | Email open OR click within the active window |
| 10 | Unengaged 180+ Days | Contacts | Marketable + no email open beyond the re-engagement window |

### Advanced segments (built in the UI)

These use features that benefit from human judgment and portal-specific configuration (list-membership filters, persona keywords, form-name keywords):

| # | List Name | Purpose | Key Filters |
|---|-----------|---------|-------------|
| A | Marketable - Active | Master sendable list (who CAN receive email) | Marketing contact + not unsubscribed + not bounced + has email + not quarantined |
| B | ICP Tier 1 Contacts | Highest priority *contacts* | Associated company ICP Tier = Tier 1 + member of Marketable - Active |
| C | ICP Tier 2 Contacts | Secondary priority contacts | Associated company ICP Tier = Tier 2 + member of Marketable - Active |
| D | Partners | Partner communications and exclusion | Lifecycle stage = Partner (or custom contact type property) |
| E | Re-engagement Needed | Sunset candidates | 5+ emails delivered + no open in 180 days + member of Marketable - Active |
| F | Senior Decision Makers | Top persona list | Job title contains target titles |
| G | Industry Leaders | Contacts at companies in target verticals | Associated company industry is any of target industries |
| H | Content Engaged | Form submissions and content downloads | Form submissions > 0 OR conversion contains content keywords |

Overlap note: "All Customers" (script) covers the Customers use case; "Unengaged 180+ Days" (script) is a simpler variant of "Re-engagement Needed" (UI, adds the delivered-count guard). Keep whichever fits your operation — do not maintain both without a reason.

## Plan

1. Run the interview above; set `ACTIVE_WINDOW_DAYS`, `REENGAGEMENT_WINDOW_DAYS`, and `ICP_PROPERTY_NAME` in the script's configuration block
2. Decide which advanced segments to build in the UI
3. Create foundation lists via the script, advanced segments via the UI
4. Verify list sizes make sense relative to the database

## Before

Inventory existing lists to avoid duplicates (`POST /crm/v3/lists/search` with an empty query returns all lists, paginated). Check for name collisions with the library above — the script skips exact name matches (HTTP 409), but near-duplicates ("Customers" vs "All Customers") need a human decision: merge, rename, or skip.

## Execute

### Step 1: Foundation lists (script)

```bash
uv run scripts/execute.py
```

The script posts each definition to `POST /crm/v3/lists` with `processingType: "DYNAMIC"`. Example payload shape (see the script for all ten):

```python
{
    "name": "All Customers",
    "objectTypeId": "0-1",  # contacts ("0-2" for companies)
    "processingType": "DYNAMIC",
    "filterBranch": {
        "filterBranchType": "AND",
        "filterBranches": [],
        "filters": [{
            "filterType": "PROPERTY",
            "property": "lifecyclestage",
            "operation": {
                "operationType": "ENUMERATION",
                "operator": "IS_EQUAL_TO",
                "value": "customer",
            },
        }],
    },
}
```

If the Lists API returns 403 on your plan tier, build the same lists manually in the UI using the table above.

### Step 2: Marketable - Active (master sendable list — UI)

**This is the most important advanced list.** It defines the single source of truth for "who can receive marketing email." All campaign sends should reference this list.

1. Go to **Contacts > Lists > Create list**
2. Select **Contact-based > Active list**
3. Name: `Marketable - Active`
4. Add filters (all AND logic):
   - Marketing contact status > is any of > Marketing contact
   - AND Unsubscribed from all email > is not equal to > True
   - AND Hard bounce reason > is unknown
   - AND Email > is known
   - AND Email quarantined > is not equal to > True
5. Save the list

### Step 3: Remaining advanced segments (UI)

**ICP Tier 1 / Tier 2 Contacts (B, C):**
- Filters: Associated company property > ICP Tier > is any of > [tier] AND List membership > is member of > Marketable - Active
- **Using List membership as a filter** is a powerful pattern: these lists automatically inherit all deliverability and consent logic from Marketable - Active. New disqualification conditions added there propagate automatically.

**Partners (D):** Lifecycle stage > is any of > Partner. Always exclude from prospect campaigns.

**Re-engagement Needed (E):**
- Marketing emails delivered > is greater than > 5
- AND Last marketing email open date > is more than > 180 days ago (tune to your cycle: 120-270)
- AND List membership > is member of > Marketable - Active
- Feeds the engagement-based suppression workflow.

**Senior Decision Makers (F):** Job title > contains any of > [your target titles]. Customize keywords to your buyer personas.

**Industry Leaders (G):** Associated company property > Industry > is any of > [your target industries].

**Content Engaged (H):** OR logic between groups:
- Number of Form Submissions > is greater than > 0
- OR First conversion > contains any of > [content keywords like "Download", "Guide", "Checklist", "E-Book", "Whitepaper"]
- OR Recent conversion > contains any of > [same keywords]
- The conversion-based filters depend on your form naming conventions — review actual form names (Marketing > Forms) and adjust.

## After

### Verify List Sizes

After all lists are created and processed:

| List | Expected Range | Red Flag If... |
|------|---------------|----------------|
| All Marketing Contacts / Marketable - Active | 30-80% of total contacts | Below 10% (too many excluded) or above 90% (filters too loose) |
| ICP Tier lists | 2-10% of marketable | 0 (ICP Tier not populated) |
| Engaged (active window) | 5-30% of total contacts | Below 2% (possible engagement tracking issue) |
| All Customers | Known customer count | Off by more than 20% from expected |
| Partners | Known partner count | Off by more than 20% from expected |
| Unengaged / Re-engagement Needed | 10-40% of marketable | Above 60% (possible date threshold issue) |
| Senior Decision Makers | 5-25% of total contacts | 0 (job title data missing) |
| Industry Leaders | 10-50% of total contacts | 0 (industry data missing) |
| Content Engaged | 1-10% of total contacts | 0 (no form submissions or wrong keywords) |

### Verification Checklist

1. **All lists show as Active** (not Static) in the list view
2. **All lists have completed processing** (no "Processing" status)
3. **Sendable-list sanity check:** Open Marketable - Active (or All Marketing Contacts), click 5 random contacts. Each should have a valid email, not be unsubscribed, not be bounced.
4. **ICP list check:** Open an ICP Tier 1 list, click 5 records. Each should have ICP Tier = Tier 1.
5. **Persona list check:** Open Senior Decision Makers, verify job titles match expected patterns. Watch for false positives (e.g., "Marketing Intern" matching on "Marketing").
6. **Re-engagement check:** Verify contacts have 5+ emails delivered and no open beyond your configured window.

## Rollback

- Lists can be deleted via `DELETE /crm/v3/lists/{listId}` or the UI — the script's CSV audit trail records every list ID it created.
- Deleting a list does not affect the contacts in it — only the list definition is removed.
- Check whether any workflows, emails, or dependent lists (list-membership filters!) reference a list before deleting it.

## Key Technical Learnings

- **The master sendable list is the foundation.** Every email campaign should either send directly to it (with additional filters) or use it as an inclusion filter. Never send to a list that does not incorporate deliverability and consent checks.
- **List membership as a filter is a powerful pattern.** Changes to the master list's criteria automatically propagate to all dependent lists.
- **"Contains any of" for job titles is broad by design.** It matches the keyword anywhere in the title string, so "CTO" matches "CTO", "Former CTO", "Assistant to the CTO". Review lists periodically and add exclusion terms (e.g., AND Job title does not contain "Former", "Assistant", "Intern") if false positives become a problem.
- **Content and event lists depend on form naming conventions.** The keyword-based filters only work if forms follow a naming convention that includes the keywords. After creating the lists, check if counts seem too low and adjust keywords to match actual form names.
- **Active lists have a processing delay.** HubSpot processes active lists periodically (every few minutes for small lists, potentially longer for complex ones). Wait for processing to complete before judging counts.
- **Each list should be active (dynamic), not static.** Static lists are snapshots that never update. Active lists update automatically as contact properties change, which is essential for ongoing segmentation.
- **The ICP property name and values must match the create-icp-tiers skill.** The script defaults to property `company_segment` with values `tier_1_primary_icp` / `tier_2_secondary_icp` / `tier_3_tertiary_icp`. If you chose different names, update the script's configuration block before running.
- **Plan for growth.** These lists cover core use cases. As marketing operations mature, add more targeted lists: "MQL Ready" (score threshold), "Competitor Employees" (for exclusion), "Recent Form Submitters (Last 30 Days)" (for fast follow-up), or service/product-specific interest lists.
- **Build a dashboard.** Create a dashboard with one KPI tile per list showing the current count. This gives at-a-glance visibility into segment health and makes it easy to spot sudden changes (e.g., Marketable list drops 50% = something broke).

© tomgranot · MIT · TomGranot/hubspot-admin-skills

Похожие скиллы

Все скиллы по теме «Маркетинг и контент» →
seo-audit coreyhaines31 Скилл проводит технический и on-page аудит сайта: краулинг, индексация, Core Web Vitals, метатеги, hreflang. Пригодится, когда трафик упал или страницы застряли на второй выдаче. CX Codex +1 238 500установок programmatic-seo coreyhaines31 Скилл помогает планировать генерацию сотен посадочных страниц на базе шаблонов и структурированных данных. Позволяет избежать санкций поисковиков за пустой контент. CX Codex +1 150 800установок copy-editing coreyhaines31 Правит уже написанный маркетинговый текст: убирает речевые штампы, чистит формулировки и обновляет устаревшие страницы. Для нового текста с нуля не подходит. CX Codex +1 149 800установок marketing-ideas coreyhaines31 Скилл помогает подобрать маркетинговые идеи для SaaS или другого программного продукта с учётом этапа развития и доступных ресурсов. Пригодится, когда непонятно, с какого канала начать. CX Codex +1 147 400установок sales-enablement coreyhaines31 Скилл для ИИ-агента, который собирает презентации, one-pager'ы, скрипты демо и документы для отработки возражений. Пригодится, когда команда продаж просит материалы, а не очередную презентацию о продукте. CX Codex +1 119 400установок revops coreyhaines31 Скилл помогает проектировать RevOps: вести лидов по этапам, считать скоринг и выстраивать передачу из маркетинга в продажи. Нужен для CRM-процессов. CX Codex +1 114 000установок

Из того же набора37

cleanup-lead-owners Убирает из HubSpot уволенных сотрудников и переназначает их контакты, компании и сделки. Нужен, когда человек уходит, а его записи остаются висеть. CX Codex +1 ★ 78звёзд репо cleanup-forms Находит и удаляет неиспользуемые, тестовые и устаревшие формы в HubSpot через Forms API. Помогает навести порядок в панели маркетинга и отчётах. CX Codex +1 ★ 78звёзд репо cleanup-deals Находит проблемные сделки HubSpot и передаёт их владельцам на проверку. Удаление тестовых сделок возможно только после отметки человека в CSV. CX Codex +1 ★ 78звёзд репо cleanup-dashboards Наводит порядок в дашбордах HubSpot: находит заброшенные, дубли и тестовые, помогает свести отчёты к нескольким рабочим экранам. CX Codex +1 ★ 78звёзд репо build-lead-scoring Скилл помогает настроить в HubSpot отдельные оценки соответствия компании и активности контакта. Нужен, чтобы приоритизировать лиды для продаж и маркетинга. CX Codex +1 ★ 78звёзд репо bounce-monitoring-workflow Скилл собирает в HubSpot три воркфлоу для контроля отскоков: подавляет контакты после нескольких bounce, шлёт алерты и помечает адреса на ручную проверку. CX Codex +1 ★ 78звёзд репо backfill-geo-data Заполняет пропущенные город, регион и страну в контактах и компаниях HubSpot. Пригодится для распределения территорий и региональной отчётности. CX Codex +1 ★ 78звёзд репо audit-api-usage Скилл находит интеграции и внутренний код, обращающиеся к HubSpot API, отмечает устаревшие версии и частные приложения, а затем собирает план миграции. CX Codex +1 ★ 78звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой