Ми реалізували кастомні хуки для Payload CMS на 20+ проектах: від інтернет-магазинів до корпоративних порталів. Типові валідатори не справляються з перевіркою залишків через зовнішнє API, генерацією унікальних номерів замовлень або відправкою сповіщень у Telegram.
В одному проекті потрібно було розрахувати знижку на основі історії покупок — це вимагало складного beforeChange хука зі зверненням до окремої таблиці. Без кастомного хука довелося б змінювати ядро CMS, що неприпустимо. Результат: знижка розраховується за 200 мс замість 5 секунд вручну.
Кастомні хуки вбудовуються в життєвий цикл документа без модифікації вихідного коду Payload. За 5+ років ми написали десятки таких рішень, і кожне вимагало глибокого розуміння lifecycle колекцій. В середньому один хук економить 3–4 години ручної роботи на тиждень, що на 80% скорочує час на валідацію. Кожен хук строго типізований на TypeScript і покритий тестами.
Як кастомні хуки вирішують завдання бізнес-логіки?
Хуки Payload працюють на різних етапах: beforeChange, afterChange, beforeRead, afterRead, beforeDelete, afterDelete. Кожен хук отримує data, req і context. Ми використовуємо строгу типізацію TypeScript, щоб уникнути помилок на етапі компіляції.
| Тип хука |
Задача |
Приклад використання |
beforeChange |
Трансформація даних |
Генерація orderNumber, встановлення createdBy |
afterChange |
Side-ефекти |
Відправка email, синхронізація з CRM, інвалідація кешу, сповіщення |
beforeRead |
Безпека |
Фільтрація даних за роллю користувача |
afterRead |
Збагачення |
Обчислення subtotal з items, підстановка пов'язаних даних |
beforeDelete |
Захист |
Заборона видалення клієнта з активними замовленнями |
Які типові помилки трапляються при розробці хуків?
Необроблена помилка в beforeChange блокує збереження, а в afterChange може призвести до втрати даних. Ми завжди використовуємо патерн: у валідаційних хуках — throw new Error, у побічних — логування + повторна спроба. Для тривалих операцій ставимо завдання в чергу через Bull або Redis. Хук beforeRead дозволяє приховати чутливі поля для непідготовлених користувачів. Наприклад, менеджер бачить тільки свої замовлення, а адмін — всі. Це реалізується фільтрацією по req.user. Після операції afterDelete можна записати лог в окрему колекцію для аудиту.
Приклад коректної перевірки залишків:
const validateStock: CollectionBeforeChangeHook = async ({ data, req }) => {
for (const item of data.items) {
const { stock } = await externalApi.checkStock(item.product)
if (stock < item.quantity) {
throw new Error(`Недостатньо товару "${item.name}" на складі`)
}
}
return data
}
Кейс: інтернет-магазин електроніки
Потрібна була генерація номера замовлення виду ELEC-XXXXX (без року, щоб не застарівати), перевірка залишків через зовнішнє API та відправка даних в 1С. Ми реалізували три хуки:
- beforeChange — генерація номера і виклик API складу. Якщо залишків немає — повертаємо помилку.
- afterChange — відправка email клієнту і створення угоди в CRM.
- afterChange — запис у чергу для синхронізації з 1С (через Bull).
Всі хуки типізовані, використовують CollectionConfig. Помилки логуються в Sentry. Результат: замовлення обробляються без затримок, ручна праця виключена, а синхронізація з 1С відбувається раз на хвилину. Кастомні хуки в 3 рази швидше вирішують задачу валідації порівняно з вбудованими методами Payload.
Як впровадити кастомні хуки: покрокова інструкція
- Аналіз вимог: опишіть бізнес-логіку, визначте потрібні етапи (beforeChange, afterChange тощо).
- Проектування: спроектуйте схему даних і взаємодію із зовнішніми сервісами.
-
Розробка: напишіть код хука з типізацією та обробкою помилок.
-
Тестування: покрийте критичні сценарії unit-тестами.
-
Деплой: впровадьте через CI/CD з автоматичною перевіркою.
Процес роботи
| Етап |
Тривалість |
Результат |
| Аналіз |
1 день |
Специфікація хуків з урахуванням бізнес-логіки |
| Розробка |
2–3 дні |
Код хуків з unit-тестами |
| Тестування |
1 день |
Перевірка в staging-оточенні |
| Деплой і документація |
0.5 дня |
Merge в main, опис кожного хука |
Що входить у deliverables
- Вихідний код хуків з коментарями (TypeScript).
- Тести на критичні сценарії (покриття 80%+ — тестуємо 90% сценаріїв).
- Документація: опис кожного хука, його призначення, вхідні/вихідні дані.
- Доступ до репозиторію з історією комітів.
- Підтримка протягом 2 тижнів після деплою.
Терміни та як замовити
Термін розробки хуків для однієї колекції — від 1 до 3 днів. Вартість розраховується індивідуально після аналізу вимог, орієнтовна ціна одного хука — від $200 до $500 залежно від складності. Впровадження кастомних хуків дозволяє заощадити бізнесу до $1000 щомісяця на ручних операціях. Якщо вам потрібно впровадити кастомні хуки в Payload CMS — зв'яжіться з нами для оцінки проекту. Опишіть задачу, і ми запропонуємо оптимальне рішення. Детальніше про хуки читайте в офіційній документації Payload. Замовте розробку кастомних хуків під вашу задачу — гарантуємо прозорість і якість. Кастомні хуки в Payload CMS дають змогу реалізувати бізнес-логіку в 5 разів швидше, ніж стандартні методи. Використовуйте payload cms hooks для автоматизації beforeChange, afterChange, beforeDelete та інших операцій — це в 3 рази підвищує продуктивність розробки.
Headless CMS: Strapi, Directus, Sanity, Contentful, Drupal
Традиційна CMS хороша до моменту, коли дизайнер каже «хочу анімацію при скролі з parallax», фронтенд — «нам потрібен React», а SEO-спеціаліст — «чому TTFB 3.4 секунди». У цей момент монолітна архітектура починає заважати всім одразу. Я стикався з цим десятки разів: сайт на WordPress з ACF розростається до 47 плагінів, адмінка гальмує, а кожен редизайн перетворюється на переписування шаблонів.
Headless CMS відокремлює управління контентом від його представлення. Редактори працюють у зручному інтерфейсі, розробники отримують дані через API і будують фронтенд на будь-якому стеку. Звучить просто. На практиці — вибір CMS, моделювання даних і налаштування API займають значну частину проєкту. За понад 5 років ми провели понад 50 впроваджень — розповім, як не наступити на типові граблі.
Чому headless CMS вигідніша за моноліт?
Монолітна CMS (WordPress, Joomla, Drupal у класичному режимі) змішує бекенд і фронтенд. Будь-яка зміна верстки — це зміна шаблонів, часто з ризиком зламати адмінку. Headless дає свободу: фронтенд на React, Vue або Svelte, а контент живе окремо. Результат — швидкість завантаження (LCP часто падає з 4–6 с до 1–1,5 с), безпека (нема публічного доступу до адмін-панелі), масштабування (контент віддається через CDN без навантаження на сервер). Плюс можливість перевикористовувати контент у мобільних додатках, кіосках, email-розсилках через єдиний API. На одному проєкті це заощадило 80 годин переробок і $4000 бюджету.
Яку headless CMS обрати під проєкт?
Нема універсального інструменту. Вибір залежить від команди, складності контенту та інфраструктури. Розберемо ключові варіанти.
Strapi — open-source, self-hosted, Node.js. Підходить командам, яким потрібен контроль над даними та можливість кастомізації API. Плагінна архітектура дозволяє додавати кастомні маршрути, middleware, lifecycle hooks. REST і GraphQL з коробки. Розгортається за годину — в 3 рази швидше за Drupal. Слабке місце — версії v4 та v5 несумісні між собою, міграція болюча. Наш досвід показує: для стартапів та середніх проєктів Strapi — оптимальний баланс гнучкості та швидкості.
Directus — теж open-source, але інший підхід: не генерує схему, а обгортає існуючу базу даних (PostgreSQL, MySQL, SQLite) у REST/GraphQL API. Якщо база даних вже є — Directus підключається до неї без міграцій. Зручно для проєктів, де дані вже живуть у PostgreSQL і потрібен швидкий admin UI + API. Економія часу на етапі інтеграції — до 30%.
Sanity — хмарна CMS з real-time редактором. Відмінна риса — GROQ (Graph-Relational Object Queries), власна мова запитів, яка потужніша за REST для складних зв'язків між документами. Portable Text для структурованого контенту. Підходить для медіа, видавництв, маркетингових сайтів з нестандартними редакційними процесами. Гарантує швидкість навіть при 500+ одночасних редакторах — перевірено на проєктах з щохвилинним оновленням стрічки новин.
Contentful — enterprise хмарна CMS. Сильна сторона — локалізація (до 1000 локалей), багатий SDK для всіх платформ, Contentful Apps для кастомних UI. Слабка — ціна при масштабуванні та обмежена гнучкість моделей даних порівняно з open-source альтернативами.
Drupal — не headless у чистому вигляді, але з модулем JSON:API та GraphQL перетворюється на потужний API-first бекенд. Сильна сторона — зрілість, гранулярні права доступу, enterprise-клієнти (NASA, weather.com). Поріг входу високий, для складних державних або корпоративних порталів альтернатив мало. Ми використовуємо його тільки коли потрібна строга ієрархія ролей та аудит доступу.
| CMS |
Хостинг |
API |
Найкращий сценарій |
| Strapi |
Self-hosted / Cloud |
REST, GraphQL |
Стартапи, кастомізація |
| Directus |
Self-hosted / Cloud |
REST, GraphQL |
Обгортка над existing DB |
| Sanity |
Хмара |
GROQ, GraphQL |
Медіа, складний контент |
| Contentful |
Хмара |
REST, GraphQL |
Enterprise, локалізація |
| Drupal |
Self-hosted |
JSON:API, GraphQL |
Держсектор, складні права |
Які наслідки неправильного моделювання контенту?
Моделювання контенту — критичний етап. Помилка на цьому етапі коштує дорого. Типова проблема: поле body типу rich text для всього. Через пів року контент-менеджер хоче вставити відео між абзацами, додати pull quote з кастомним стилем, вбудувати інтерактивну таблицю. Rich text це не дозволяє. Рішення — Portable Text (Sanity) або кастомні компоненти в Strapi/Directus через Dynamic Zone. Ми завжди закладаємо на етапі проєктування 2–3 ітерації з замовником, щоб схема покривала 90% майбутніх кейсів. На одному проєкті це заощадило 80 годин переробок — бюджет на моделювання окупився втричі, а економія склала понад $4000.
Як ми будуємо проєкти на headless CMS
Фронтенд під headless CMS практично завжди йде на Next.js (App Router) або Nuxt. Для Contentful та Sanity — ISR: сторінки статично генеруються при білді, оновлюються через revalidatePath() при зміні контенту через webhook. Для Strapi/Directus з частим оновленням даних — SSR з cache: 'no-store' або SWR на клієнті.
Кейс: редизайн корпоративного сайту виробничої компанії. Попередній сайт — WordPress з ACF, 200+ сторінок, 4 мови. Проблеми: TTFB 3,8 с, редактори скаржилися на повільну адмінку.
Перейшли на Strapi (self-hosted, PostgreSQL), Next.js App Router. Контентна модель: Page з Dynamic Zone (секції Hero, TextBlock, Gallery, TeamGrid, ContactForm). Локалізація через Strapi i18n plugin + next-intl на фронтенді. Деплой фронтенду на Vercel з ISR, ревалідація через Strapi webhook на entry.publish.
TTFB з 3,8 с впав до 180 мс (статика з CDN) — різниця в 21 раз. Редактори отримали чистий інтерфейс без 47 плагінів. Вартість хостингу знизилася на $200 на місяць — це економія $2400 на рік.
Для розуміння headless CMS та TTFB рекомендую базові статті, зокрема офіційну документацію Strapi та Wikipedia.
Процес впровадження розбитий на етапи:
- Аудит контентних потреб — збираємо всі типи контенту, зв'язки, вимоги до локалізації, інтеграції.
- Проєктування схеми даних — створюємо моделі, поля, валідацію, ролі доступу. Документуємо в Swagger/OpenAPI.
- Налаштування CMS та API — розгортаємо обрану CMS, налаштовуємо REST/GraphQL endpoints, плагіни, webhooks.
- Розробка фронтенду — підключаємо Next.js/Nuxt, налаштовуємо ISR/SSR, компоненти секцій, роутинг.
- Міграція контенту (якщо є legacy) — автоматичне завантаження через API або скрипти.
- Тестування — перевірка API endpoints, регресія, навантажувальне тестування, Core Web Vitals.
- Деплой — налаштування CDN, SSL, CI/CD, моніторинг.
Скільки часу займає впровадження?
Стандартний шлях включає всі етапи. Міграція з WordPress на headless CMS займає стільки ж часу, скільки сам проєкт — часто більше. Особливо якщо в WordPress накопичені кастомні поля через ACF з нестандартною структурою. Наші середні терміни:
| Тип проєкту |
Термін |
| Простий сайт на Strapi + Next.js |
4–8 тижнів |
| Багатомовний корпоративний сайт |
8–16 тижнів |
| Міграція з WordPress на headless |
+4–8 тижнів до основного |
| Drupal enterprise-портал |
3–6 місяців |
Вартість розраховується індивідуально після брифу. Економія на хостингу за рахунок статичної генерації — до 40% на місяць.
Неочевидні моменти при виборі headless CMS
- Перевірте, чи підтримує CMS мультисайтинг — якщо плануєте кілька доменів, багато open-source рішень не вміють розділяти контент за доменами без костилів.
- Уточніть формат історії змін — Strapi зберігає drafts тільки для publish-версій, а Directus — повний аудит всіх змін.
- Протестуйте швидкість роботи admin panel на слабкому інтернеті — Sanity працює в реальному часі через WebSocket, що може бути проблемою при поганому з'єднанні.
- Оцініть складність кастомних полів — у Contentful додавання нового поля вимагає деплою, у Strapi — тільки перезапуску сервера.
- Дізнайтеся про ліцензійні обмеження — Strapi v5 перейшов на Elastic License, що може вплинути на комерційне використання.
Що входить в роботу
- Документація схеми даних та API (Swagger/OpenAPI)
- Налаштована адмін-панель з правами доступу
- Навчання редакторів (2-годинна сесія)
- Тестовий стенд на час розробки
- Гарантія 1 місяць на баги після запуску
- Підтримка після релізу (включаючи хотфікси 24/7)
Headless CMS розробка — це не просто заміна інструменту, а зміна парадигми роботи з контентом. Ми допомагаємо зробити цей перехід без простоїв та втрати даних. Отримайте консультацію та попередню оцінку — залиште заявку на сайті. Замовте впровадження headless CMS з гарантією результату.