PD Документация ← На главную

Командная строка: сценарии и шаблоны как код

@pushdata/cli держит сценарии и шаблоны приложения в папке — выгрузите их из дашборда в файлы, посмотрите в merge request, загрузите в другое приложение (staging, production) или обратно после правки. Тот же инструмент отправляет сообщение, импортирует контакты из CSV и сообщает событие, так что CI-задаче или терминалу не нужен SDK.

Пакет публикуется. Пока @pushdata/cli не в npm, берите его из integrations/cli в репозитории PushData: node integrations/cli/bin/pushdata.mjs … (Node 20+, без зависимостей).
bash
npm install -g @pushdata/cli
pushdata profiles add prod --key pd_YOUR_SECRET_KEY        # ~/.config/pushdata/config.json, права 600
pushdata workflows pull ./pushdata                          # → ./pushdata/workflows/<trigger>.json
pushdata templates pull ./pushdata                         # → ./pushdata/templates/<name>.json
pushdata workflows push ./pushdata                         # upsert по идентификатору триггера

Нужен секретный ключ (pd_…); публичный pk_ отклоняется до любого запроса. Ключ берётся из --key, PUSHDATA_API_KEY или профиля (--profile, PUSHDATA_PROFILE, иначе первый добавленный); адрес — из --base, PUSHDATA_BASE_URL или профиля (https://api.pushdata.ru). --json печатает машинно-читаемый вывод.

Переносимый формат

Файл называет вещи именами, а не id, поэтому импортируется в любое приложение: шаблон — по имени, канал — по типу и имени (без имени — активный канал приложения этого типа), сегмент — по имени. Файл сценария несёт шаблоны, которые используют его шаги SEND, — один файл и есть весь сценарий.

json
{
  "kind": "workflow",
  "version": 1,
  "name": "Брошенная корзина",
  "trigger_identifier": "cart_abandoned",
  "status": "ACTIVE",
  "steps": [
    { "node_id": "wait", "type": "DELAY", "order": 0, "config": { "delayMs": 3600000 } },
    { "node_id": "mail", "type": "SEND", "order": 1, "config": { "channelType": "EMAIL", "channel": { "type": "EMAIL", "name": "Маркетинговый SMTP" }, "template": "Напоминание о корзине" } }
  ],
  "templates": [
    { "kind": "template", "version": 1, "name": "Напоминание о корзине", "channel_type": "email", "channel": { "type": "EMAIL", "name": "Маркетинговый SMTP" }, "subject": "Вы оставили {{ count }} товаров", "body": "…", "html_body": null, "translations": null }
  ]
}

Триггер по входу в сегмент записывается как segment-name:<имя сегмента> и разрешается при импорте (сегмент должен существовать в целевом приложении). Импорт — upsert: сценарий по идентификатору триггера, шаблон по имени; status применяется как задан (DRAFT при создании без него, без изменений при обновлении).

То же через API: GET /api/v1/workflows (список), GET /api/v1/workflows/{id}/export, POST /api/v1/workflows/import (201 создано / 200 обновлено; в ответе — загруженные шаблоны), GET /api/v1/templates/{id}/export, POST /api/v1/templates/import.

Команды

КомандаЧто делает
profiles add <name> --key pd_… [--base <url>]запоминает ключ под именем; первый становится профилем по умолчанию
profiles list / profiles remove <name>
workflows list / templates listсценарии приложения (id, статус, триггер, имя) / шаблоны
workflows pull [dir] / templates pull [dir]все сценарии / шаблоны в <dir>/workflows/ / <dir>/templates/ (по умолчанию ./pushdata)
workflows push [dir|file] / templates push [dir|file]импорт файлов папки (или одного файла); печатает created / updated по каждому
send --channel <type> --to <user_id[,…]> [--title] [--body] [--template <id>] [--var k=v]… [--transactional] [--data-file file.json]одна отправка; --data-file — тело запроса как в Уведомлениях, флаги его переопределяют
contacts import <file.csv>upsert по контакту на строку: external_id (обязателен), email, phone, name, locale, timezone, telegram_chat_id, max_user_id, vk_user_id; остальные колонки уходят в metadata (числа и булевы типизируются)
events track --user <user_id> --event <name> [--props '{…}']пользовательское событие человека (запускает сценарий, чей триггер — имя события)
whoamiадрес и число сценариев приложения ключа

Окружения: держите отдельное приложение на окружение (dev / staging / prod) и по профилю на каждое — pushdata --profile staging workflows push ./pushdata, затем --profile prod — или песочницу одного приложения на время проверки. Код выхода 1 при любой ошибке, так что шаг CI остановится на отклонённом импорте.