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

crm-data-quality — скилл для Claude Code: чистка данных в HubSpot

Скилл для работы с записями HubSpot: находит незаполненные поля, приводит значения к одному виду, сливает дубликаты и проверяет свойства.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add HubSpot/agent-cli-skills --skill crm-data-quality -a claude-code
Открыть на GitHub

Что делает crm-data-quality

Скилл опирается на bulk-operations: JSONL-пайпы, пакетное чтение, пагинация и схема dry-run → digest → confirm работают во всех командах ниже. Сначала читается bulk-operations/SKILL.md, потому что без пагинации поиск отдаёт максимум 100 строк за вызов, и дубликаты на границе страниц просто потеряются.

Имена свойств не угадываются — их смотрят через hubspot properties list. Дальше три сценария: поиск неполных записей фильтрами вроде !email или !phone AND !mobilephone, нормализация значений через jq с записью в objects update, и слияние дубликатов командой hubspot objects merge. Для слияния вторичная запись складывается в основную и удаляется — отката нет, поэтому сначала --dry-run, потом тот же поток с --digest и --confirm.

Четвёртая часть — аудит свойств: подсчёт по группам, список enumeration-полей, работа с опциями через properties options-*. У свойств, заданных самим HubSpot, опции только для чтения, и options-create, options-update, options-delete отклоняются до обращения к API. Если слияние всё же ушло не в ту сторону, вторичную запись достают из корзины в интерфейсе, а hubspot history --since 1h покажет след операции.

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

  • найти контакты без email или телефона
  • привести разнобой в названиях компаний к одному значению
  • слить дубликаты контактов по совпадающему email
  • проверить, какие свойства заведены в аккаунте и в каких группах
  • посмотреть допустимые значения enumeration-свойства

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

  • найди контакты без телефона и покажи их email
  • приведи названия компании к одному виду и сначала прогони dry-run
  • сли дубликаты контактов по email, начни с dry-run

Как установить crm-data-quality

1Через Skills CLI (Vercel)

npx skills add HubSpot/agent-cli-skills --skill crm-data-quality -a claude-code

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

~/.claude/skills/crm-data-quality/SKILL.md

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

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

Вопросы о crm-data-quality

Как установить crm-data-quality в Claude?

Выполните npx skills add HubSpot/agent-cli-skills --skill crm-data-quality -a claude-code. Скилл появится в ~/.claude/skills/crm-data-quality/SKILL.md.

Что делает crm-data-quality?

Ищет неполные записи, массово нормализует значения полей, сливает дубликаты через hubspot objects merge и проверяет свойства, включая опции enumeration-полей.

Можно ли отменить слияние записей?

Нет, вторичная запись складывается в основную и удаляется. Если направление выбрано неверно, вторичную запись восстанавливают из корзины в интерфейсе, а hubspot history --since 1h покажет след операции.

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

SKILL.md · Apache-2.0
---
name: crm-data-quality
description: Find incomplete records, normalize field values in bulk, dedupe with `hubspot objects merge`, and audit custom properties. Builds on `bulk-operations` for JSONL piping and dry-run/digest/confirm.
triggers:
  - "clean up contacts"
  - "data quality"
  - "deduplicate"
  - "missing fields"
  - "normalize data"
  - "find incomplete records"
  - "merge duplicates"
  - "audit properties"
---

Read `bulk-operations/SKILL.md` first — JSONL piping, batch read, pagination, and dry-run/digest/confirm gating apply to every command below.

## Property discovery

Don't guess property names. List them:

```bash
hubspot properties list --type contacts --format table
hubspot properties list --type contacts | jq -c 'select(.type=="enumeration") | {name, label}'
```

Same for `--type companies`, `deals`, or any custom type (`hubspot objects types`).

## 1. Find incomplete records

`!name` = NOT_HAS_PROPERTY (missing or empty). Bare `name` = HAS_PROPERTY. Within one `--filter`, chain with `AND`; multiple `--filter` flags are OR'd.

```bash
hubspot objects search --type contacts --filter "!email" --properties firstname,lastname,company
hubspot objects search --type contacts --filter "!phone AND !mobilephone" --properties email
hubspot objects search --type contacts --filter "!hubspot_owner_id" --properties email,lifecyclestage
```

For >100 results, use the pagination loop from `bulk-operations`.

## 2. Normalize field values

