Что получится в результате
Соберем ИИ-агента для SEO и поискового продвижения, который читает данные Google Search Console, Яндекс.Вебмастера, Wordstat, sitemap, список страниц сайта и SERP-данные, а затем делает практические действия: кластеризует запросы, определяет интент, находит страницы для обновления, готовит брифы, проверяет индексацию, ставит задачи и собирает weekly SEO report.
Рабочая версия будет делать так:
- настройки хранятся в `settings`;
- сайты и разделы хранятся в `sites`;
- регионы и поисковые системы хранятся в `search_markets`;
- источники данных хранятся в `seo_data_sources`;
- сырые запросы хранятся в `raw_queries`;
- нормализованные запросы хранятся в `normalized_queries`;
- кластеры хранятся в `keyword_clusters`;
- интенты хранятся в `intent_map`;
- существующие страницы хранятся в `page_inventory`;
- связка запросов и страниц хранится в `query_page_map`;
- разрывы в контенте хранятся в `content_gaps`;
- конкуренты и SERP хранятся в `serp_snapshots`;
- технические проверки хранятся в `technical_checks`;
- проверка индексации хранится в `indexing_checks`;
- sitemap и robots хранятся в `crawl_rules`;
- внутренние ссылки хранятся в `internal_link_opportunities`;
- брифы для новых страниц хранятся в `content_briefs`;
- задачи на обновление страниц хранятся в `refresh_tasks`;
- SEO-задачи хранятся в `seo_task_queue`;
- спорные действия уходят в `approval_queue`;
- одобренные действия попадают в `execution_queue`;
- результаты проверок пишутся в `seo_results`;
- еженедельная сводка пишется в `weekly_seo_report`;
- все решения пишутся в `audit_log`;
- ошибки API и данных пишутся в `error_log`.
В первой версии агент не публикует страницы, не меняет robots.txt, не правит sitemap, не ставит редиректы, не удаляет URL и не обещает рост трафика. Он готовит брифы, задачи, проверки и рекомендации, которые подтверждает редактор, SEO-специалист или владелец сайта.
Что понадобится
- n8n Cloud или self-hosted n8n.
- Google Sheets для MVP-таблиц.
- Доступ к Google Search Console.
- Доступ к Яндекс.Вебмастеру.
- Данные Wordstat или CSV с поисковыми запросами.
- DataForSEO API или другой легальный SERP API, если нужно смотреть выдачу и конкурентов.
- Sitemap сайта.
- Список текущих URL сайта.
- Доступ read-only к CMS или выгрузка страниц.
- Канал approval: Telegram, Slack, Teams или email.
- API-ключ LLM-провайдера.
- SEO-специалист или редактор, который подтверждает брифы, обновления и технические задачи.
Шаг 1. Выберите первый SEO-сценарий
Не начинайте с “агент продвигает сайт”. SEO состоит из нескольких разных процессов.
Для MVP выберите один сценарий:
- собрать семантику и кластеры;
- найти страницы, которые нужно обновить;
- подготовить брифы для новых статей;
- проверить индексацию важных URL;
- найти технические SEO-ошибки;
- найти внутренние ссылки между статьями;
- собрать weekly SEO report.
Самый полезный старт для статейника: `Search Console + Wordstat -> кластеры -> карта страниц -> gaps -> брифы -> approval`.
Проверка: первый сценарий можно выполнить на одном разделе сайта и 50-200 запросах.
Шаг 2. Запретите опасные действия
В первой версии запретите агенту:
- публиковать статьи без редактора;
- переписывать опубликованные страницы напрямую;
- менять `robots.txt`;
- менять sitemap;
- ставить canonical;
- создавать редиректы;
- удалять страницы;
- менять URL;
- генерировать массовые страницы под низкокачественные запросы;
- обещать позиции или трафик;
- покупать ссылки;
- отправлять страницы на переобход без проверки.
Разрешите агенту:
- читать SEO-данные;
- группировать запросы;
- предлагать интент;
- готовить брифы;
- находить страницы на обновление;
- создавать SEO-задачи;
- проверять индексацию;
- готовить internal link suggestions;
- собирать weekly report;
- отправлять спорные действия в approval.
Проверка: любое действие, которое меняет сайт или поисковые настройки, должно попадать в `approval_queue`.
Шаг 3. Создайте Google Sheet проекта
Создайте таблицу `seo_agent_mvp`.
Добавьте листы:
settings
sites
search_markets
seo_data_sources
raw_queries
normalized_queries
keyword_clusters
intent_map
page_inventory
query_page_map
content_gaps
serp_snapshots
technical_checks
indexing_checks
crawl_rules
internal_link_opportunities
content_briefs
refresh_tasks
seo_task_queue
approval_queue
execution_queue
seo_results
weekly_seo_report
audit_log
error_log
Проверка: названия листов совпадают один в один. n8n будет обращаться к ним по имени.
Шаг 4. Заполните settings
В `settings` добавьте колонки:
key
value
description
Добавьте строки:
llm_model | gpt-4.1-mini | модель для анализа запросов и брифов
default_search_engine | yandex | основной поисковик для приоритета
default_region | ru | основной регион
max_queries_per_run | 200 | лимит запросов за один запуск
min_impressions_for_refresh | 100 | минимум показов для задачи на обновление
min_ctr_drop_percent | 20 | порог падения CTR
max_briefs_per_run | 5 | лимит брифов за запуск
allow_auto_publish | false | публикация запрещена
allow_robots_changes | false | robots.txt не меняем автоматически
approval_channel | telegram | канал согласований
report_channel | email | канал отчета
Проверка: `allow_auto_publish=false` и `allow_robots_changes=false`.
Шаг 5. Заполните sites
В `sites` добавьте колонки:
site_id
domain
cms
sitemap_url
robots_url
main_language
owner
status
Пример:
SITE-EZGPT | ezgpt.ru | laravel | https://ezgpt.ru/sitemap.xml | https://ezgpt.ru/robots.txt | ru | owner | active
Проверка: у сайта есть sitemap и владелец.
Шаг 6. Заполните search_markets
В `search_markets` добавьте колонки:
market_id
site_id
search_engine
region
language
device
priority
status
Пример:
MKT-YA-RU-DESK | SITE-EZGPT | yandex | russia | ru | desktop | high | active
MKT-GOOGLE-RU-MOB | SITE-EZGPT | google | russia | ru | mobile | medium | active
Проверка: агент понимает, для какого поисковика и региона он делает вывод.
Шаг 7. Заполните seo_data_sources
В `seo_data_sources` добавьте колонки:
source_id
site_id
source_type
api_slug
credential_ref
scope
refresh_period
status
Пример:
SRC-GSC | SITE-EZGPT | search_console | google-search-console-api | n8n:gsc | queries,pages,clicks,impressions,ctr,position | daily | active
SRC-YAWM | SITE-EZGPT | yandex_webmaster | yandex-webmaster-api | n8n:yandex | indexing,diagnostics,important_urls | daily | active
SRC-WORDSTAT | SITE-EZGPT | wordstat | yandex-wordstat-api | n8n:wordstat | demand,related_queries | weekly | active
SRC-SERP | SITE-EZGPT | serp | dataforseo-api | n8n:dataforseo | top10,features,competitors | weekly | optional
Проверка: ключи хранятся в credentials, а не в Google Sheets.
Шаг 8. Подключите Google Search Console в n8n
Создайте workflow `SEO Agent MVP`.
Добавьте узлы:
- `Manual Trigger`;
- `Read settings`;
- `Read sites`;
- `Read seo_data_sources`;
- `HTTP Request: Google Search Console Search Analytics`;
- `Normalize GSC rows`;
- `Write raw_queries`;
- `Write audit_log`.
Пример запроса к Search Analytics:
{
"startDate": "2026-05-01",
"endDate": "2026-05-22",
"dimensions": ["query", "page", "device", "country"],
"rowLimit": 25000
}
Проверка: в ответе есть `query`, `page`, `clicks`, `impressions`, `ctr`, `position`.
Шаг 9. Записывайте raw_queries
В `raw_queries` добавьте колонки:
raw_query_id
site_id
source
market_id
query
page_url
clicks
impressions
ctr
position
period_start
period_end
device
country
created_at
Пример:
RQ-001 | SITE-EZGPT | gsc | MKT-GOOGLE-RU-MOB | как сделать ии агента | https://ezgpt.ru/articles/kak-sozdat-ii-agenta | 32 | 1200 | 0.026 | 8.4 | 2026-05-01 | 2026-05-22 | mobile | rus | 2026-05-23
Проверка: запросы не должны терять связку с URL, устройством и периодом.
Шаг 10. Добавьте данные Wordstat
Если API Wordstat уже доступен, подключите его через HTTP Request. Если нет, загрузите CSV вручную.
Минимальные колонки CSV:
query
frequency
region
device
source
collected_at
Запишите эти строки в `raw_queries` с `source=wordstat`.
Проверка: частотность не смешивается с кликами и показами из Search Console. Это разные метрики.
Шаг 11. Создайте normalized_queries
В `normalized_queries` добавьте колонки:
normalized_query_id
site_id
query_original
query_normalized
tokens
frequency
clicks
impressions
ctr
position
source_mix
is_brand
is_trash
trash_reason
created_at
Нормализация:
- привести к нижнему регистру;
- заменить `ё` на `е`;
- убрать двойные пробелы;
- убрать мусорные символы;
- склеить явные дубли;
- пометить брендовые запросы;
- пометить мусорные запросы.
Проверка: `ИИ агент`, `ии-агент`, `ии агент` должны стать одной нормализованной сущностью.
Шаг 12. Настройте prompt для очистки запросов
LLM-узел получает пачку запросов и возвращает JSON.
Prompt:
Ты SEO-аналитик. Очисти поисковые запросы.
Правила:
1. Не меняй смысл запроса.
2. Не объединяй разные интенты.
3. Помечай мусор: случайные символы, нерелевантные бренды, взрослые темы, чужие продукты.
4. Брендовые запросы помечай отдельно.
5. Не придумывай частотность.
Вход:
{{$json.queries}}
Верни JSON:
{
"items": [
{
"query_original": "...",
"query_normalized": "...",
"is_brand": false,
"is_trash": false,
"trash_reason": "",
"notes": ""
}
]
}
Проверка: если LLM вернула невалидный JSON, запись идет в `error_log`, а не в таблицу запросов.
Шаг 13. Создайте keyword_clusters
В `keyword_clusters` добавьте колонки:
cluster_id
site_id
cluster_name
main_query
support_queries
total_frequency
total_impressions
existing_page_url
target_page_type
priority
status
owner
`target_page_type`:
article
instruction
glossary
tool_page
category_page
comparison
faq
landing
Проверка: один кластер должен закрываться одной основной страницей. Если запросы требуют разных форматов, разделите кластер.
Шаг 14. Настройте prompt для кластеризации
Prompt:
Ты SEO-специалист. Сгруппируй запросы в кластеры.
Правила:
1. Один кластер = один поисковый интент и одна будущая или существующая страница.
2. Не смешивай "что такое", "как сделать", "лучшие", "цена", "скачать".
3. Для каждого кластера выбери main_query.
4. Укажи target_page_type.
5. Если запрос спорный, отправь его в отдельный кластер со статусом needs_review.
Вход:
{{$json.normalized_queries}}
Верни JSON:
{
"clusters": [
{
"cluster_name": "...",
"main_query": "...",
"support_queries": ["..."],
"target_page_type": "article | instruction | glossary | tool_page | comparison | faq",
"priority": "high | medium | low",
"status": "ready | needs_review"
}
]
}
Проверка: агент не должен класть “что такое ИИ-агент” и “как создать ИИ-агента” в один кластер.
Шаг 15. Создайте intent_map
В `intent_map` добавьте колонки:
intent_id
cluster_id
main_query
intent_type
user_goal
best_page_format
must_answer
avoid
confidence
`intent_type`:
informational
how_to
commercial
comparison
navigational
transactional
local
support
Пример:
INT-001 | CL-AGENT-HOWTO | как создать ии агента | how_to | собрать рабочего агента | пошаговая инструкция | инструменты, шаги, проверка результата | общие рассуждения | high
Проверка: интент должен объяснять формат страницы, а не просто повторять запрос.
Шаг 16. Соберите page_inventory
В `page_inventory` добавьте колонки:
page_id
site_id
url
title
h1
content_type
category
published_at
updated_at
status_code
indexable
canonical_url
word_count
internal_links_count
last_gsc_clicks
last_gsc_impressions
last_gsc_position
Получите данные из CMS, sitemap или crawler-выгрузки.
Проверка: для каждой страницы есть `status_code`, `indexable` и `canonical_url`.
Шаг 17. Создайте query_page_map
В `query_page_map` добавьте колонки:
map_id
cluster_id
query
current_page_url
target_page_url
match_type
problem
recommended_action
confidence
`match_type`:
exact
close
wrong_page
missing_page
multiple_pages
needs_review
Проверка: если один запрос получает трафик на две страницы, агент должен пометить `multiple_pages`, а не выбрать наугад.
Шаг 18. Создайте content_gaps
В `content_gaps` добавьте колонки:
gap_id
cluster_id
main_query
gap_type
evidence
impact
recommended_page_type
status
owner
created_at
`gap_type`:
missing_page
thin_content
wrong_intent
outdated_content
missing_faq
missing_internal_links
cannibalization
Проверка: gap создается только с evidence: запросы, показы, SERP или текущая страница.
Шаг 19. Подключите SERP-проверку
Если используете DataForSEO, создайте узлы:
- `Read keyword_clusters`;
- `HTTP Request: DataForSEO SERP`;
- `Normalize SERP`;
- `Write serp_snapshots`.
В `serp_snapshots` добавьте колонки:
serp_id
cluster_id
query
search_engine
region
device
top_urls
serp_features
dominant_page_type
competitor_notes
checked_at
Проверка: агент определяет тип страниц в выдаче: статья, подборка, инструмент, видео, форум, документация.
Шаг 20. Создайте technical_checks
В `technical_checks` добавьте колонки:
check_id
site_id
url
check_type
status
evidence
severity
recommended_action
created_at
Проверяйте:
- status code;
- noindex;
- canonical;
- title;
- description;
- h1;
- дубль title;
- дубль description;
- пустой alt у важных изображений;
- битые внутренние ссылки;
- редирект-цепочки;
- слишком медленные страницы.
Проверка: техническая задача создается только с URL и evidence.
Шаг 21. Создайте indexing_checks
В `indexing_checks` добавьте колонки:
index_check_id
site_id
url
search_engine
index_status
inspection_status
problem
recommended_action
checked_at
`index_status`:
indexed
not_indexed
discovered
crawled_not_indexed
blocked
unknown
Проверка: если URL закрыт в robots или noindex, агент не должен советовать “подождать”. Он должен создать техническую задачу.
Шаг 22. Создайте crawl_rules
В `crawl_rules` добавьте колонки:
rule_id
site_id
file_type
url
rule_text
affected_path
risk
recommended_action
status
`file_type`:
robots
sitemap
canonical
redirect
Проверка: любые изменения robots, sitemap, canonical и redirects отправляются в approval.
Шаг 23. Создайте internal_link_opportunities
В `internal_link_opportunities` добавьте колонки:
link_id
source_url
target_url
anchor_text
reason
priority
status
created_at
Правила:
- ссылка должна помогать пользователю;
- anchor должен быть естественным;
- не ставьте 20 одинаковых anchors;
- не ссылайтесь на нерелевантную страницу ради SEO;
- сначала связывайте статьи, глосарий, инструменты и инструкции.
Проверка: у каждой ссылки есть причина, почему она полезна читателю.
Шаг 24. Создайте content_briefs
В `content_briefs` добавьте колонки:
brief_id
cluster_id
target_page_type
title
h1
seo_title
seo_description
outline_json
faq_json
required_terms
internal_links
related_tools
fact_check_notes
status
reviewer
created_at
Проверка: бриф должен содержать структуру, FAQ, внутренние ссылки и критерии полноты. Просто заголовок статьи не считается брифом.
Шаг 25. Настройте prompt для брифа
Prompt:
Ты SEO-редактор. Подготовь контент-бриф.
Правила:
1. Не пиши готовую статью.
2. Не обещай позиции и трафик.
3. Структура должна закрывать интент.
4. Добавь FAQ из реальных вопросов к теме.
5. Добавь внутренние ссылки только по смыслу.
6. Укажи, что нужно проверить фактами.
7. Если тема требует инструкции, сделай план от нуля до результата.
Вход:
cluster:
{{$json.cluster}}
intent:
{{$json.intent}}
current_pages:
{{$json.pages}}
serp:
{{$json.serp}}
Верни JSON:
{
"title": "...",
"h1": "...",
"seo_title": "...",
"seo_description": "...",
"outline": [
{"h2": "...", "purpose": "...", "must_cover": ["..."]}
],
"faq": [
{"question": "...", "answer_direction": "..."}
],
"required_terms": ["..."],
"internal_links": [{"url": "...", "anchor": "...", "reason": "..."}],
"fact_check_notes": ["..."]
}
Проверка: если JSON невалидный, запись идет в `error_log`.
Шаг 26. Создайте refresh_tasks
В `refresh_tasks` добавьте колонки:
refresh_id
page_url
reason
evidence
recommended_changes
priority
status
owner
created_at
Задача на обновление создается, если:
- показы растут, CTR падает;
- позиция ухудшилась;
- страница не закрывает новый интент;
- появился сильный SERP-конкурент;
- контент устарел;
- нет FAQ;
- нет внутренних ссылок;
- title или description не соответствуют запросам.
Проверка: обновление страницы должно объяснять, что именно менять.
Шаг 27. Создайте seo_task_queue
В `seo_task_queue` добавьте колонки:
task_id
source
source_id
task_type
title
description
priority
owner
status
due_date
created_at
`task_type`:
new_content
refresh_content
technical_fix
indexing_fix
internal_link
serp_review
analytics_review
Проверка: задача должна иметь владельца и проверяемый результат.
Шаг 28. Настройте approval_queue
В `approval_queue` добавьте колонки:
approval_id
source
source_id
action_type
action_text
risk_level
payload_json
approver
status
requested_at
approved_at
decision_comment
В approval отправляйте:
- публикацию новой страницы;
- массовое обновление страниц;
- изменение title на важной странице;
- изменение URL;
- редирект;
- canonical;
- robots.txt;
- sitemap;
- удаление страницы;
- отправку URL на переобход.
Проверка: `approval_queue.status` не должен сразу быть `approved`.
Шаг 29. Настройте execution_queue
В `execution_queue` добавьте колонки:
execution_id
approval_id
action_type
payload_json
status
executor
started_at
finished_at
result_url
error_message
В первой версии используйте `executor=manual`.
Проверка: агент готовит задачу, но человек сам меняет сайт или CMS.
Шаг 30. Сделайте Telegram approval
В n8n добавьте Telegram-узел после записи в `approval_queue`.
Сообщение:
SEO Agent approval
Action: {{$json.action_type}}
Risk: {{$json.risk_level}}
Source: {{$json.source}} {{$json.source_id}}
{{$json.action_text}}
Approve: /approve {{$json.approval_id}}
Reject: /reject {{$json.approval_id}}
Проверка: `/approve` меняет только одну строку по `approval_id`.
Шаг 31. Создайте seo_results
В `seo_results` добавьте колонки:
result_id
task_id
page_url
metric
before_value
after_value
period_before
period_after
comment
created_at
Метрики:
clicks
impressions
ctr
position
indexed_urls
technical_errors
internal_links_added
published_pages
updated_pages
Проверка: агент сравнивает периоды, а не делает вывод по одному дню.
Шаг 32. Создайте weekly_seo_report
В `weekly_seo_report` добавьте колонки:
report_id
site_id
period
summary
wins
risks
new_briefs_count
refresh_tasks_count
technical_issues_count
indexing_issues_count
top_actions_next_week
status
created_at
Пример summary:
За неделю найдено 4 кластера без посадочной страницы, 7 страниц на обновление и 3 проблемы индексации. Главный приоритет: закрыть кластер "как создать ии агента", обновить 2 статьи с падением CTR и проверить sitemap для новых инструкций.
Проверка: отчет должен заканчиваться конкретными действиями на следующую неделю.
Шаг 33. Настройте audit_log
В `audit_log` добавьте колонки:
audit_id
run_id
actor
action
entity_type
entity_id
before_json
after_json
reason
created_at
Логируйте:
- импорт запросов;
- очистку запросов;
- создание кластера;
- определение интента;
- создание gap;
- создание брифа;
- создание refresh task;
- отправку в approval;
- решение approval;
- weekly report.
Проверка: по `audit_log` можно понять, почему агент предложил конкретную страницу или бриф.
Шаг 34. Настройте error_log
В `error_log` добавьте колонки:
error_id
run_id
node_name
error_type
message
payload_sample
retry_count
status
created_at
Типы ошибок:
api_auth_error
api_rate_limit
invalid_json
missing_sitemap
missing_page
bad_serp_response
empty_keyword_batch
permission_denied
Проверка: пустая выдача API не должна превращаться в вывод “спроса нет”.
Шаг 35. Протестируйте на одном кластере
Добавьте в `raw_queries` 5 запросов:
как создать ии агента
создание ии агента
как сделать ии агента
ии агент инструкция
ai agent как создать
Запустите workflow только для этих строк.
Ожидаемый результат:
- в `normalized_queries` запросы очищены;
- в `keyword_clusters` создан один кластер;
- в `intent_map` указан `how_to`;
- в `query_page_map` найдена текущая или отсутствующая страница;
- если страницы нет, создан `content_gaps`;
- в `content_briefs` создан бриф инструкции;
- в `approval_queue` появилась задача на review брифа;
- в `audit_log` есть все шаги;
- в `error_log` нет ошибок.
Шаг 36. Проверьте негативные сценарии
Проведите проверки:
- загрузите нерелевантные запросы;
- убедитесь, что они помечены `is_trash=true`;
- смешайте запросы “что такое” и “как сделать”;
- убедитесь, что агент разделил интенты;
- удалите sitemap URL;
- убедитесь, что создана ошибка `missing_sitemap`;
- добавьте страницу с noindex;
- убедитесь, что агент создал technical task;
- попробуйте действие “изменить robots.txt”;
- убедитесь, что оно ушло в approval;
- передайте пустой SERP-ответ;
- убедитесь, что агент не сделал SEO-вывод без данных.
Проверка: агент должен быть полезным, но осторожным. В SEO слишком легко навредить автоматикой.
Что нельзя автоматизировать в первой версии
Не автоматизируйте сразу:
- публикацию статей;
- массовую генерацию страниц;
- изменение URL;
- редиректы;
- canonical;
- robots.txt;
- sitemap;
- удаление страниц;
- покупку ссылок;
- отправку сотен URL на переобход;
- автоматический вывод “страница плохая, удалить”;
- обещания по позициям, трафику и срокам.
Минимальный хороший MVP: агент собирает 100-200 запросов, чистит их, делает кластеры, находит 3-5 gaps, готовит 1-3 брифа, предлагает внутренние ссылки, проверяет индексацию важных URL и собирает weekly SEO report.
Частые вопросы
Может ли SEO-агент сам публиковать статьи?
В первой версии не стоит. Он может подготовить бриф, структуру, SEO title, description, FAQ и внутренние ссылки, но публикацию должен подтверждать редактор. Иначе легко получить одинаковые страницы, фактические ошибки и мусорный контент.
Чем SEO-агент отличается от AI-райтера?
AI-райтер пишет текст. SEO-агент управляет процессом: запросы, интент, кластеры, текущие страницы, индексация, технические проверки, брифы, задачи и отчеты. Текст - только одна часть системы.
Нужен ли DataForSEO, если есть Search Console?
Не всегда. Search Console показывает реальные данные вашего сайта, но не показывает полную картину SERP и конкурентов. Для MVP можно начать с Search Console, Яндекс.Вебмастера и Wordstat, а SERP API добавить позже.
Как не сделать дорвей из SEO-агента?
Не генерируйте страницы под каждый запрос. Один кластер должен закрываться одной качественной страницей с понятным интентом. Спорные и похожие запросы лучше объединять или отправлять на review.
Что считать готовым результатом MVP?
MVP готов, если агент по одному разделу сайта собирает запросы, делает кластеры, сопоставляет их со страницами, находит gaps, готовит брифы, ставит SEO-задачи, проверяет индексацию и оставляет понятный `audit_log`.