Интеграция Notion и n8n: контент-пайплайн, статусы, дедлайны и защита от дублей ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, URL API, поля CRM/БД и лимиты под вашу инфраструктуру.
Проблема: Notion удобен для редакционного плана, но без правил статусов и idempotency страницы дублируются, задачи теряются, а черновики случайно уходят в публикацию.
Решение: строить интеграцию Notion и n8n как state machine: читать только карточки с нужным статусом, фиксировать external_id, валидировать обязательные поля, переводить страницу в следующий статус и сохранять ссылку на результат.
Проблема: почему база Notion без workflow-правил превращается в хаос ¶
Типичная ошибка — использовать Notion только как красивую таблицу. Редактор меняет статус, интегратор вручную копирует текст, маркетолог просит срочно опубликовать, а n8n не понимает, какую страницу уже обработал. В результате один и тот же материал может попасть в WordPress дважды или потерять метки кампании.
Надёжный сценарий использует Notion database как источник правды: у каждой карточки есть статус, владелец, дедлайн, canonical slug, external_id и поле для ошибки. Тогда автоматизация контента становится предсказуемой и удобной для команды.
Архитектура workflow Notion + n8n для контент-пайплайна ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Notion Trigger / Poll | читает страницы со статусом Ready | фильтр по database_id и статусу |
| Validate properties | проверяет title, slug, owner, deadline | нет пустых обязательных полей |
| Build publishing payload | готовит Markdown/HTML и metadata | canonical, tags, excerpt, cover |
| Idempotency check | сравнивает external_id или slug | нет повторной публикации |
| Publish / create task | создаёт черновик или задачу | не публикует без review |
| Update Notion status | пишет результат и ссылку | Done, Error, Needs review |
Для редакционного процесса лучше создавать draft или задачу, а не сразу публиковать материал. Человек проверяет финальный вид, а n8n сохраняет трассировку.
Контракт страницы Notion ¶
{
"page_id": "notion-page-10492",
"database_id": "content_calendar",
"title": "Как настроить n8n с Notion",
"slug": "n8n-notion-content-pipeline",
"status": "Ready for automation",
"owner": "editor@example.ru",
"deadline": "2026-06-05",
"tags": [
"n8n",
"Notion",
"content ops"
],
"external_id": "content:n8n-notion-content-pipeline"
}
Ключевое поле — external_id или slug. Именно оно защищает от повторного создания черновика, если карточку случайно вернули в статус Ready.
Code Node: проверка статуса, дедлайна и external_id ¶
const src = $json.body ?? $json;
const title = String(src.title ?? src.properties?.Title?.title?.[0]?.plain_text ?? '').trim();
const slug = String(src.slug ?? src.properties?.Slug?.rich_text?.[0]?.plain_text ?? '').trim().toLowerCase();
const status = String(src.status ?? src.properties?.Status?.select?.name ?? '').trim();
const deadline = String(src.deadline ?? src.properties?.Deadline?.date?.start ?? '').trim();
if (!title || !slug) throw new Error('Notion page requires title and slug');
if (!/^[-a-z0-9]+$/.test(slug)) throw new Error(`Invalid slug: ${slug}`);
if (!['Ready for automation','Ready to publish'].includes(status)) {
return [{ json: { action: 'skip', reason: 'wrong_status', status, page_id: src.page_id ?? src.id } }];
}
const externalId = String(src.external_id ?? `notion:${slug}`);
return [{ json: {
action: 'create_draft', page_id: src.page_id ?? src.id, external_id: externalId,
title, slug, deadline, tags: src.tags ?? [], status,
idempotency_key: externalId,
publish_payload: { title, slug, status: 'draft', source: 'notion', deadline }
}}];
Почему статус важнее кнопки Запустить
Если workflow ориентируется на статус в базе, команда может управлять публикацией без доступа к n8n. Это снижает риск ручных запусков и дублирования черновиков.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Notion content pipeline with idempotency",
"nodes": [
{
"name": "Notion Ready Trigger",
"type": "n8n-nodes-base.notionTrigger",
"purpose": "Найти карточки Ready"
},
{
"name": "Validate Notion properties",
"type": "n8n-nodes-base.code",
"purpose": "Проверить title, slug, status"
},
{
"name": "Check idempotency",
"type": "n8n-nodes-base.if",
"purpose": "Не создавать дубль"
},
{
"name": "Create draft or task",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Создать черновик/задачу"
},
{
"name": "Update Notion status",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Записать результат"
},
{
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"purpose": "Вернуть summary"
}
],
"connections": "Notion Ready Trigger → Validate Notion properties → Check idempotency → Create draft or task → Update Notion status → Respond"
}
Пошаговая настройка Notion database, n8n и публикации ¶
- Создайте Notion integration и выдайте доступ только нужной базе.
- Добавьте поля Status, Slug, Owner, Deadline, External ID, Result URL и Error.
- Импортируйте workflow JSON и замените database_id, credentials и target-систему.
- Настройте фильтр только на статус Ready for automation.
- Протестируйте повторный запуск одной карточки и запись ошибки обратно в Notion.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-notion-n8n-content-ops" \
-H "Content-Type: application/json" \
--data @integration-notion-n8n-content-ops-payload.json
- Карточка без slug должна падать с понятной ошибкой.
- Карточка в статусе Draft должна быть пропущена.
- Повторный external_id не создаёт второй черновик.
- Ошибка target-системы записывается в Notion Error.
- После успеха статус меняется на Done или Needs review.
Production-риски ¶
- Статусы не формализованы. Workflow реагирует на случайные значения и запускается не вовремя.
- Нет idempotency. Возврат карточки в Ready создаёт новый draft.
- Публикация без review. Непроверенный текст уходит на сайт или в рассылку.
- Слишком широкие права Notion token. Интеграция видит лишние базы.
- Ошибки не пишутся обратно. Редактор не понимает, почему автоматизация остановилась.
Полезные ссылки и смежные материалы ¶
- Notion API reference
- n8n Notion node
- Notion → WordPress draft workflow
- Content factory SEO briefs
- WordPress и n8n
Критерии готовности ¶
- У каждой карточки есть slug, owner, deadline и external_id.
- Workflow читает только согласованные статусы.
- Повторный запуск не создаёт дубль.
- Ошибки target-системы возвращаются в Notion.
- Публикация идёт через draft/review, если нет отдельного бизнес-правила.
Nodbot настроит Notion + n8n под вашу редакцию: статусы, дедлайны, idempotency, генерацию черновиков, уведомления и контроль публикации.
Обсудить Notion-автоматизацию