Metadata Coverage: Extract & Deploy Status
Last updated: 2026-04-18. Codebase state: post-security-fixes branch. HubSpot API research: актуально на апрель 2026.
Легенда
| Символ | Значение |
|---|---|
| ✅ | Реализовано и работает надёжно |
| ⚠️ | Реализовано с оговорками / частично |
| 🔴 | Не деплоится (read-only или заблокировано) |
| ➕ | Не реализовано, но API HubSpot позволяет |
| ❌ | HubSpot API не поддерживает (read-only или нет публичного API) |
1. Что сейчас в репо: 17 типов
CRM — Схемы
| Тип | Экстракт | Деплой | Подводные камни |
|---|---|---|---|
custom_objects | ✅ | ✅ | При create — properties/associations вкладываются иерархически в payload |
standard_objects | ✅ | ⚠️ | Всегда update — стандартные объекты уже есть на любом портале, нельзя создать |
custom_object_property | ✅ | ✅ | Batch create (100/запрос), sequential update |
standard_object_property | ✅ | ✅ | Аналогично custom |
crm_properties | ✅ | ✅ | Простые свойства (contact, company, deal и т.д.) |
property_groups | ✅ | ✅ | Должны деплоиться до properties — порядок в DependencyGraph исправлен |
association_definitions | ✅ | ✅ | Требуют чтобы оба объекта уже существовали на таргете |
pipelines | ✅ | ✅ | |
pipeline_stages | ✅ | ✅ | При create pipeline — stages вкладываются в payload |
Маркетинг и автоматизация
| Тип | Экстракт | Деплой | Подводные камни |
|---|---|---|---|
forms | ✅ | ⚠️ | V3/V1-legacy — ок. V4-формы: not_deployable=true выставляется, но Orchestrator его не проверяет → 4xx при деплое |
workflows | ✅ | ⚠️ | Полный деплой с actions через /automation/v4/flows. Если referenced объект (список, форма) не существует на таргете — resolveURN вернёт null, workflow создастся с битыми ссылками без ошибки |
hubspot_lists | ✅ | ⚠️ | Dynamic/Snapshot — ok. Manual lists: filterBranch не поддерживается → 400. ⚠️ Lists API v1 sunset 30 апреля 2026 — нужна миграция на v3 |
campaigns | ✅ | ⚠️ | Кампания создаётся, но ассоциации с ассетами (письма, страницы) — отдельный API, не реализованы |
ctas | ✅ | ⚠️ | Legacy V1 CTA deprecated. Новые Button CTA (V3) поддержаны. Роутинг по ctaType |
sequences | ✅ | 🔴 | ReadOnlyHandler — HubSpot не поддерживает запись sequences через public API |
CMS контент
| Тип | Экстракт | Деплой | Подводные камни |
|---|---|---|---|
email_templates | ✅ | ⚠️ | template_path должен существовать на таргете. Если нет — 400 или пустой шаблон без ошибки |
landing_pages | ✅ | ⚠️ | Аналогично: зависимость от шаблонов и модулей. Переносить без предварительного деплоя тем через HubSpot CLI бессмысленно |
site_pages | ✅ | ⚠️ | Аналогично landing_pages |
blog_posts | ✅ | ⚠️ | Требует существующего blog на таргете с тем же slug |
Служебные
| Тип | Экстракт | Деплой | Подводные камни |
|---|---|---|---|
quote_templates | ✅ | ⚠️ | Требует Sales Hub. На порталах без плана — 403 |
hubspot_owners | ✅ | 🔴 | Read-only. Используются только для reference resolution при экстракте. Owners создаются только добавлением пользователя |
2. Что можно добавить: HubSpot API это поддерживает
Высокий приоритет
| Тип | API HubSpot | Сложность | Примечание |
|---|---|---|---|
| Custom behavioral events (схемы) | /events/v3/event-definitions | Средняя | GET+POST+PATCH. С 2025 — доступно на Pro (раньше только Enterprise). Важно для переноса аналитики |
| Tickets pipelines | /crm/v3/pipelines/tickets | Низкая | Аналогично deal pipelines — скорее всего покрывается текущим PipelinesHandler, но нет отдельного subtype |
| SLA configurations | Service Hub API | Высокая | GET+POST+PATCH. Enterprise-only. С 2025 — active hours/timezone per rule |
| Property validation rules | /crm/v3/property-validations | Низкая | Новый endpoint 2025. Правила валидации значений свойств |
Средний приоритет
| Тип | API HubSpot | Примечание |
|---|---|---|
| CMS Templates | /content/api/v2/templates | GET+POST+PATCH. Полноценный read/write. Частично решает проблему зависимости CMS от шаблонов |
| CMS Modules | Design Manager API | GET+POST+PATCH. React-модули поддержаны с 2025 |
| Association labels (custom) | Associations API v3 | Custom association labels — новая фича 2025 |
| Custom workflow action definitions | Developer platform API | Определения кастомных action-блоков для workflow |
| Scoring properties (формулы) | Часть CRM schemas | Формулы скоринга могут теряться при обычном экстракте свойств |
Низкий приоритет
| Тип | API HubSpot | Примечание |
|---|---|---|
| Products catalog | /crm/v3/objects/products | Граница между данными и метаданными. Скорее для data backup |
| Tax rates | Commerce Hub API (новый 2025) | Актуально если используют Commerce Hub |
| Subscription types | /communication-preferences/v3/definitions | Read-only, но полезно для сравнения |
| Webhooks subscriptions | /webhooks/v3 | Конфиги вебхуков — переносимы |
3. Что не покрыть никогда: нет публичного API
| Тип | Статус |
|---|---|
| Reporting dashboards / custom reports | ❌ Нет публичного API |
| Playbooks | ❌ Нет публичного API |
| Approval workflows (Sales Hub) | ❌ Нет публичного API |
| Chat flows / Bot flows (Conversations) | ❌ Ограниченный API, запись недоступна |
| Meeting scheduler settings | ❌ Нет публичного API |
| Sequences | ❌ Нет write API (только read) |
4. Срочные проблемы в текущей реализации
🔴 Баг: not_deployable не проверяется
Файлы: Extractor.js:471-475, DeploymentOrchestrator.js:175-177
V4-формы помечаются additional_details.not_deployable = true при экстракте. Поле доходит до hydrated item в ChangesetHydrator (строка 258), но DeploymentOrchestrator фильтрует только по skipDeployment. Попытка задеплоить V4-форму упадёт с 4xx.
Фикс:
// DeploymentOrchestrator.js — перед scope validation
const notDeployableItems = hydratedItems.filter(i => i.additional_details?.not_deployable);
const deployableItems = hydratedItems.filter(i => !i.additional_details?.not_deployable);
// notDeployableItems → blockedResults с reason = i.additional_details.not_deployable_reason
🔴 Срочно: Lists API v1 sunset 30 апреля 2026
HubSpot окончательно отключает оставшиеся 3 endpoint Lists API v1 30 апреля 2026. Нужно проверить, на какой версии работает ListHandler и hubspot_lists экстракт.
⚠️ Workflows: тихие битые ссылки
MappingService.resolveURN() при отсутствии маппинга может вернуть null или исходный URN-string вместо реального HubSpot ID. HubSpot примет такой workflow без ошибки валидации — но enrollment triggers и actions будут работать некорректно или не работать вообще. Нужен pre-flight check перед деплоем workflow.
⚠️ CMS: деплой без шаблонов бессмысленен
Landing pages, site pages, email templates зависят от шаблонов (template_path/templateId), которые живут в Design Manager и не переносятся этим инструментом. В assisted deploy нужно предупреждение если в changeset есть CMS-типы и таргет — другой портал.
5. Предупреждения для assisted deploy UI
| Тип | Текст предупреждения |
|---|---|
forms + V4 | "V4 forms cannot be deployed via API. Deploy manually in HubSpot." |
workflows | "Workflow triggers and actions referencing lists, forms or other objects require those to exist on the target portal first." |
landing_pages / site_pages / email_templates | "CMS templates must exist on the target portal. Deploy templates via HubSpot CLI before proceeding." |
sequences | "Sequences are read-only and cannot be deployed via API." |
hubspot_owners | "Owners cannot be created via API. Add users manually in HubSpot." |
quote_templates | "Requires Sales Hub subscription on the target portal." |
campaigns | "Campaign asset associations (emails, pages) will not be migrated — link them manually after deploy." |
hubspot_lists (manual) | "Manual lists cannot have filter rules deployed. List will be created empty." |
6. Дорожная карта по покрытию
Сейчас (17 типов в репо)
├── Баги: not_deployable, lists v1 sunset
├── Быстрые wins: custom behavioral events, property validation rules, association labels
├── Средние: CMS Templates + Modules (частично решает CMS-проблему)
└── Долгосрочно: SLA configs, custom workflow actions, tickets pipelines subtype