← на головну

Інструкція по роботі з лендингами

Технічний гайд для розробника або Claude Code: як запустити, налаштувати, задеплоїти та доопрацювати будь-який із 5 лендингів. Усі 5 — на однаковому стеку, тож загальна частина спільна, а специфіка кожного варіанта — внизу.

Стек

Структура файлів

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

Конфіг перед запуском у трафік

Відкрити src/content/content.uk.js → об'єкт config і підставити реальні значення замість заглушок:

config: {
  variantId: "v1_price_qualifier",   // НЕ чіпати — ідентифікатор A/B-варіанта
  gtmId: "GTM-XXXXXXX",              // ← реальний GTM-контейнер
  crmEndpoint: "",                  // ← URL, куди POST-иться заявка (порожньо = симуляція успіху)
  ...
}

Трекінг подій (dataLayer)

Кожна сторінка пушить події у window.dataLayer; до кожної авто-підмішується variant_id, audience_segment, traffic_source (з UTM). GTM передає їх у GA4.

ПодіяКолиКлючові параметри
page_viewзавантаженняvariant_id, traffic_source, audience_segment
scroll_depth25/50/75/100%depth
block_viewблок у viewportblock_id
cta_clickклік по CTActa_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 (чек-лист)

  1. Контент — лише з наявних сторінок (Task 4 §2), нічого не вигадано.
  2. CTA — кожна кнопка має cta_id і веде до форми/Telegram; жодних «мертвих» елементів.
  3. Трекінг — усі події в dataLayer з правильними id; перевірено в GTM Preview.
  4. Техякість — 0 JS-помилок, INP < 200 мс, без оманливо-клікабельних елементів (анти-dead-click), mobile-first (зокрема in-app браузери Instagram/Facebook).
  5. Дизайн — кольори/шрифти/кнопки відповідають kukurudza.com.
  6. 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, верстку не чіпати.