Интеграция Яндекс Метрики и n8n: отчёты, цели и алерты по трафику без ручной выгрузки ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, домены, IDs, токены, callback URL, лимиты и production-политики под вашу инфраструктуру.
Проблема: маркетолог вручную выгружает отчёты из Яндекс Метрики, замечает падение целей слишком поздно, а UTM-ошибки всплывают только после рекламного периода. Автоматизация нужна не ради CSV, а ради раннего сигнала.
Решение: интеграция Яндекс Метрики и n8n должна по расписанию запрашивать API отчётов, сравнивать цели и трафик с baseline, находить аномалии по UTM и отправлять компактный alert с ссылкой на срез данных. Такой подход закрывает не демо-сценарий, а реальную production-боль: повторы, нестабильный mapping, API-ошибки, секреты, лимиты и понятный audit trail.
Проблема: почему простая интеграция ломается в production ¶
Автоматизация ценна только тогда, когда она даёт предсказуемый результат при повторе события, изменении полей, временной ошибке API и ручной правке на стороне сервиса. Поэтому здесь важны не только credentials и HTTP Request, но и контракт данных, ключ дедупликации, проверка статуса и понятный журнал.
Для этой страницы основной объект — Yandex Metrica report row. Входной контракт должен явно фиксировать counter_id, date1, date2, goal_id, utm_source, visits, conversions, conversion_rate. Если эти поля приходят нестабильно, workflow начинает угадывать и создаёт дубли, неверные отчёты или записи без владельца.
Надёжная связка через n8n строится вокруг детерминированных проверок: сначала validation и idempotency, затем запрос во внешний API, затем запись результата в CMS/CRM/таблицу/аналитику и alert, если бизнес-действие не завершилось.
Архитектура workflow для n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Schedule trigger | запускает отчёт каждый день или час | timezone и период согласованы |
| Build API request | собирает metrics/dimensions/goal_id | нет ручных CSV-выгрузок |
| Yandex Metrica API | получает строки отчёта | OAuth token и counter_id корректны |
| Analyze baseline | сравнивает visits и goal reaches | учитывает min_visits и пороги |
| Alert marketer | отправляет compact summary | есть ссылка на отчёт и срез UTM |
| Store snapshot | сохраняет историю в Sheets/DB | можно сравнить с прошлым периодом |
Такой workflow удобно сопровождать: mapping, API-запрос, retry, callback и human-readable audit не смешиваются в одной ноде.
Контракт входных данных ¶
{
"counter_id": 12345678,
"date1": "yesterday",
"date2": "yesterday",
"goal_id": "goal12345",
"dimensions": [
"ym:s:UTMSource",
"ym:s:UTMCampaign"
],
"metrics": [
"ym:s:visits",
"ym:s:users",
"ym:s:goal12345reaches"
],
"min_visits": 50,
"alert_channel": "telegram-marketing"
}Payload можно расширять, но нельзя делать обязательные поля “по настроению”. Если источник не передал внешний ID, ключ объекта, получателя или период отчёта, workflow должен остановиться с понятной ошибкой до записи или отправки.
Code Node: нормализация, mapping и guard-условия ¶
const src = $json.body ?? $json;
const counterId = String(src.counter_id ?? '').trim();
if (!/^\d+$/.test(counterId)) throw new Error('counter_id must be numeric');
const goalId = String(src.goal_id ?? '').replace(/^goal/, '');
if (!/^\d+$/.test(goalId)) throw new Error('goal_id must contain digits');
const minVisits = Number(src.min_visits ?? 30);
const date1 = src.date1 ?? 'yesterday';
const date2 = src.date2 ?? 'yesterday';
const metrics = [`ym:s:visits`, `ym:s:users`, `ym:s:goal${goalId}reaches`];
const dimensions = src.dimensions?.length ? src.dimensions : ['ym:s:UTMSource','ym:s:UTMCampaign'];
return [{
json: {
action: 'fetch_yandex_metrica_report',
idempotency_key: `metrica:${counterId}:${goalId}:${date1}:${date2}:${dimensions.join(',')}`,
report_request: { ids: counterId, date1, date2, metrics: metrics.join(','), dimensions: dimensions.join(','), limit: 100, accuracy: 'full' },
thresholds: { min_visits: minVisits, min_conversion_rate: Number(src.min_conversion_rate ?? 0.02) },
alert_channel: src.alert_channel ?? 'telegram-marketing'
}
}];Этот скрипт n8n приводит данные к стабильному контракту, формирует idempotency key и не пропускает опасный payload дальше по цепочке.
Готовый workflow JSON: скачать и импортировать ¶
В архиве страницы есть импортируемый workflow JSON и тестовый payload. После импорта замените credentials, домены, IDs, callback URL, лимиты и правила доступа. Не запускайте сценарий на production-данных, пока не проверены повторы, пустые значения и ошибки API.
{
"name": "Nodbot - Yandex Metrica goals report and anomaly alert",
"nodes": [
{
"name": "Schedule trigger",
"type": "n8n-node",
"purpose": "запускает отчёт каждый день или час"
},
{
"name": "Build API request",
"type": "n8n-node",
"purpose": "собирает metrics/dimensions/goal_id"
},
{
"name": "Yandex Metrica API",
"type": "n8n-node",
"purpose": "получает строки отчёта"
},
{
"name": "Analyze baseline",
"type": "n8n-node",
"purpose": "сравнивает visits и goal reaches"
},
{
"name": "Alert marketer",
"type": "n8n-node",
"purpose": "отправляет compact summary"
},
{
"name": "Store snapshot",
"type": "n8n-node",
"purpose": "сохраняет историю в Sheets/DB"
}
],
"connections": "Schedule trigger → Build API request → Yandex Metrica API → Analyze baseline → Alert marketer → Store snapshot"
}Пошаговая настройка связки ¶
- Получите OAuth-токен с доступом к нужному счётчику Яндекс Метрики и сохраните его в credentials/ENV.
- Зафиксируйте counter_id, goal_id, период и список dimensions, которые реально нужны маркетингу.
- Добавьте baseline: сравнение с предыдущим днём, неделей или медианой за 7 дней.
- Настройте alert только при значимом объёме визитов, чтобы не шуметь из-за малых чисел.
- Сохраняйте ежедневный snapshot в Google Sheets, Postgres или BI-таблицу для ретроспективы.
Что проверить после импорта workflow
Откройте каждую ноду, замените credentials и IDs, включите dry-run там, где доступно, затем выполните сценарий на тестовом объекте. Для внешних API добавьте rate limit, alert и отдельную тестовую сущность.
Тесты перед production ¶
Минимальный smoke test:
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/yandex-metrica-goals-report-n8n" -H "Content-Type: application/json" --data @integration-yandex-metrica-n8n-goals-report-payload.json- запрос за yesterday
- неверный counter_id
- goal_id без данных
- UTM с нулевыми конверсиями
- падение API или 401 OAuth
Отдельно проверьте, что retry n8n не создаёт повторную запись или отправку. Для критичных действий используйте durable storage: Postgres, CRM custom field, CMS meta, audit table или другой слой с уникальным ключом.
Production-риски ¶
- Алерт строится на малом трафике и создаёт шум.
- goal_id перепутан после изменения целей в Метрике.
- OAuth token хранится в публичном JSON.
- Отчёт отправляет сырые строки без вывода, что именно делать.
- Нет snapshot-истории, поэтому невозможно проверить тренд.
Полезные ссылки и смежные материалы ¶
Внутренняя перелинковка помогает перейти от общего integration-гайда к готовым workflow, а внешние ссылки ведут на официальную документацию API и n8n-нод.
Критерии готовности ¶
- Отчёт запускается по расписанию с правильной timezone.
- goal_id и dimensions проверены на реальном counter_id.
- Алерт содержит причину, цифры и ссылку на срез.
- Ошибки OAuth/API уходят в отдельный alert.
- История отчётов сохраняется для сравнения периодов.