Суть урока
SEO в 2026 году — это не просто "попасть в Google". Часть запросов теперь закрывают AI-ответы: пользователь спросил ChatGPT про агентство недвижимости в Куэнке — и ушёл с ответом, не заходя ни на один сайт. Новая игра: появляться и в Google, и в ответах AI. Claude Code позволяет автоматизировать почти весь стек — от keyword research до еженедельного аудита — при небольших расходах на токены.
Ключевые концепции
- Google AI Overviews (раньше назывались SGE) — AI-блоки в выдаче Google; на часть информационных запросов они забирают клики у обычных результатов
- AEO (Answer Engine Optimization) — оптимизация под AI-ответы (ChatGPT, Claude, Gemini, Perplexity)
- Keyword Gap — ключевые слова по которым ранжируется конкурент, но не ты
- Schema Markup — машиночитаемая разметка, помогает AI понять о чём страница
- Core Web Vitals — скорость и стабильность страницы, фактор ранжирования Google
- searchfit-seo:* — плагин с SEO-навыками для Claude Code (ставится через
/plugin)
Теория
SEO в 2026 — что изменилось с AI
До 2024 задача была одна: попасть на первую страницу Google. В 2026 картина сложнее.
Что изменилось:
| Было (до 2024) | Стало (2026) |
|---|---|
| Цель: позиция 1-3 в Google | Цель: позиция в Google + упоминание в AI-ответах |
| Трафик = клики из поисковика | Трафик = клики из поисковика + бренд-запросы после AI |
| Ключевые слова → статьи | Вопросы и ответы → авторитет источника |
| Ссылочная масса = рейтинг | Ссылочная масса + упоминания в авторитетных источниках |
| Технический SEO | Технический SEO + структурированные данные |
Google AI Overviews (раньше SGE) показывается над обычными результатами на часть информационных запросов; доля зависит от темы, региона и языка. Если ты не среди источников в AI Overview, трафика с таких запросов становится меньше.
ChatGPT, Claude, Gemini чаще опираются на источники которые:
- Часто цитируются в авторитетных материалах
- Имеют чёткую структуру вопрос-ответ
- Используют Schema Markup (Article и другие типы)
- Имеют хороший технический SEO
Какую роль разметка играет у каждого AI-сервиса, они официально не раскрывают. Считай её хорошей гигиеной, а не рычагом с гарантированным эффектом.
AEO vs SEO — не противоречат, дополняют друг друга. Хорошая SEO-статья = хорошая AEO-статья при правильной структуре.
Ключевые инструменты стека
Плагин searchfit-seo добавляет в Claude Code готовые SEO-навыки. Ставится через /plugin из marketplace; список ниже дан на октябрь 2026:
# Навыки плагина searchfit-seo (ставятся через /plugin из marketplace):
# searchfit-seo:seo-audit — полный аудит сайта
# searchfit-seo:keyword-clustering — группировка ключевых слов
# searchfit-seo:content-brief — техзадание для статьи
# searchfit-seo:on-page-seo — оптимизация страницы
# searchfit-seo:schema-markup — разметка для AI и Google
# searchfit-seo:ai-visibility — проверка видимости в AI-ответах
# searchfit-seo:content-strategy — контент-стратегия
# searchfit-seo:internal-linking — стратегия внутренних ссылок
# searchfit-seo:technical-seo — технический аудит
# Внешние инструменты (через API):
# Google Search Console API — позиции, клики, впечатления (бесплатно)
# Ahrefs API — ключевые слова конкурентов (платно, цены на сайте)
# Google PageSpeed API — Core Web Vitals (бесплатно)Для старта достаточно Google Search Console (бесплатно) + searchfit-seo skills. Ahrefs добавляешь когда масштабируешься.
Keyword Research автоматически
Находим где деньги лежат — ключевые слова с трафиком и коммерческим интентом.
import anthropic
import os
import json
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
def find_keyword_opportunities(topic: str, our_domain: str) -> dict:
"""
Анализирует keyword opportunities для заданной темы.
Без Ahrefs API — использует только Claude для генерации гипотез.
С Ahrefs API — добавляешь реальные объёмы (см. комментарий ниже).
"""
response = "".join(b.text for b in client.messages.create(
model="claude-sonnet-5-5",
max_tokens=3000,
messages=[{
"role": "user",
"content": f"""Проведи keyword research для темы: "{topic}"
Домен: {our_domain}
Задача: найти 30 ключевых слов с коммерческим потенциалом.
Разбей по категориям:
1. ТРАНЗАКЦИОННЫЕ (люди хотят купить/заказать):
Примеры: "купить квартиру Куэнка", "агентство недвижимости Эквадор"
2. ИНФОРМАЦИОННЫЕ (люди ищут информацию):
Примеры: "как купить недвижимость в Эквадоре иностранцу", "жизнь в Куэнке отзывы"
3. НАВИГАЦИОННЫЕ (люди ищут конкретный бренд/сайт):
Примеры: "Acme Realty недвижимость", "агентство Куэнка русские"
4. LONG-TAIL (длинный хвост, меньше конкуренции):
Примеры: "как купить квартиру в Куэнке пенсионеру из России", "районы Куэнки где живут русские"
Для каждого ключевого слова оцени:
- Предполагаемый объём запросов (низкий/средний/высокий)
- Уровень конкуренции (низкий/средний/высокий)
- Коммерческий потенциал (1-5)
- Тип контента для создания (статья/FAQ/гид/сравнение)
Формат ответа: JSON список объектов:
{{
"keyword": "...",
"category": "транзакционное/информационное/навигационное/long-tail",
"estimated_volume": "низкий/средний/высокий",
"competition": "низкий/средний/высокий",
"commercial_potential": 1-5,
"content_type": "...",
"priority": "high/medium/low"
}}
Верни только валидный JSON массив."""
}]
).content if b.type == "text")
keywords = json.loads(response)
# Фильтруем приоритетные возможности
high_priority = [k for k in keywords if k["priority"] == "high"]
print(f"Всего ключевых слов: {len(keywords)}")
print(f"Приоритетных (high): {len(high_priority)}")
print("\nТоп-10 по приоритету:")
for i, kw in enumerate(high_priority[:10], 1):
print(f" {i}. {kw['keyword']} | потенциал: {kw['commercial_potential']}/5 | конкуренция: {kw['competition']}")
return {"all": keywords, "high_priority": high_priority}
def find_keyword_gap(our_keywords: list, competitor_keywords: list) -> list:
"""
Находит ключевые слова которые есть у конкурента, но нет у нас.
our_keywords / competitor_keywords — списки строк (ключевых слов).
"""
response = "".join(b.text for b in client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2000,
messages=[{
"role": "user",
"content": f"""Проведи keyword gap анализ.
Наши ключевые слова: {json.dumps(our_keywords[:50], ensure_ascii=False)}
Ключевые слова конкурента: {json.dumps(competitor_keywords[:50], ensure_ascii=False)}
Найди:
1. Топ-20 ключевых слов конкурента которых нет у нас — приоритизируй по коммерческому интенту
2. Быстрые победы: наши слова где позиции 11-30 (можно поднять в топ-10 за 2-4 недели)
3. Общие слова: где мы конкурируем напрямую — сравни потенциальные позиции
Формат: JSON с тремя массивами:
{{
"gap_keywords": [{{"keyword": "...", "why_valuable": "...", "urgency": "high/medium"}}],
"quick_wins": [{{"keyword": "...", "current_position_estimate": "11-30", "action": "..."}}],
"competitive": [{{"keyword": "...", "our_advantage": "...", "their_advantage": "..."}}]
}}"""
}]
).content if b.type == "text")
return json.loads(response)
# Пример использования
if __name__ == "__main__":
# Базовый keyword research без API
opportunities = find_keyword_opportunities(
topic="недвижимость в Эквадоре для русскоязычных",
our_domain="acme-realty.example"
)
# Сохраняем для дальнейшей работы
with open("keyword-research.json", "w", encoding="utf-8") as f:
json.dump(opportunities, f, ensure_ascii=False, indent=2)
print("\nРезультаты сохранены в keyword-research.json")Content Brief за 5 минут
Вместо написания технических заданий вручную — Claude делает это автоматически.
Используй searchfit-seo:content-brief skill напрямую из Claude Code:
Claude, используй searchfit-seo:content-brief skill. Тема: "купить квартиру в Куэнке Эквадор" Наша аудитория: русскоязычные инвесторы и эмигранты 35-55 лет Конкуренты для анализа: [URL статьи конкурента 1, URL статьи конкурента 2] Дай полный контент-бриф: - Основное ключевое слово и LSI-ключевые слова - Заголовок H1 (clickable, с ключевым словом) - Структура статьи (H2, H3 с описанием содержания каждого раздела) - Что есть у конкурентов но чего не хватает (наш competitive advantage) - Рекомендуемая длина (слов) - Schema markup тип (Article / FAQ / HowTo / LocalBusiness) - CTA в конце статьи
Или через Python для автоматизации в потоке:
def generate_content_brief(keyword: str, audience: str, competitor_urls: list) -> str:
"""Генерирует контент-бриф для конкретного ключевого слова"""
response = "".join(b.text for b in client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2500,
messages=[{
"role": "user",
"content": f"""Создай контент-бриф для SEO-статьи.
Целевое ключевое слово: "{keyword}"
Аудитория: {audience}
Конкуренты: {', '.join(competitor_urls) if competitor_urls else 'не указаны'}
Бриф должен включать:
## Ключевые слова
- Основное: {keyword}
- LSI (семантически связанные): [список 10-15 слов]
- Long-tail вариации: [список 5-7 фраз]
## Заголовок H1
[Кликабельный заголовок с основным ключевым словом, 50-60 символов]
## Meta Description
[155 символов, включает ключевое слово, призыв к действию]
## Структура статьи
[H2 блок 1 — название]
- Что включить: ...
- Примерная длина: ... слов
[H2 блок 2 — название]
...
## FAQ раздел
[5-7 вопросов которые реально задают люди на эту тему]
## Рекомендации
- Длина: ... слов
- Schema markup: ...
- Тип контента: статья/гид/сравнение/FAQ
- Уникальный угол (что отличает нас от конкурентов): ...
Пиши на русском языке."""
}]
).content if b.type == "text")
return response
# Генерируем брифы для топ-5 приоритетных ключевых слов
priority_keywords = [
"купить квартиру в Куэнке",
"жизнь в Эквадоре для русских",
"недвижимость Эквадор инвестиции",
"переезд в Куэнку из России",
"стоимость жизни в Куэнке 2026",
]
for kw in priority_keywords:
brief = generate_content_brief(
keyword=kw,
audience="русскоязычные 35-55 лет, рассматривают переезд или инвестиции",
competitor_urls=[]
)
# Сохраняем каждый бриф в отдельный файл
filename = kw.replace(" ", "-").replace("/", "-") + ".md"
with open(f"briefs/{filename}", "w", encoding="utf-8") as f:
f.write(f"# Контент-бриф: {kw}\n\n")
f.write(brief)
print(f"Бриф создан: briefs/{filename}")Schema Markup автоматически
Schema.org разметка помогает поисковикам понять структуру контента. Попадание в расширенные результаты или в AI Overviews она не гарантирует.
def add_schema_markup(page_content: str, page_type: str, business_info: dict) -> str:
"""
Генерирует JSON-LD Schema markup для страницы.
page_type: "article" / "faq" / "local_business" / "howto" / "product"
business_info: словарь с данными о бизнесе (название, адрес, телефон, и т.д.)
"""
schema_prompt = f"""
Создай JSON-LD schema.org разметку для страницы.
Тип страницы: {page_type}
Данные бизнеса: {json.dumps(business_info, ensure_ascii=False)}
Контент страницы (первые 1500 символов):
{page_content[:1500]}
Требования:
1. Используй наиболее подходящий тип schema.org
2. Заполни все обязательные поля (required properties)
3. Добавь рекомендуемые поля (recommended properties) где возможно
4. Для FAQ страниц: добавь FAQPage schema с реальными вопросами из контента
5. Для статей: добавь Article schema с автором и датой публикации
6. Для локального бизнеса: добавь LocalBusiness + GeoCoordinates
7. Для инструкций: добавь HowTo schema с пошаговыми шагами
Верни только валидный JSON-LD объект (без markdown блоков).
"""
schema_json = "".join(b.text for b in client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2000,
messages=[{"role": "user", "content": schema_prompt}]
).content if b.type == "text").strip()
# Оборачиваем в тег для вставки в HTML
html_tag = f'<script type="application/ld+json">\n{schema_json}\n</script>'
return html_tag
# Пример: Schema для агентства недвижимости
business_info = {
"name": "Acme Realty",
"url": "https://acme-realty.example",
"telephone": "+593-XX-XXX-XXXX",
"address": {
"city": "Cuenca",
"country": "Ecuador"
},
"description": "Агентство недвижимости в Куэнке для русскоязычных",
"languages": ["ru", "es"],
"priceRange": "$$"
}
faq_page_content = """
Сколько стоит квартира в Куэнке? [ответ с реальными цифрами от агентства]...
Как иностранцу купить недвижимость в Эквадоре? [ответ, проверенный юристом]...
Нужна ли виза для покупки недвижимости? [ответ, проверенный юристом]...
"""
schema_html = add_schema_markup(
page_content=faq_page_content,
page_type="faq",
business_info=business_info
)
print("Schema markup создан:")
print(schema_html[:500] + "...")Что изменилось в расширенных результатах. Расширенные результаты HowTo Google убрал в 2023 году, а расширенные результаты FAQ перестали показываться с 7 мая 2026 (так написано в документации Google Search Central). Сама разметка FAQPage и HowTo остаётся допустимой: она описывает структуру страницы для машин, но «раскрывающихся вопросов» в выдаче от неё ждать не стоит. Проверяй разметку на валидность и не строй на ней ожидания по трафику.
AI Visibility — появляться в ответах AI
AEO — молодая дисциплина. Цель: когда пользователь спрашивает ChatGPT или Claude про твою тему — ты в ответе.
Используй searchfit-seo:ai-visibility skill:
Claude, используй searchfit-seo:ai-visibility skill. Наш сайт: acme-realty.example Тема: недвижимость для русскоязычных в Эквадоре Проверь нашу видимость в AI-ответах для этих запросов: - "Как купить недвижимость в Эквадоре русскому гражданину" - "Агентство недвижимости Куэнка на русском языке" - "Жизнь в Эквадоре для русских: где жить" - "Безопасно ли покупать недвижимость в Эквадоре" Дай: 1. Текущий уровень AI-видимости (появляемся ли в ответах) 2. Что мешает AI нас рекомендовать 3. Конкретные изменения для улучшения AI-видимости: - Какие страницы добавить или переработать - Какую разметку добавить - Какой формат контента предпочитают AI-движки 4. Приоритет действий (что сделать в первую очередь)
Или через код для регулярного мониторинга. Это упрощённая проверка: Claude отвечает по памяти, без поиска в вебе, поэтому реальные ответы ChatGPT, Gemini, Perplexity и Google AI Mode скрипт не воспроизводит. Для настоящего замера открывай эти сервисы сам или возьми инструмент для мониторинга AI-видимости (например, Peec AI или OtterlyAI; цены и условия смотри на их сайтах).
def check_ai_visibility(brand_name: str, topics: list, test_queries: list) -> dict:
"""
Проверяет насколько бренд упоминается в AI-ответах.
Симулирует ответы AI на заданные запросы и ищет упоминания бренда.
"""
results = {}
for query in test_queries:
# Симулируем ответ AI на запрос (без реального запроса к ChatGPT)
response = "".join(b.text for b in client.messages.create(
model="claude-sonnet-5-5",
max_tokens=1000,
system=f"""Ты — поисковый AI-ассистент который отвечает на вопросы пользователей.
Отвечай на основе реально существующей информации в интернете.
Если рекомендуешь конкретные ресурсы или компании — объясни почему.""",
messages=[{
"role": "user",
"content": query
}]
).content if b.type == "text")
# Проверяем упоминается ли наш бренд
brand_mentioned = brand_name.lower() in response.lower()
# Анализируем что рекомендуется
analysis = "".join(b.text for b in client.messages.create(
model="claude-haiku-4-5", # лёгкая модель для простой разметки ответа; актуальные названия моделей: страница «Актуальное сейчас»
max_tokens=300,
messages=[{
"role": "user",
"content": f"""Запрос пользователя: "{query}"
AI-ответ: {response[:800]}
Наш бренд: {brand_name}
Ответь:
1. Упоминается ли наш бренд? (да/нет)
2. Кто/что рекомендуется? (перечисли)
3. Почему эти источники упоминаются? (одна фраза)
4. Что нам нужно сделать чтобы попасть в такой ответ? (одна фраза)
Формат: JSON {{
"mentioned": true/false,
"recommended": ["...", "..."],
"why_they_rank": "...",
"our_action": "..."
}}"""
}]
).content if b.type == "text")
results[query] = {
"brand_mentioned": brand_mentioned,
"analysis": json.loads(analysis)
}
# Общий вывод
mention_rate = sum(1 for r in results.values() if r["brand_mentioned"]) / len(results)
print(f"\nAI Visibility Report для {brand_name}:")
print(f"Упоминаемость в AI-ответах: {mention_rate:.0%} ({sum(1 for r in results.values() if r['brand_mentioned'])}/{len(results)} запросов)")
print("\nПо каждому запросу:")
for query, data in results.items():
status = "УПОМИНАЕМСЯ" if data["brand_mentioned"] else "не упоминаемся"
print(f" [{status}] {query[:60]}...")
return results
# Пример использования
visibility = check_ai_visibility(
brand_name="Acme Realty",
topics=["недвижимость Эквадор", "Куэнка жилье"],
test_queries=[
"Как купить квартиру в Куэнке иностранцу?",
"Агентство недвижимости в Куэнке для русских",
"Безопасно ли покупать недвижимость в Эквадоре в 2026",
]
)Автоматический SEO-аудит каждую неделю
Вместо ручной проверки раз в месяц — автоматический аудит каждый понедельник.
#!/usr/bin/env python3
# weekly-seo-audit.py — запускать через cron каждый понедельник
import anthropic
import requests
import json
import os
from datetime import datetime, timedelta
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
# Google Search Console API (требует настройки OAuth 2.0)
GSC_PROPERTY = os.environ.get("GSC_PROPERTY", "https://acme-realty.example/")
def get_gsc_data(days_back: int = 28) -> dict:
"""
Получает данные из Google Search Console через API.
Требует: google-auth-oauthlib, google-api-python-client
pip install google-auth-oauthlib google-api-python-client
Если нет настроенного GSC — возвращает заглушку для демо.
"""
try:
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
creds = Credentials.from_authorized_user_file(
os.environ.get("GSC_CREDENTIALS_FILE", "gsc-credentials.json")
)
service = build("searchconsole", "v1", credentials=creds)
end_date = datetime.now().strftime("%Y-%m-%d")
start_date = (datetime.now() - timedelta(days=days_back)).strftime("%Y-%m-%d")
request = {
"startDate": start_date,
"endDate": end_date,
"dimensions": ["query", "page"],
"rowLimit": 100,
# строки API отдаёт по убыванию кликов, отдельная сортировка не нужна
}
response = service.searchanalytics().query(
siteUrl=GSC_PROPERTY, body=request
).execute()
return response.get("rows", [])
except Exception as e:
# Демо-данные если GSC не настроен
print(f"GSC не настроен ({e}). Используем демо-данные.")
return [
{"keys": ["купить квартиру куэнка", "acme-realty.example/"], "clicks": 45, "impressions": 890, "ctr": 0.051, "position": 8.2},
{"keys": ["недвижимость эквадор русские", "acme-realty.example/blog/"], "clicks": 23, "impressions": 560, "ctr": 0.041, "position": 12.5},
{"keys": ["жизнь куэнка отзывы", "acme-realty.example/blog/life/"], "clicks": 18, "impressions": 340, "ctr": 0.053, "position": 6.1},
]
def check_page_speed(url: str) -> dict:
"""Проверяет Core Web Vitals через Google PageSpeed Insights API (бесплатно)"""
api_key = os.environ.get("PAGESPEED_API_KEY", "")
params = {
"url": url,
"strategy": "mobile", # mobile важнее для Google
}
if api_key:
params["key"] = api_key
try:
response = requests.get(
"https://www.googleapis.com/pagespeedonline/v5/runPagespeed",
params=params,
timeout=30
)
data = response.json()
# Извлекаем основные метрики
metrics = data.get("lighthouseResult", {}).get("audits", {})
return {
"lcp": metrics.get("largest-contentful-paint", {}).get("displayValue", "N/A"),
"cls": metrics.get("cumulative-layout-shift", {}).get("displayValue", "N/A"),
"tbt": metrics.get("total-blocking-time", {}).get("displayValue", "N/A"), # в лаборатории вместо INP
"score": data.get("lighthouseResult", {}).get("categories", {}).get("performance", {}).get("score", 0) * 100,
}
except Exception as e:
return {"error": str(e)}
def run_weekly_audit(site_url: str, report_dir: str = "reports/seo") -> str:
"""Запускает полный еженедельный SEO-аудит"""
today = datetime.now().strftime("%Y-%m-%d")
os.makedirs(report_dir, exist_ok=True)
print(f"Запускаю SEO-аудит для {site_url} ({today})")
# 1. Данные из GSC
print(" Получаю данные Google Search Console...")
gsc_data = get_gsc_data(days_back=28)
# 2. Core Web Vitals
print(" Проверяю Core Web Vitals...")
speed_data = check_page_speed(site_url)
# 3. Claude анализирует всё и даёт рекомендации
print(" Анализирую через Claude...")
analysis = "".join(b.text for b in client.messages.create(
model="claude-sonnet-5-5",
max_tokens=3000,
messages=[{
"role": "user",
"content": f"""Проведи анализ SEO-данных и дай рекомендации.
Сайт: {site_url}
Дата: {today}
Google Search Console (топ запросы за 28 дней):
{json.dumps(gsc_data[:20], ensure_ascii=False, indent=2)}
Core Web Vitals:
{json.dumps(speed_data, ensure_ascii=False, indent=2)}
Проведи анализ:
## 1. Быстрые победы (сделать за 1-2 недели)
Запросы где позиция 11-30 и есть шанс подняться в топ-10.
Для каждого: что конкретно сделать (переписать заголовок? добавить раздел? улучшить внутренние ссылки?)
## 2. Падение позиций
Если видишь высокий CTR при низкой позиции — страница релевантна но не ранжируется.
Что делать?
## 3. Техническое
Core Web Vitals — есть ли критические проблемы со скоростью?
Что починить в первую очередь?
## 4. Контентные возможности
Какие темы стоит осветить судя по данным GSC?
Какие запросы имеют много показов но мало кликов (проблема заголовка или meta)?
## 5. Приоритетный план на неделю
Топ-5 конкретных задач с оценкой времени (часов).
Пиши на русском. Конкретно, без воды."""
}]
).content if b.type == "text")
# 4. Сохраняем отчёт
report_path = f"{report_dir}/seo-{today}.md"
with open(report_path, "w", encoding="utf-8") as f:
f.write(f"# SEO-аудит {today}\n\n")
f.write(f"**Сайт:** {site_url}\n\n")
f.write(f"**Core Web Vitals (mobile):** LCP {speed_data.get('lcp', 'N/A')} | Score {speed_data.get('score', 'N/A')}/100\n\n")
f.write("---\n\n")
f.write(analysis)
print(f"\nОтчёт сохранён: {report_path}")
return analysis
# Запуск
if __name__ == "__main__":
run_weekly_audit(
site_url="https://acme-realty.example",
report_dir="reports/seo"
)Добавляем в cron для автозапуска:
# Crontab: запуск каждый понедельник в 09:00
# crontab -e → добавить строку:
0 9 * * 1 cd /path/to/project && python weekly-seo-audit.py >> logs/seo-audit.log 2>&1
# Или через Routines в Claude Code: задача по расписанию в облаке (команда /schedule).
# На октябрь 2026 это research preview на платных тарифах, условия смотри в документации Claude Code.Калькулятор SEO: как прикинуть, стоит ли вкладываться
Числа в таблице вымышленные, это учебный пример. Это не прогноз и не обещание дохода: реальные цифры зависят от ниши, конкуренции, региона и качества материалов. Подставь свои данные.
| Шаг расчёта | Допущение для примера |
|---|---|
| Запросов в месяц по выбранной фразе | 500 |
| Доля кликов (CTR) на выбранной позиции | 28% (в жизни сильно зависит от запроса и от AI-блоков в выдаче) |
| Визитов в месяц | 500 × 28% = 140 |
| Конверсия сайта в заявку | 3% |
| Заявок в месяц | 140 × 3% ≈ 4 |
| Доля заявок, дошедших до сделки | 25% |
| Выручка агентства с одной сделки | $3,000 |
| Выручка в месяц с одной фразы при этих допущениях | 4 × 25% × $3,000 = $3,000 |
С другой стороны считай расходы: токены Claude, своё время, хостинг и платные инструменты, если они у тебя есть. Позиции в выдаче никто не гарантирует, поэтому считай и неудачный сценарий, например вдвое меньше визитов и вдвое ниже конверсия. Если и тогда расчёт выглядит разумно, статья стоит усилий.
Практика
Задание: запустить SEO-машину для реального сайта или тестового домена.
Шаг 1: Настроить Google Search Console (15 мин)
- Зайди на search.google.com/search-console
- Добавь свой сайт и верифицируй через DNS или HTML-файл
- Подожди 2-3 дня чтобы накопились данные (или используй демо-данные скрипта)
Шаг 2: Keyword Research через Claude (10 мин)
# Запусти скрипт keyword research
python keyword-research.py
# Открой keyword-research.json
# Выбери топ-3 приоритетных ключевых слова для первых статейШаг 3: Content Brief через searchfit-seo skill (5 мин)
# В Claude Code используй skill: Claude, используй searchfit-seo:content-brief skill. Тема: [твоё ключевое слово из шага 2] Аудитория: [описание твоей аудитории]
Шаг 4: Schema Markup для главной страницы (10 мин)
# Запусти скрипт schema markup
python add-schema.py --page-type local_business --url https://твой-сайт.com
# Скопируй полученный JSON-LD и вставь в <head> сайтаШаг 5: Настроить еженедельный аудит (10 мин)
# Настрой cron:
crontab -e
# Добавь строку:
0 9 * * 1 cd /path/to/project && python weekly-seo-audit.py
# Или запусти вручную для первого отчёта:
python weekly-seo-audit.pyШаг 6: AI Visibility check (5 мин)
# Проверь видимость в AI-ответах:
python check-ai-visibility.py
# Сравни с результатами через 4 недели после внедрения измененийРезультат: к концу практики у тебя есть список ключевых слов, первые контент-брифы, schema разметка и автоматический еженедельный аудит.
Инструменты и ресурсы
- Google Search Console — бесплатная аналитика позиций и трафика
- Google PageSpeed Insights API — Core Web Vitals (бесплатно)
- Schema.org — справочник всех типов разметки
- Rich Results Test — проверка schema разметки от Google
- Ahrefs — платный инструмент для keyword gap (цены на сайте; для своего сайта есть бесплатный Ahrefs Webmaster Tools)
- Screaming Frog — технический SEO-аудит (есть бесплатная версия с лимитом на число URL, подробности на сайте)
- searchfit-seo:* — плагин с SEO-навыками и командами для Claude Code
- Google Search Console Python API — официальная документация
- Модели Claude — названия в коде даны на октябрь 2026; актуальные цены и версии: Актуальное сейчас
Ключевые выводы
SEO в 2026 — это двойная игра: Google + AI-движки. Техники разные, контент общий: структурированные ответы на реальные вопросы аудитории.
AEO (Answer Engine Optimization) — не замена SEO, а надстройка. Понятная структура вопрос-ответ и аккуратная Schema разметка повышают шансы попасть и в Google, и в ответы ChatGPT, Claude, Gemini, но гарантии не дают.
Автоматизация SEO-машины: keyword research (Claude) → content brief (5 мин) → статья → schema markup → еженедельный аудит (автоматически). После настройки рутина идёт сама, но отчёты и тексты всё равно нужно читать и проверять.
Отдача от SEO приходит не сразу: обычно это месяцы, не дни, и она зависит от ниши, конкуренции и качества материалов. Гарантий позиций нет. Зато хорошая статья, которую обновляют, остаётся работающим активом.
Следующий урок
Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс