Чому 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-інтеграції. Зв'яжіться з нами для детальної оцінки вашого сценарію.







