Командная строка: сценарии и шаблоны как код
@pushdata/cli держит сценарии и шаблоны приложения в папке — выгрузите их из дашборда в файлы, посмотрите в merge request, загрузите в другое приложение (staging, production) или обратно после правки. Тот же инструмент отправляет сообщение, импортирует контакты из CSV и сообщает событие, так что CI-задаче или терминалу не нужен SDK.
Пакет публикуется. Пока@pushdata/cliне в npm, берите его изintegrations/cliв репозитории PushData:node integrations/cli/bin/pushdata.mjs …(Node 20+, без зависимостей).
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, — один файл и есть весь сценарий.
{
"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 остановится на отклонённом импорте.