Перейти до вмісту
← Назад до блогу

Фабрика лендінгів: 20 шаблонів, 200 сторінок, один рендер

У лютому 2025 клієнт попросив 200 лендінгів на 40 міст і п'ять послуг. Він надіслав таблицю з містом, послугою, ціною та телефоном. Хотів, щоб кожна сторінка виглядала локальною та ранжувалась. Я оцінив два тижні за систему, а не за сторінки. Він спитав, звідки візьмуться сторінки. Я показав, як рядок CSV стає живим URL за 90 секунд. Він схвалив фабрику.

Скріншот лога імпорту CSV 2025-02-18 14:32: 200 рядків імпортовано, 200 сторінок згенеровано, sitemap.xml перезібрано на 200 url, збірка 94 секунди.

Три таблиці, що тримають фабрику

Я тримаю фабрику в трьох таблицях, а не у файлах. Файли ламаються, коли лічильник росте.

  • landing_templates тримає 15–20 шаблонів. Кожен шаблон називає блоки по порядку: hero, features, pricing, testimonials, faq, cta та опційно gallery або map. Порядок блоків зберігаю як JSON, а не кодом.
  • content_blocks тримає 5–10 варіантів на блок. Варіант hero для логістики показує нічний док. Варіант для клінік показує хол. Кожен варіант несе слоти тексту: заголовок, підзаголовок і текст CTA.
  • landing_pages тримає рядок на живу сторінку з містом, послугою, id шаблону, id варіантів блоків і SEO-полями. Таблиця ab_test_variants тримає рядок на тест із часткою 50/50 та флагом переможця.

Один рендер читає таблиці й пише HTML. Я зву його LandingRenderer. Він бере рядок landing_pages, вантажить шаблон і варіанти блоків, заповнює слоти з рядка й пише сторінку. Той самий рендер пише sitemap і RSS. Без другої системи.

Як сторінка збирається з рядка

Клієнт вантажить CSV із колонками town, service, price, phone, hero image. Сервер перевіряє таблицю, вставляє рядки в landing_pages і бере шаблон за послугою та варіант блока за містом. Ціна та телефон заповнюють слоти. Картинка геро йде в галерею, коли є. Задача кличе LandingRenderer на кожен новий рядок і пише файли в /l/[town]/[service]. Карта сайту перезбирається після останнього запису. 200 сторінок виходять без деплою. Пайплайн за цими записами я теж скоротив: з 8 хвилин до 90 секунд на деплой, кроки розбираю у пості Як я скоротив деплой з 8 хвилин до 90 секунд.

  • Масовий імпорт тягне 200 рядків менш ніж за дві хвилини на інстансі 512 МБ.
  • Детект дублів блокує трійку місто+послуга+шаблон. Друге завантаження оновлює, не дублює.
  • A/B-варіанти ділять рядок із суфіксом /a та /b. Поділ трафіку на edge через cookie та 302, а не дублі URL.
  • SEO чистий: одна сторінка — один title, один description, один canonical, один hreflang коли треба.

Чому шаблони б'ють сторінки

Зміна блока шаблону оновлює всі сторінки, що його використовують. Я змінив копію блока FAQ раз і 84 сторінки оновились одним запитом. Якби міняв сторінки, правив би 84 файли. Шаблони дають одне місце покращення. Варіанти дають багато облич.

Я тримаю 15–20 шаблонів, бо п'ять послуг на чотири типи міст покривають більшість без тісноти вибору. Тримаю 5–10 варіантів блока, бо десять геро-варіантів на десять pricing-варіантів уже дають сотню комбо. Більше варіантів ростить вибір без росту конверсії. Кожен варіант, що лишився, я усе одно читаю за фіксованим списком точок, і він лежить у пості Шаблон CRO-аудиту: 12 точок, що рухають виторг.

Що міряю

Кожна сторінка пише візити, відправки форм і id варіантів, що рендерились. Через десять днів порівнюю hero-варіанти всередині одного шаблону й гашу два нижні. Через тридцять порівнюю шаблони всередині послуги та ставлю на паузу нижній шаблон. Фабрика вчиться, доки ти продаєш. Щоб вчитися, потрібна аналітика, зв'язана з грошима: конвеєр розбираю у пості CRO як конвеєр: від аналітики до виручки.

Як скопіювати фабрику в малому

Збери три таблиці, потім рендер. Засій три шаблони та два варіанти на блок. Імпортуй десять рядків із CSV. Віддай десять сторінок. Дивись на карту сайту. Додавай варіанти, коли реальні сторінки просять, а не раніше.

Прочитали? До справи

Ці методи я застосовую на платних проєктах. Подивіться, у скільки це обходиться.