Search → reshape with `jq` → pipe into `update`. `objects update` is irreversible, so `--dry-run` first — the dry-run → digest → confirm flow is required at every row count, not just >100 (`bulk-operations` covers it end to end). Reshape patterns: `bulk-operations/resources/json-patterns.md`.

```bash
# Collapse spellings into one canonical value — 1. preview
hubspot objects search --type contacts --filter "company~acme" \
| jq -c '{id, properties:{company:"Acme Corporation"}}' \
| hubspot objects update --type contacts --dry-run \
| tee /tmp/normalize.preview.jsonl

# 2. lift the digest + confirm (present at every row count)
digest=$(jq -r 'select(.digest != null) | .digest' /tmp/normalize.preview.jsonl)
confirm=$(jq -r 'select(.digest != null) | .target.id' /tmp/normalize.preview.jsonl)   # single: record ID; batch of 2+: row count

# 3. execute — re-pipe the SAME inputs plus --digest/--confirm
hubspot objects search --type contacts --filter "company~acme" \
| jq -c '{id, properties:{company:"Acme Corporation"}}' \
| hubspot objects update --type contacts --digest "$digest" --confirm "$confirm"

# Lowercase emails (read, reshape, write) — 1. preview
hubspot objects search --type contacts --filter "email" --properties email \
| jq -c '{id, properties:{email: (.properties.email | ascii_downcase)}}' \
| hubspot objects update --type contacts --dry-run \
| tee /tmp/lower.preview.jsonl

# 2. lift the digest + confirm, then 3. re-pipe the SAME inputs to execute
digest=$(jq -r 'select(.digest != null) | .digest' /tmp/lower.preview.jsonl)
confirm=$(jq -r 'select(.digest != null) | .target.id' /tmp/lower.preview.jsonl)
hubspot objects search --type contacts --filter "email" --properties email \
| jq -c '{id, properties:{email: (.properties.email | ascii_downcase)}}' \
| hubspot objects update --type contacts --digest "$digest" --confirm "$confirm"
```

## 3. Dedupe with `hubspot objects merge`

Secondary is folded into primary and deleted. **Irreversible.** Dry-run/digest/confirm gating applies.

```bash
# Single pair — dry-run first, then execute with the digest + confirm (confirm = the secondary ID for one pair)
hubspot objects merge --type contacts --primary 149 --secondary 425 --dry-run
hubspot objects merge --type contacts --primary 149 --secondary 425 --digest <hash> --confirm 425
```

Bulk: pipe JSONL `{"primary":"...","secondary":"..."}` on stdin (omit `--primary`/`--secondary`).

**Pagination required.** `objects search` caps at 100 rows per call and `jq -s` slurps a single stream into memory — running the snippet below against a raw `search` will silently miss every duplicate that crosses a page boundary. Collect the full set first with the pagination loop from `bulk-operations/SKILL.md` (write to `/tmp/contacts.jsonl`), then dedupe from the file:

```bash
# /tmp/contacts.jsonl produced by the pagination loop (bulk-operations/SKILL.md)
jq -s -c '
    group_by(.properties.email)[]
    | select(length > 1)
    | sort_by(.id | tonumber)
    | .[0].id as $p | .[1:][] | {primary: $p, secondary: .id}
  ' /tmp/contacts.jsonl \
| hubspot objects merge --type contacts --dry-run | tee /tmp/merge-preview.jsonl
```

Lift the digest/confirm from the preview line at any size — `select(.digest != null)`; for a batch the confirm is the pair count (`.target.id`), and `mutation_kind` is `BulkData` only above the 100-row threshold (`RecordMutation` at or below it, but the digest is present either way). Re-pipe the same producer with `--digest`/`--confirm` (see `bulk-operations`).

## 4. Audit properties

`hubspot properties list` (and `get`, `batch-read`) emits `{name, label, type, fieldType, groupName, optionsDisplay}` per row. Enum option values are exposed via `properties options-list` — no need to read them off a live record or the UI.

```bash
# Count properties per group (HubSpot groups standard fields; custom groups stand out)
hubspot properties list --type contacts | jq -rs 'group_by(.groupName) | map({group: .[0].groupName, count: length}) | .[]'

# All enumeration properties
hubspot properties list --type contacts | jq -c 'select(.type=="enumeration") | {name, label, fieldType}'

# Create a DQ flag property, then set it via the normalize pattern in section 2
hubspot properties create --type contacts --name dq_missing_phone --label "DQ: Missing Phone" --prop-type string --field-type text
```

### Enum options — list and manage (`properties options-*`, v0.11.0)

```bash
# List the allowed options on an enumeration property
hubspot properties options-list --type contacts hs_buying_role
# each row: {"value":"EVALUATOR","label":"Evaluator","displayOrder":9,"hidden":false}

# Add / rename / remove an option (options-delete is irreversible — dry-run → digest → confirm, confirm = the option value)
hubspot properties options-create --type contacts hs_buying_role --label "Evaluator" --value EVALUATOR --display-order 9
hubspot properties options-update --type contacts hs_buying_role --value EVALUATOR --label "New Label"
hubspot properties options-delete --type contacts hs_buying_role --value EVALUATOR --dry-run
hubspot properties options-delete --type contacts hs_buying_role --value EVALUATOR --digest <hash> --confirm EVALUATOR
```

HubSpot-defined properties with read-only options reject `options-create`/`update`/`delete` before the API is called.

## Recovery

Merge is irreversible. After any merge, `hubspot history --since 1h` captures the audit trail. If wrong direction, restore the secondary from the UI's recycle bin.

© HubSpot · Apache-2.0 · HubSpot/agent-cli-skills

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

Все скиллы по теме «Данные и базы» →
crm-data-governance Maya-Beth Finotti Скилл помогает выстроить управление полями в CRM: назначить ответственных, задать мастер-системы и правила разрешения конфликтов. Пригодится, когда поля перезаписываются или устаревают. CX Codex +1 20 300установок data-quality-frameworks Seth Hobson Скилл помогает проверять качество данных через Great Expectations, dbt-тесты и контракты данных. Подойдёт для пайплайнов, CI/CD и контроля схем. CX Codex 11 230установок data-quality-auditor Alireza Rezvani Скилл проверяет датасеты на пропуски, выбросы, дубликаты и нарушения структуры. Подойдёт перед анализом, обучением модели или настройкой мониторинга. 621установок analyze-data-quality официальный Data Analytics Maintainers Проверяет надёжность таблиц и метрик перед анализом или обучением моделей. Помогает найти скрытые дубли и аномалии. CX Codex GP ChatGPT 9установок canva-creator официальный anthropics Берёт готовый бриф контента и пошагово разворачивает кампанию: строит календарь публикаций, создаёт макеты в Canva для соцсетей, пишет тексты и отправляет посты в HubSpot. CX Codex +1 1 900установок data-quality-checker tradermonty Скилл проверяет рыночные обзоры и статьи перед публикацией: масштаб цен, тикеры, даты, суммы аллокаций, единицы. Находки идут как предупреждения для ручной проверки. CX Codex +1 3 300установок

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

ticket-resolution Скилл ведёт тикеты HubSpot из терминала: создаёт, сортирует по приоритету, двигает по стадиям и закрывает с записью решения. CX Codex +1 2 000установок workflow-automation Скилл учит агента управлять автоматизациями HubSpot через агентский CLI hubspot. Помогает создавать, читать, обновлять и удалять сценарии v4 flows API прямо из терминала. CX Codex +1 1 800установок bulk-operations Скилл задаёт базовые приёмы работы с CLI hubspot: пакетное чтение, пагинация, JSONL-конвейеры и безопасные массовые записи. CX Codex +1 1 800установок quote-to-cash Скилл для работы с HubSpot через CLI: создаёт товары, собирает сметы со строками и связями, читает счета и подписки. CX Codex +1 1 700установок customer-retention Находит клиентов без контакта и с риском оттока через фильтры CRM HubSpot, затем создаёт задачи на дозвон пачкой. CX Codex +1 1 700установок team-ownership Разбирает, кому принадлежат контакты, сделки и тикеты в HubSpot, и переносит владение при уходе сотрудника. CX Codex +1 1 700установок communication-history Скилл вытаскивает из HubSpot звонки, письма, заметки, встречи и задачи по контакту, сделке или компании и собирает справку перед звонком. CX Codex +1 1 700установок custom-object-management Скилл для работы со схемами кастомных объектов HubSpot CRM: посмотреть, создать, обновить метаданные или удалить тип объекта через CLI. CX Codex +1 1 700установок

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

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