События продукта

Чтобы воронка шла дальше визита — до регистрации, кредитов и оплат, — продукт присылает шаги пользователя в Webvane. CRM не нужна: продукт сам источник правды. Протокол — Journey Protocol v1.

Как это работает

  1. Человек приходит в продукт по ссылке с меткой объявления (или из поиска). Счётчик Webvane запоминает его в cookie wv_vid на домене продукта.
  2. При регистрации бэкенд продукта читает wv_vid и кладёт в событие signup вместе с номером аккаунта.
  3. Webvane связывает аккаунт с визитами и меткой — канал, кампания, объявление, креатив известны.
  4. Дальше продукт шлёт шаги только с номером аккаунта — асинхронно, через свою очередь.
  5. Оплата пакета — payment, возврат — refund: отсюда выручка, LTV, CAC, ROMI.

Ключ и адрес

Маркетинг → Подключения, блок «Продукт: события пути пользователя» внизу страницы (туда же ведёт кнопка «Ключ событий продукта» в ответе мастера на «Подключить продукт»). Кнопки ключа видит только администратор.

  • «Выпустить ключ» — ключ wvj_… показывается один раз, с кнопкой «Копировать»: сохраните его в настройках продукта. После обновления страницы виден только его начало: «Действует ключ wvj_…, выпущен …, последний приём …».
  • «Перевыпустить ключ» — новый ключ, старый перестаёт работать сразу, без подтверждения.
  • «Отозвать» — приём останавливается сразу, без подтверждения: «Ключа нет — продукт не может присылать события.»

Адрес приёма показан в блоке («Адрес приёма: …»), обычно https://ваш-сервер/api/journey/v1/events. Справа — «Что пришло за 30 дней»: таблица типов событий (сколько и когда последнее) за 30 дней; строка над ней — события, аккаунты и аккаунты, связанные с визитами, за всё время.

Формат запроса

POST /api/journey/v1/events
Authorization: Bearer wvj_…
Content-Type: application/json

{ "source": "pflux",
  "events": [ {
    "event_id": "bil-op-81233",
    "type": "credits_spent",
    "ts": "2026-10-17T09:15:02Z",
    "user": { "id": "4512", "vid": "ym:1712345678901234567" },
    "credits": { "amount": -3, "balance_after": 41 },
    "props": { "action": "send" } } ] }

Ответ 202: { "accepted": 1, "duplicates": 0, "rejected": [] }. До 500 событий и 1 МБ за раз. Повтор события с тем же event_id — дубль, а не двойной счёт: пачку можно слать повторно, пока не придёт 202.

События

ТипЧто значит
signupсоздал аккаунт (с user.vid — связь с визитом)
credits_grantedначислены кредиты; credits.lot: welcome — стартовые, request — по запросу, invite — за приглашённого, admin
credits_requestedпопросил ещё кредитов
credits_spentсписание за действие
credits_expired, credits_revokedсгорели, отозваны
invite_sent, invite_acceptedпригласил, приглашённый зарегистрировался
paymentпополнение баланса: money (сумма, валюта), credits.amount, props.payment_id (purchase — то же самое)
refundвозврат денег: money, props.payment_id
loginвход

Свои типы допустимы: строчная латиница, цифры, _ и ., первая — буква, до 64 символов.

Опознание пользователя

У события должен быть хотя бы один ключ: user.id (номер аккаунта), user.vid (cookie wv_vid) или user.email_sha256 (SHA-256 почты в нижнем регистре). Открытые почта и телефоны в props отклоняются. Запасной путь связи с визитом — вызов на странице продукта после входа: wv('identify', '4512') (Счётчик).

Асинхронная отправка

Отправлять событие прямо в запросе пользователя нельзя — Webvane может тормозить. Продукт пишет событие в свою таблицу- очередь в той же транзакции, что и само действие; фоновая задача раз в несколько секунд шлёт пачки. Ошибка сети, 5xx, 429 — повтор через 1, 5, 30 минут, 2 часа, 6 часов; отклонённое (rejected) не повторяется; 401 — ключ отозван.

Flux

Во Flux отправка уже есть — модуль webvane-journey: регистрации (с cookie wv_vid), начисления, списания, запросы, приглашения, оплаты. Включается переменными WEBVANE_JOURNEY_URL и WEBVANE_JOURNEY_KEY.

Ошибки

Ошибка всего запроса — код ответа и {"error": "…"}, пачка не принята, её можно отправить снова после исправления. Ошибка одного события — оно в rejected с причиной, остальные приняты; отклонённое не повторяйте.

Что видитеЧто делать
401 journey key required: Authorization: Bearer wvj_…ключ не передан, отозван или перевыпущен — выпустите ключ и обновите его в продукте
400 invalid JSON, 400 events: array required, 400 empty bodyтело запроса — JSON с массивом events
413 over 500 events, 413 body over 1 MBразбейте пачку на части
rejected: event_id: required, …у каждого события нужен свой event_id (латиница, цифры, . _ : -, до 128)
rejected: type: required, lowercase latin, digits, _ . up to 64тип события — строчными латинскими буквами
rejected: user: id, vid or email_sha256 requiredв событии нет ни одного ключа пользователя
rejected: ts: not older than 90 days and not in the futureвремя события старше 90 дней или больше чем на сутки впереди
rejected: ts: ISO-8601 with zone, e.g. 2026-10-17T09:15:02Zвремя — с часовым поясом, например Z
rejected: money: required for paymentу оплаты и возврата обязательны сумма и валюта
rejected: money: amount and currency (ISO 4217, e.g. RUB) requiredвалюта — три заглавные буквы
rejected: props: plain email or phone is not acceptedуберите открытые почту и телефон из props