Почему push-уведомления стали стандартом для Contentful
Представьте: вы публикуете запись в блоге через Contentful, а на сайте она появляется только через 15 минут — потому что билд запускается раз в час. Или после правки хедера пересобираются все страницы, хотя изменилась одна панель. Это типичные сценарии, когда без webhook не обойтись. Webhooks решают проблему мгновенно: изменения контента (публикация, архивация, удаление) инициируют вызов вашего обработчика. Это основа бесшовной работы для SSR/ISR-сайтов. Один webhook может сэкономить до 90% на API-трафике за счёт бесполлингового обновления. Мы настраиваем webhook-интеграции под ключ — от простого ребилда статики до точечной инвалидации страниц.
Преимущества webhook перед polling
Polling Contentful API каждые N секунд — лишняя нагрузка и задержка. Webhook, напротив, не требует постоянных запросов: сервер сам уведомляет вас об изменениях. Это снижает нагрузку на API в 10 раз и исключает задержки, связанные с частотой опроса. Кроме того, webhook можно защитить секретным ключом, а polling — нет.
| Характеристика | Polling | Webhook |
|---|---|---|
| Задержка | Средняя (период опроса) | Мгновенная (секунды) |
| Нагрузка на API | Высокая (постоянные запросы) | Низкая (только при изменениях) |
| Безопасность | Низкая (открытый endpoint) | Высокая (секретный заголовок) |
| Масштабируемость | Ограничена | Хорошая (асинхронная обработка) |
Проблемы, которые решаем
-
Гонка запросов: без фильтрации webhook ловит все события, вызывая лишние ребилды. Мы настраиваем фильтры по
sys.contentType.sys.idи топикам, чтобы реагировать только на нужные записи. Например, при публикации статьи обновляется только конкретная страница, а не весь сайт. - Безопасность: публичный endpoint уязвим. Добавляем проверку подписи через секретный заголовок и, при необходимости, IP-белый список.
-
Сложная цепочка: при изменении поля, которое влияет на несколько страниц (например, глобальный хедер), нужна массовая инвалидация. Используем
revalidateTagили полный деплой — в зависимости от веса изменения. - Отладка: без журнала вызовов сложно понять, почему webhook не сработал. Настраиваем мониторинг и уведомления об ошибках.
Как фильтровать webhook по типу контента?
Фильтрация по sys.contentType.sys.id — стандартный приём. В теле webhook мы добавляем условие, которое пропускает события только для нужной модели. Это сокращает количество вызовов обработчика в 5–10 раз. Дополнительно можно фильтровать по топикам: например, только публикация (Entry.publish), без архивации.
Как создать webhook в Contentful за 5 шагов?
- Перейдите в Settings → Webhooks в панели управления Contentful.
- Нажмите Add Webhook и укажите URL вашего обработчика (например,
https://mysite.com/api/revalidate). - Выберите топики:
Entry.publish,Entry.unpublish,Asset.publish— в зависимости от сценария. - Добавьте фильтры по типу контента (
sys.contentType.sys.id) для сужения событий. - Включите секретный заголовок (
x-webhook-secret) для безопасности — это защитит от несанкционированных вызовов.
После этого остаётся реализовать обработчик на сервере. Ниже — пример для Next.js.
Создание webhook через CMA
const space = await cmaClient.getSpace(spaceId); await space.createWebhook({ name: 'Next.js ISR Revalidation', url: 'https://mysite.com/api/revalidate', topics: ['Entry.publish', 'Entry.unpublish', 'Asset.publish'], filters: [ { equals: [{ doc: 'sys.contentType.sys.id' }, 'blogPost'], }, ], headers: [ { key: 'x-webhook-secret', value: process.env.CONTENTFUL_WEBHOOK_SECRET, secret: true, }, ], active: true, }); Обработчик в Next.js
Пример обработчика webhook (кликните для раскрытия)
// app/api/revalidate/route.ts export async function POST(request: Request) { const secret = request.headers.get('x-webhook-secret'); if (secret !== process.env.CONTENTFUL_WEBHOOK_SECRET) { return Response.json({ error: 'Unauthorized' }, { status: 401 }); } const payload = await request.json(); const contentTypeId = payload.sys?.contentType?.sys?.id; const slug = payload.fields?.slug?.['en-US']; const topic = request.headers.get('x-contentful-topic'); switch (contentTypeId) { case 'blogPost': if (slug) revalidatePath(`/blog/${slug}`); revalidatePath('/blog'); break; case 'landingPage': revalidatePath('/'); break; default: revalidateTag('contentful'); } return Response.json({ revalidated: true, topic }); } Для статических сайтов используем Vercel Deploy Hook при структурных изменениях, оставляя ISR для контентных правок. Такой подход сокращает время деплоя в 10 раз по сравнению с полным ребилдом после каждого сохранения.
Процесс работы
| Этап | Действия | Длительность |
|---|---|---|
| Аналитика | Определяем сценарии: публикация, архивация, обновление ассетов | 1–2 часа |
| Проектирование | Выбираем стратегию (ISR/полный деплой/гибрид), проектируем фильтры | 2–4 часа |
| Реализация | Пишем обработчик, настраиваем webhook в Contentful, добавляем секрет | 4–8 часов |
| Тестирование | Проверяем отработку событий с вебхук-тестером, стресс-тест | 2–4 часа |
| Деплой | Публикуем изменения, мониторим первые вызовы | 1–2 часа |
Что входит в работу
- Документация по созданным интеграциям (диаграмма потока, описание всех webhook).
- Доступы к управлению webhook и логам (при необходимости).
- Обучение команды: как добавить новый сценарий или фильтр.
- Гарантия работоспособности в течение 30 дней после сдачи.
- Консультация по оптимизации существующих интеграций.
Как ускорить деплой с помощью webhook?
Комбинация ISR и Vercel Deploy Hook позволяет достичь времени обновления менее 2 секунд для контентных изменений. Полный деплой занимает около 5 минут и запускается только при структурных правках. Мы настраиваем логику так, чтобы каждый тип изменения обрабатывался оптимальным способом. Документация Contentful по webhooks
Избавьтесь от задержек и лишней нагрузки. Закажите настройку webhook-интеграции. Свяжитесь с нами для детальной оценки вашего сценария.







