Інструкція по роботі з лендингами
Технічний гайд для розробника або Claude Code: як запустити, налаштувати, задеплоїти та доопрацювати будь-який із 5 лендингів. Усі 5 — на однаковому стеку, тож загальна частина спільна, а специфіка кожного варіанта — внизу.
Стек
- Чистий статичний сайт: HTML + CSS + ванільний JS. Жодних рантайм-фреймворків, жодного build-кроку — відкривається як є.
- Шрифти й зображення — self-hosted у
public/(бренд Kukurudza). - Дизайн-токени (кольори, шрифти, відступи) — CSS-змінні у
src/styles/tokens.css. - Контент — у
src/content/content.uk.js(об'єктwindow.KZ): єдине джерело копірайту + конфіг. Видимий текст продубльовано вindex.html(статичний рендер).
Структура файлів
hN/
├─ index.html ← розмітка сторінки (видимий текст тут)
├─ src/
│ ├─ styles/
│ │ ├─ tokens.css ← кольори / шрифти / радіуси / відступи
│ │ └─ main.css ← усі стилі компонентів
│ ├─ content/
│ │ └─ content.uk.js ← window.KZ: config + копірайт (джерело правди)
│ └─ js/
│ ├─ tracking.js ← dataLayer-події (page_view, cta_click…)
│ ├─ form.js ← сабміт форми → lead_id → CRM
│ ├─ ui.js ← reveal-анімації, sticky CTA, count-up
│ └─ main.js ← ініціалізація (+ quiz.js у H4, segment.js у H5, countdown.js у H3)
└─ public/ ← img / fonts / video (бренд-асети)
Запуск локально
Будь-який статичний сервер. Найпростіше — Python (порт довільний):
# з розпакованої теки сайту
python3 -m http.server 8123
# → відкрити http://127.0.0.1:8123
Сайт треба відкривати через сервер (http://), а не подвійним кліком по файлу (file://) — інакше JS-модулі й шляхи до асетів можуть не завантажитись.
Деплой
Швидко (тимчасове демо) — Cloudflare Quick Tunnel
# 1) підняти локальний сервер
python3 -m http.server 8123 --directory ./hN
# 2) прокинути тунель (ОКРЕМИЙ HOME, щоб не читався чужий ~/.cloudflared/config.yml)
HOME=/tmp/cf-hN cloudflared tunnel --url http://127.0.0.1:8123 --no-autoupdate
# → у виводі зʼявиться публічний https://*.trycloudflare.com
⚠️ Ізольований HOME обовʼязковий. Без нього cloudflared може підхопити конфіг сусіднього тунелю й віддавати 404 замість сайту. Quick-тунелі ефемерні — живуть, поки крутиться процес.
Постійно (прод) — Cloudflare Pages
- Залити теку сайту як статичний проєкт (drag-and-drop або
wrangler pages deploy ./hN). - Або named-tunnel на власний домен (напр.
targetolog.corny.online) — потрібенCLOUDFLARE_API_TOKEN. - Сторінки під платний трафік — лишити
<meta name="robots" content="noindex, follow">.
Конфіг перед запуском у трафік
Відкрити src/content/content.uk.js → об'єкт config і підставити реальні значення замість заглушок:
config: {
variantId: "v1_price_qualifier", // НЕ чіпати — ідентифікатор A/B-варіанта
gtmId: "GTM-XXXXXXX", // ← реальний GTM-контейнер
crmEndpoint: "", // ← URL, куди POST-иться заявка (порожньо = симуляція успіху)
...
}
gtmId— поки заглушка, GTM не вантажиться (події пишуться лише вdataLayer). Підставити справжній контейнер, щоб події пішли в GA4.crmEndpoint— поки порожній, форма симулює успіх (нічого не надсилає). Вказати ендпоінт прийому заявки.- Телефон / Telegram / соцмережі також у
config— змінювати там.
Трекінг подій (dataLayer)
Кожна сторінка пушить події у window.dataLayer; до кожної авто-підмішується variant_id, audience_segment, traffic_source (з UTM). GTM передає їх у GA4.
| Подія | Коли | Ключові параметри |
|---|---|---|
page_view | завантаження | variant_id, traffic_source, audience_segment |
scroll_depth | 25/50/75/100% | depth |
block_view | блок у viewport | block_id |
cta_click | клік по CTA | cta_id, cta_position |
offer_view | показ ціни (H1, H3) | — |
quiz_step_view / _complete | кроки квіза (H4) | step_n, answer |
form_start / form_submit | фокус / відправка | lead_id (+ у CRM) |
Перевірка: відкрити консоль → window.dataLayer або GTM Preview. form_submit має віддавати lead_id, який далі звʼязує заявку→оплату в CRM (головна метрика тесту).
Definition of Done (чек-лист)
- Контент — лише з наявних сторінок (Task 4 §2), нічого не вигадано.
- CTA — кожна кнопка має
cta_idі веде до форми/Telegram; жодних «мертвих» елементів. - Трекінг — усі події в dataLayer з правильними id; перевірено в GTM Preview.
- Техякість — 0 JS-помилок, INP < 200 мс, без оманливо-клікабельних елементів (анти-dead-click), mobile-first (зокрема in-app браузери Instagram/Facebook).
- Дизайн — кольори/шрифти/кнопки відповідають kukurudza.com.
- noindex виставлено; UTM зчитуються у
traffic_source.
H1 — Ціна як кваліфікатор v1_price_qualifier
Середня довжина. Порядок: hero → кейси → програма-тизер → тарифи (ціна до форми) → спікери → форма → FAQ + sticky CTA. Має подію offer_view. Палітра — бренд-зелена (hero-відео тоновано через filter: hue-rotate у main.css). Реальні відгуки в блоці «Про нас постять».
H2 — Мінімальний односекційний лідоген v2_minimal_leadgen
Один екран, форма в hero, без ціни. Десктоп — 2 колонки (офер / форма), мобайл — офер → форма → стрічка спікерів. Найпростіший для правок.
H3 — Доказ-першим v3_proof_first
Той самий контент, що в H1, але порядок: hero → кейси → спікери → відгуки → програма → ціна (внизу) → форма. Тестується саме порядок блоків. countdown.js не потрібен (це не urgency-варіант).
H4 — Квіз-воронка v4_quiz
Логіка квіза — src/js/quiz.js. 3 кроки: рівень → ціль → контакт. Відповідь Кроку 1 пишеться в audience_segment ліда. Ціни на сторінці немає. Події quiz_step_view/_complete. Відкривати з #quiz, щоб одразу до квіза.
H5 — Модульний лендинг під сегмент v5_modular_segment
Логіка сегментів — src/js/segment.js + конфіг segments у content.uk.js. Hero/біль/кейс підміняються за URL: ?segment=beginner|practitioner|owner|freelancer (без параметра — дефолт). Щоб додати/змінити офер сегмента — правити лише об'єкт segments, верстку не чіпати.