# Canva Creator

> Берёт согласованный контент-бриф и выполняет кампанию от начала до конца: строит календарь публикаций, генерирует макеты для постов в соцсетях через ~~дизайн (VistaCreate, Supa, Поликрафт), пишет тексты подписей и писем, ставит публикации в очередь через ~~crm. Макеты делаются только для постов в соцсетях (Telegram, VK, Дзен, Одноклассники) — письма пишутся обычным текстом и выдаются владельцу для отправки из своего сервиса рассылки. Каждый шаг требует явного согласия владельца. Используй, когда владелец говорит «сделай креатив», «сгенерируй посты», «сделай макеты», «преврати это в кампанию» или передаёт согласованный бриф на исполнение. Триггеры: "сделай креатив", "сгенерируй посты", "сделай макеты", "макет для акции", "собери кампанию".

- Skill: `ilyautov/canva-creator` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add ilyautov/canva-creator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ilyautov/canva-creator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ilyautov (https://skillmd.com/u/ilyautov)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ilyautov/canva-creator

---


<!-- Производное от Anthropic knowledge-work-plugins / small-business (Apache-2.0, (c) Anthropic). Локализовано под РФ, файл изменён. См. /NOTICE и /LICENSE. -->

# Генератор макетов (canva-creator)

Согласованный бриф — это ещё не кампания: посты сами себя не нарисуют и в очередь не встанут. Скилл доводит бриф до готовых креативов под VK, Telegram, Дзен и Одноклассники, пишет подписи и тексты писем и ставит публикации в очередь — пошагово, с твоим согласием на каждом гейте, без сюрпризов с лимитами и пустыми заглушками.

> **Сервис дизайна:** Canva заблокирована в РФ. Основной путь — `~~дизайн`:
> **VistaCreate** (быв. Crello), **Supa**, **Поликрафт**, Сберографика. Имена
> Canva-конкретные команды в этом файле — обобщённые шаблоны API `~~дизайна`.
> Если у владельца есть доступ к Canva (VPN/зарубежный аккаунт) — те же шаги
> применимы к Canva Connect API напрямую.

## Зона действия

Скилл ведёт кампанию через пять последовательных стадий, каждая — за гейтом согласования владельца:

```
бриф → календарь → инвентаризация ассетов → макеты (~~дизайн) → тексты → постановка в очередь (~~crm)
```

| Путь | Каналы | Что производит скилл |
|------|--------|----------------------|
| Макет (соцсети) | Telegram, VK, Яндекс Дзен, Одноклассники, RuTube | Макет `~~дизайна` + подпись + запланированная публикация в `~~crm` |
| Только текст | Email-рассылка (новостная, маркетинговая, цепочка) | Тема + прехедер + тело письма, выдаётся владельцу инлайн для отправки |

> Если клиент явно работает на зарубежную аудиторию, к списку каналов можно добавить Instagram/Facebook/X — но по умолчанию в РФ это не основные площадки (Meta признана экстремистской и запрещена в РФ). ⚠️

**`~~дизайн` не используется для писем ни при каких обстоятельствах** — никаких
шаблонов, автозаполнения, копий дизайнов, загрузки ассетов, экспортов. Владелец
явно вывел письма из дизайн-пути, потому что автозаполнение email-шаблонов даёт
заглушки-картинки, когда слотов под изображения больше, чем фото, а превью
вариантов не рендерятся в чате. Если владелец просит email-макет — см.
`reference/gotchas.md`, текст для перенаправления.

---

## Предполётная проверка

Перед Стадией 1 подтвердите:

1. **Бриф.** Владелец сослался на согласованный бриф или вставил его. Если нет:
   «Мне нужен контент-бриф, прежде чем собирать кампанию. У вас есть бриф из
   скилла content-strategy, или составим сейчас?»

2. **Тариф `~~дизайна`.** Бесплатный/базовый тариф требует ручного выбора
   шаблона из библиотеки владельца (без API-автозаполнения). Платный/командный
   тариф (где есть API) может автозаполнять из брендовых шаблонов.

3. **Доступ к `~~crm`.** Постановка постов в очередь требует тарифа `~~crm`
   с модулем планирования публикаций (например, CRM-маркетинг в Битрикс24).
   Если модуля нет → пропустите Стадию 5 и выгрузите CSV
   (см. [reference/hubspot-staging.md](reference/hubspot-staging.md)).

4. **Брендовые ассеты.** Подтвердите путь к фото товаров на диске или что
   бренд-кит загружен в `~~дизайн`.

5. **Бюджет генерации.** Оцените объём макетов кампании и покажите его до
   Стадии 1. По умолчанию — 3 кандидата на каждую строку под макет; каждый
   макет стоит ~5 вызовов API (автозаполнение + экспорт + опрос статуса).

   ```
   Бюджет генерации для этой кампании:
     Строк под макет (соцсети): 8
     Кандидатов на строку:      3   (по умолчанию — скажите «один кандидат» для 1)
     Всего макетов:             24
     Вызовов API (примерно):    ~120  (автозаполнение + экспорт + опрос)

   Лимит ~~дизайна: см. тариф. Генерация займёт ~2–3 минуты, в пределах
   лимитов вашего тарифа. Продолжаем?
   ```

   Если расчётное число макетов превышает 30, сразу рекомендуйте режим одного
   кандидата — большие кампании быстро упираются в лимит. Владелец может
   переопределить значение на 1, 2 или 3 кандидата на строку до старта
   Стадии 1. Зафиксируйте выбранное значение на всю сессию.

---

## Рабочий процесс

### Стадия 1 — Календарь публикаций

Возьмите из брифа: контент-темы, каналы, частоту, жёсткие даты (запуски, акции, праздники).

Постройте таблицу-календарь со столбцом `Путь`, который направляет каждую строку либо в `~~дизайн`, либо в текстовый набор:

| Дата | Канал | Путь | Тема | Тип ассета | Угол подписи/темы |
|------|-------|------|------|------------|-------------------|
| 02.06 | Telegram | Макет (соцсети) | Запуск льняной линии | Квадратный пост | «наконец-то платье…» |
| 05.06 | Email | Только текст | Запуск льняной линии | Тело письма | «Лён, который дышит» |

Помечайте каждую строку email-канала как `Только текст` до показа. Ограничьте 30 днями, если бриф не указывает иное. Заранее отметьте конфликты расписания (два поста в один день про один товар).

**Контрольная точка 1.** Покажите календарь. Спросите: «Совпадает с планом?
Какие даты сдвинуть, каналы добавить, темы поменять?» Дорабатывайте до
согласования, затем вслух повторите разбивку — «N строк идёт через `~~дизайн`,
M строк через текстовый набор» — прежде чем двигаться дальше. Поймать
неверную категоризацию здесь — бесплатно; после генерации макетов — уже нет.

---

### Стадия 2 — Инвентаризация ассетов (только строки под макет)

Email-строки пропускают эту стадию целиком. Для каждой строки `Макет (соцсети)` соберите манифест: что нужно шаблону и что уже есть.

1. **Перечислите каждый слот под изображение по имени.** Квадратные посты
   обычно имеют 1–2 слота; карусели и товарные сетки — 5+. Перечисляйте
   поимённо (`Header_Image`, `Product1_Image`, `Product2_Image`, …), никогда
   не сворачивайте в «фото товаров».
   - С API брендовых шаблонов: читайте имена полей из метаданных шаблона.
   - Без API (базовый тариф): считайте каждый отдельный прямоугольник под изображение в шаблоне.

2. **Инвентаризируйте доступные ассеты.** Тексты из брифа (названия товаров,
   тексты акций, слоганы, цены в ₽), фото товаров, уже загруженные в `~~дизайн`,
   или на диске владельца, цвета и шрифты бренд-кита.

3. **Постройте таблицу пробелов по слотам.** Одна строка на слот на макет — не на макет.

   | Дата | Имя слота | Тип слота | Доступный ассет | Статус |
   |------|-----------|-----------|-----------------|--------|
   | 02.06 | Hero_Image | изображение | bloom_summer.jpg → asset_id ожидается | загрузить |
   | 02.06 | Headline | текст | «Лён, наконец-то» | готово |
   | 09.06 | Product1_Image | изображение | — | **ОТСУТСТВУЕТ** |

4. **Разрешите несоответствия слот/ассет с владельцем.** Если слотов под
   изображения больше, чем фото в брифе, остановитесь и спросите:

   ```
   В шаблоне «Летняя карусель» 5 слотов под изображения. Бриф дал мне 1 фото
   (bloom_summer.jpg). Чем заполнить остальные 4?

     1. Повторить то же фото во всех 5 слотах
     2. Вы пришлёте ещё 4 фото (пути к файлам)
     3. Выбрать шаблон попроще с меньшим числом слотов
   ```

   Никаких вызовов генерации, пока владелец не выберет. Генерация с пустыми слотами даёт макеты с дефолтными заглушками-пейзажами `~~дизайна`.

5. **Загрузите недостающие фото и зафиксируйте подтверждённые ID ассетов.**
   Загрузите файл, дождитесь статуса `success` задачи загрузки. Запишите
   `asset.id` из ответа — только это значение работает в поле изображения при
   автозаполнении. Пустая строка, URL, путь к файлу или устаревший ID молча
   отрендерят дефолтную картинку-пейзаж вместо фото.

6. **Подтвердите манифест.** Покажите владельцу заполненную таблицу по слотам:
   каждый слот разрешён, каждый `asset.id` изображения подтверждён. Это
   последняя остановка перед вызовами API `~~дизайна`.

---

### Стадия 3 — Генерация макетов

Перед любым вызовом API `~~дизайна` перечитайте календарь и отбросьте каждую строку, чей `Путь` не `Макет (соцсети)`. Email-строки эту стадию не проходят.

Генерируйте макеты **по одной строке календаря за раз**, по 3 кандидата на строку (или по значению, выбранному на предполёте). Каждая строка идёт по одному циклу: сгенерировать кандидатов → проверить → экспортировать → визуально проверить → перегенерировать сбойные → показать → дождаться выбора владельца → следующая строка. Пауза 30 секунд между строками. Это держит всплеск на уровне 3 генераций + 3 экспортов за ~30 с — с запасом под лимит частоты запросов `~~дизайна`. Не распараллеливайте несколько строк; одна строка за раз — это защита, которая не даёт владельцу упереться в квоту посреди кампании.

**Частота опроса.** Опрашивайте статус задачи каждые 3–5 секунд, не чаще. Более частый опрос жжёт квоту, не ускоряя завершение.

**URL превью — встраивать безопасно только один тип.** Ответы автозаполнения
возвращают временные превью, которые истекают за минуты; встраивание их как
markdown-картинок даёт битые заглушки «Показать изображение». Постоянные URL
экспорта не истекают. Нативные карусели Cowork рендерят результат
автозаполнения напрямую через аутентифицированную сессию коннектора — дайте им
отрендериться самим, не встраивайте повторно.

#### Цикл по строке

1. **Определите шаблон.** (Один раз за сессию — тот же шаблон по всем строкам,
   если календарь не смешивает типы ассетов.)
   - С API брендовых шаблонов: список шаблонов, отфильтрованный по типу ассета.
   - Без API (базовый тариф): найдите дизайны по имени шаблона, покажите топ-3 владельцу, подтвердите один до генерации.

2. **Сгенерируйте кандидатов строки параллельно.** Запустите 3 кандидата строки одновременно (или N с предполёта).
   - С API автозаполнения: запрос автозаполнения на каждого кандидата с ID шаблона и значениями полей. Опрашивайте все задачи параллельно.
   - Без API: создайте копии дизайна. Опишите правки текста и изображений, которые владелец применяет в `~~дизайне`; соберите обратно ID дизайнов.

3. **Проверьте статус задачи.** Для каждого кандидата подтвердите, что задача
   вернула `status == "success"` и присутствует ID готового дизайна. Ошибки —
   по каждому дизайну:
   - `JOB_FAILED` → прочтите сообщение об ошибке, поправьте значения полей или ID ассетов, повторите один раз.
   - `RATE_LIMIT_EXCEEDED` (первый раз за сессию) → подождите 60 с, повторите этого одного кандидата один раз. Это покрывает временные всплески.
   - `RATE_LIMIT_EXCEEDED` (второй раз за сессию) **или** любая ошибка `quota_exceeded` / дневного лимита → остановите генерацию немедленно.
     Не повторяйте. Покажите прогресс и спросите:

     ```
     ~~дизайн ограничивает кампанию по частоте запросов. Статус:
       ✓ Сгенерировано:  посты 1–4 (12 макетов)
       ⏸ Осталось:        посты 5–8 (12 макетов не сгенерированы)

     Как продолжить?
       1. Перейти на 1 кандидата на оставшуюся строку (4 макета) — закончим сейчас
       2. Пауза — продолжим через 60 минут, когда квота восстановится
       3. Остановить генерацию — работаем с тем, что есть, переходим к текстам
     ```

     Дождитесь выбора владельца. Не зацикливайтесь на повторах.

4. **Экспортируйте каждого успешного кандидата в постоянный PNG.** Запустите экспорты строки параллельно.
   - Экспорт в формат `png`, опрос задачи до успеха, захват постоянного URL.
   - Постоянные URL — это то, что встраивается в превью и прикрепляется к публикации в `~~crm` позже. Превью из ответа автозаполнения ниже по конвейеру не используется.

5. **Визуально проверьте каждый экспорт.** Посмотрите на изображение и отклоните любое из этих — все указывают на незаполненный слот или неверный ассет:
   - Обобщённый пейзаж с облаками и зелёными холмами (дефолтная заглушка)
   - Сплошные серые прямоугольники там, где должно быть фото
   - Текст-рыба или дефолтный текст шаблона
   - Сюжет не соответствует брифу (не тот товар, не тот бренд)

   Если кандидат не прошёл проверку: перепроверьте манифест по сбойному слоту, поправьте `asset.id`, перегенерируйте только этого кандидата, переэкспортируйте, перепроверьте.

6. **Повтор по одному кандидату при частичном сбое.** Если 1 из N кандидатов строки сбойнул на Шаге 3 или 5, перегенерируйте только его — не переделывайте всю строку и не показывайте частично битую карусель. Если вторая попытка тоже сбоит:

   ```
   Третий кандидат для поста 09.06 продолжает сбоить — ~~дизайн вернул
   [ошибка / отрендерил заглушку]. Как продолжить?

     1. Пропустить — показать остальные 2 и идти дальше
     2. Сменить на шаблон попроще для этого кандидата
     3. Попробовать ещё раз с другим фото
   ```

7. **Покажите кандидатов строки.** Дайте нативной карусели Cowork отрендерить результат автозаполнения. Под ней добавьте текст-подсказку:

   ```
   Кандидаты на 09.06 готовы — пролистайте карусель выше.
   Какой использовать для поста 09.06?
   ```

   Если карусель не рендерится или одна позиция битая, встройте постоянные PNG-URL экспорта из Шага 4. Финальный запасной вариант: ссылка на URL редактирования дизайна. Никогда не встраивайте повторно временные URL превью.

8. **Пауза 30 секунд, затем следующая строка.**

**Контрольная точка 2.** Готово, когда владелец выбрал один макет на каждую строку календаря. Если просит перегенерацию — перегенерируйте только этого кандидата.

---

### Стадия 4 — Написание текстов

Для каждой строки календаря напишите текст. Соцсети получают подпись; email-строки — полное письмо.

**Подписи для соцсетей** — Telegram, VK, Дзен, Одноклассники:

- Длина: под канал (Telegram-пост — лонгрид допустим, но держите хук в начале; VK ≤ ~1000 знаков рекомендуется для ленты; короткие посты ОК).
- Структура: хук → одна выгода товара → призыв к действию → 3–5 хештегов (не 30).
- Голос: под тон-маркеры брифа. Если бриф говорит «по-дружески, неформально» — не пишите корпоративный текст.
- Без воды. Без «Отличные новости!» и «Спешим сообщить». Открывайте с ценности.

**Письма** — Claude пишет всё письмо целиком; без `~~дизайна`:

- Тема: ≤ 50 знаков, конкретно, без кликбейта. «Места на весну заканчиваются» лучше, чем «Не упустите!».
- Прехедер: ≤ 90 знаков, дополняет тему, не повторяет её.
- Тело: обычная проза, 100–250 слов. Открывающая строка, ради которой дочитают → 1–2 абзаца по сути → один ясный призыв к действию → подпись.
- Голос: те же тон-маркеры, что в соцсетях. Владельцы хотят, чтобы письма звучали как они, а не как шаблонная новостная рассылка.
- Без отсылок к картинкам. Не пишите «см. изображение выше». Если владельцу нужны визуалы — он добавит их в своём сервисе рассылки.
- Один призыв на письмо. Выберите главное действие и ведите к нему.

Покажите подписи инлайн под каждой строкой соцсетей. Покажите письма целиком инлайн под каждой email-строкой:

```
Тема: <тема письма>
Прехедер: <текст прехедера>

<тело письма>
```

Разобранные примеры — [reference/examples/boutique-brief-campaign.md](reference/examples/boutique-brief-campaign.md).

**Контрольная точка 3.** «Какие подписи или письма переписать? Укажите дату и что поменять.» Дорабатывайте до согласования.

> **Маркировка рекламы:** подписи и креативы для **платного** размещения
> (Яндекс Директ, VK Реклама, Telegram Ads, посевы в чужих каналах за деньги)
> требуют маркировки — токен ОРД и передача данных в ЕРИР (обязательно в РФ
> с 2022 г.). Органические посты в собственных каналах владельца маркировки
> не требуют. Уточните статус размещения у владельца. ⚠️

---

### Стадия 5 — Постановка в очередь `~~crm` + передача писем

Поставьте посты для соцсетей в очередь через `~~crm` (Битрикс24, amoCRM). Письма не ставятся в очередь — они выдаются владельцу инлайн для копирования в его сервис рассылки. Справку по полям API см. в [reference/hubspot-staging.md](reference/hubspot-staging.md).

1. **Создайте кампанию.** Заведите кампанию в `~~crm` с названием и датами начала/окончания из календаря.

2. **Поставьте в очередь каждый пост для соцсетей.** По одной публикации на строку `Макет (соцсети)`:
   - канал: сопоставьте канал из календаря с подключённым аккаунтом в `~~crm`
   - время публикации: дата-время в будущем — проверьте, что оно ещё не прошло, перед постановкой
   - тело: согласованная подпись
   - вложение: постоянный PNG-URL экспорта из Стадии 3
   - статус: `ЗАПЛАНИРОВАНО` (никогда не `ОПУБЛИКОВАНО`)

3. **Подтвердите очередь.** Запросите список запланированных публикаций, покажите его, дайте прямую ссылку на кампанию в `~~crm`.

4. **Выдайте письма для передачи.** Для каждой email-строки покажите согласованную тему + прехедер + тело инлайн, сгруппировав по дате отправки. Владелец копирует их в свой сервис рассылки (`~~почта`, Unisender, Sendsay, DashaMail).

**Финальная контрольная точка.**

```
Ваши посты для соцсетей поставлены в очередь в ~~crm: [ссылка]
Они выйдут по расписанию — любой пост можно отменить или отредактировать в ~~crm.

Письма готовы ниже — скопируйте каждое в свой сервис рассылки, когда будете
готовы отправить:

  05.06 — «Места на весну заканчиваются»
  15.07 — «Окна летнего обслуживания заполняются»

Что поправить, прежде чем закончим?
```

---

## Гейты согласования

- **Никаких вызовов `~~дизайна` для email-строк.** Перепроверяйте столбец `Путь` перед каждым вызовом API.
- **Никаких публикаций.** Каждый пост в `~~crm` ставится как `ЗАПЛАНИРОВАНО`; владелец контролирует выход вживую.
- **Всегда показывайте бюджет генерации на предполёте.** Владелец видит общее число макетов и согласовывает до старта Стадии 1.
- **Одна строка за раз в Стадии 3.** Кандидаты внутри строки запускаются параллельно, но строки последовательны с паузой 30 с — это защита от исчерпания квоты.
- **На второй ошибке квоты — пауза и вопрос.** Никогда не зацикливайтесь на повторах.
- **Всегда экспортируйте в постоянный PNG перед показом.** Успех задачи не значит, что макет отрендерился корректно.
- **Никогда не встраивайте повторно временные превью-URL.** Они истекают.
- **Никогда не перегенерируйте всю строку, когда сбоит один кандидат.** Только повтор по кандидату.
- **Никогда не выбирайте шаблон автоматически на базовом тарифе.** Всегда подтверждайте.
- **Никогда не пропускайте инвентаризацию по слотам.** Многослотовые шаблоны рендерят заглушки-пейзажи, когда любой слот пуст.
- **Никогда не пропускайте Контрольную точку 1.** Генерация до согласования календаря — крупнейший источник напрасной работы в этом скилле.
- **Маркировка рекламы для платных размещений.** Не ставьте платный креатив в очередь без подтверждённого статуса маркировки (ОРД/ЕРИР). ⚠️

---

## Справочные материалы

- [reference/canva-api.md](reference/canva-api.md) — API `~~дизайна` (VistaCreate/Supa): эндпоинты, загрузка ассетов, форматы экспорта
- [reference/hubspot-staging.md](reference/hubspot-staging.md) — постановка постов в очередь через `~~crm` и CSV-запасной вариант для тарифов без планировщика
- [reference/gotchas.md](reference/gotchas.md) — хорошие/плохие паттерны для каждого режима сбоя, который скилл встречал в работе
- [reference/examples/boutique-brief-campaign.md](reference/examples/boutique-brief-campaign.md) — полные разобранные примеры (одно-слотовый соцпост, многослотовый шаблон)

