(function () { 'use strict'; var ENDPOINT = '/wp-json/sprut/v1/ceiling-lead'; var METRIKA_ID = 108703490; /* * План бесплатного привлечения трафика * 10 бизнесовых вопросов → персональные шаги + лайфхак → разбор * Контекст 2025–2026: денег мало, реклама дорожает, бизнесы закрываются */ var questions = [ { id: 'role', text: 'Кто вы?', options: [ { key: 'expert', text: 'Эксперт / специалист (психолог, коуч, врач, юрист…)' }, { key: 'local', text: 'Услуги / локальный бизнес (салон, ресторан, мероприятия…)' }, { key: 'seller', text: 'Селлер маркетплейса (WB, Ozon и т.п.)' }, { key: 'product', text: 'Товар / производство (светильники, косметика, своё…)' }, { key: 'online', text: 'Онлайн-услуги / инфобизнес' }, { key: 'other', text: 'Другое — но клиенты тоже нужны' }, ], }, { id: 'mode', text: 'Как устроен ваш бизнес?', options: [ { key: 'online', text: 'В основном онлайн' }, { key: 'offline', text: 'В основном офлайн (точка, выезд, зал)' }, { key: 'both', text: 'И онлайн, и офлайн' }, ], }, { id: 'site', text: 'Есть ли у вас сайт, на который можно привести человека?', options: [ { key: 'none', text: 'Нет сайта — или «лежит мёртвый»' }, { key: 'card', text: 'Есть визитка: красиво, но заявок почти нет' }, { key: 'work', text: 'Сайт рабочий: звонят / пишут / оставляют заявки' }, ], }, { id: 'channel', text: 'Откуда сейчас приходят почти все клиенты?', options: [ { key: 'word', text: 'Сарафан и знакомые — системы нет' }, { key: 'ads', text: 'Реклама / маркетплейс / одна платная площадка' }, { key: 'social', text: 'Соцсети и контент (когда успеваю вести)' }, { key: 'search', text: 'Поиск и сайт' }, { key: 'mix', text: 'Микс каналов — но всё равно мало или скачет' }, ], }, { id: 'now', text: 'Сколько примерно заявок или клиентов в месяц сейчас?', options: [ { key: '0_5', text: 'Почти ноль или до 5 — тревожно' }, { key: '6_15', text: '6–15 — держимся, но на грани' }, { key: '16_40', text: '16–40 — есть поток, хочется стабильнее и больше' }, { key: '40p', text: 'Больше 40 — но потолок уже чувствуется' }, ], }, { id: 'want', text: 'Сколько хочется через 2–3 месяца (реалистично, без сказки)?', options: [ { key: 'x2', text: 'Примерно в 1,5–2 раза больше, чем сейчас' }, { key: 'stable', text: 'Не «вау», а стабильно каждый месяц — без ям' }, { key: 'fill', text: 'Заполнить запись / выйти на понятный план продаж' }, { key: 'scale', text: 'Масштаб: команда, точка роста, не только «я руками»' }, ], }, { id: 'nets', text: 'Где вы уже «есть» в сети? (что реально ведёте, не «аккаунт открыт»)', options: [ { key: 'none', text: 'Почти нигде — или всё заброшено' }, { key: 'one', text: 'Одна площадка (TG / VK / MAX / Instagram)' }, { key: 'few', text: 'Две–три сети, но без системы и ритма' }, { key: 'ok', text: 'Несколько точек есть, контент более-менее идёт' }, ], }, { id: 'content', text: 'Как у вас с контентом?', options: [ { key: 'none', text: 'Не веду — нет сил, времени или смысла «просто постить»' }, { key: 'chaos', text: 'Хаос: то пачка постов, то тишина на недели' }, { key: 'hard', text: 'Тяну сам(а), но выгораю и ненавижу это' }, { key: 'ok', text: 'Есть ритм — хочется усилить и привязать к заявкам' }, ], }, { id: 'pain', text: 'Что сильнее всего жмёт прямо сейчас?', options: [ { key: 'few', text: 'Мало клиентов / заявок — касса проседает' }, { key: 'unstable', text: 'То густо, то пусто — невозможно планировать' }, { key: 'ads', text: 'Реклама жрёт деньги, а толку мало' }, { key: 'invisible', text: 'Нас не находят — будто нас нет в интернете' }, { key: 'start', text: 'Не знаю, с чего начать, чтобы не слить последние' }, ], }, { id: 'hook', text: 'Если через 90 дней заявки шли бы стабильнее без ежедневной паники — что для вас важнее всего?', options: [ { key: 'site', text: 'Сайт, который реально приводит людей (не «визитка для галочки»)' }, { key: 'content', text: 'Контент без выгорания — чтобы не жить в сторис' }, { key: 'presence', text: 'Присутствие там, где клиент уже ищет решение' }, { key: 'system', text: 'Система «настроил — работает», а не героизм по ночам' }, ], }, ]; var LIFEHACKS = { start_ig: { title: 'Где: Instagram + Threads — заведите и начните комментировать', why: 'Зачем: если вас нет в Instagram и Threads, клиент листает ленту конкурентов и вас просто не существует. Комменты «как эксперт» некуда писать.', what: 'Что сделать на этой неделе: 1) Откройте Instagram и Threads под имя/бренд (30–40 мин: кто вы, кому помогаете, ссылка на сайт или «написать»). 2) Каждый день 15 минут заходите к 5–8 специалистам вашей ниши в Instagram и пишите комментарии не «класс!», а разбор: проблема → ваша мысль → 1 польза. То же можно дублировать в Threads.', forWhat: 'Зачем так: чужие подписчики читают сильные комменты и переходят к вам — бесплатный прогрев без рекламы. Сначала дом (аккаунты), потом гости (комменты).', example: 'Пример: психолог в Instagram под постом коллеги про выгорание пишет короткий разбор + 1 шаг. Человек из чужой аудитории подписывается. Селлер — коммент под разбором карточек в нишевом блоге.', }, comments: { title: 'Где: Instagram (и Threads) — комменты как витрина, 15 мин/день', why: 'Зачем именно там: в Instagram и Threads люди ещё читают комментарии. Реклама дорожает, клики режут — а сильный коммент видят бесплатно. Это чужая аудитория без оплаты за охват.', what: 'Что сделать: каждый день 15 минут только в Instagram (по желанию — Threads): зайдите к 5–8 аккаунтам/пабликам вашей ниши. Под их постами пишите разбор, не «огонь»: проблема → ваша мысль → 1 конкретная польза. В шапке профиля Instagram должно быть ясно, кто вы и куда писать / ссылка на сайт.', forWhat: 'Результат: вас узнают до того, как раскачаете свою ленту. Подписки и обращения приходят из чужих постов в Instagram — особенно пока свой контент ещё слабый.', example: 'Пример в Instagram: селлер под постом про карточки разбирает ошибку; мастер красоты отвечает на «какой уход после…» в чужом посте. Не в «какой-то сети вообще» — именно в комментариях Instagram (и Threads).', }, demand_site: { title: 'Где: ваш сайт + нарезка в Telegram или VK', why: 'Зачем: люди уже ищут ответы в поиске и в чатах. Если ответа нет на вашем сайте — заявку заберёт тот, кого найдут в Яндексе или в закрепе у конкурента.', what: 'Что сделать: раз в неделю один вопрос, который клиенты уже задают (Директ Instagram, чат Telegram, отзывы, «а сколько стоит…»). Короткий ответ положите на сайт (статья или блок). Потом короткую нарезку — в ваш Telegram-канал или VK (куда вы реально ведёте людей), со ссылкой на сайт.', forWhat: 'Через 2–3 месяца сайт начинает приводить из поиска, а посты в Telegram/VK подогревают тех, кто уже с вами. Пока конкуренты крутят сторис в пустоту — у вас закладка под спрос.', example: 'Пример: вопрос «сколько сеансов нужно…» → страница на сайте → пост в Telegram со ссылкой. Или «как выбрать свет для кухни» → сайт + VK. Сеть для нарезки = та, где у вас уже есть люди (Telegram или VK), якорь всегда сайт.', }, maps_qr: { title: 'Где: Яндекс.Карты — QR + подарок за отзыв', why: 'Зачем именно Карты: офлайн-клиент ищет «рядом» и смотрит отзывы. Без карточки и отзывов в Яндекс.Картах вас обходят, даже если вы лучше. Реклама это не заменит.', what: 'Что сделать: сделайте QR-код, который ведёт на вашу карточку в Яндекс.Картах. Повесьте на стойку / в чек / на зеркало. За оставленный отзыв на Картах — киндер, пробник, пирожное, напиток. Не «оставьте отзыв пожалуйста», а обмен.', forWhat: 'Новые люди открывают Яндекс.Карты, видят отзывы и звонят/едут. Бюджет на охват не нужен — нужен ритуал после каждой услуги.', example: 'Салон: пробник за отзыв в Яндекс.Картах. Ресторан: пирожное. Детский праздник: сюрприз ребёнку. Парикмахерская: мини-уход. Площадка одна — Яндекс.Карты, не «соцсети вообще».', }, aftercare_link: { title: 'Где: ваш сайт (или мини-страница) — ссылка после услуги', why: 'Зачем: бумажная визитка теряется. Сарафан работает, только если подруге есть куда перейти. Иначе «там была классная» умирает через день.', what: 'Что сделать: QR или короткая ссылка на ваш сайт / мини-страницу (запись, фото, как добраться, контакты). Отдать клиенту в телефон сразу после услуги — показать QR или отправить ссылку. Не «ищите нас в интернете».', forWhat: 'Человек и его подруга попадают сразу на ваш сайт — повторная запись и рекомендация без поиска «как вас найти».', example: 'После стрижки/массажа/праздника: QR на сайт → запись. Подруга получает готовую ссылку, а не квест по Instagram.', }, }; var ROLE_LABEL = { expert: 'эксперту', local: 'локальному бизнесу', seller: 'селлеру', product: 'производству / товарному бизнесу', online: 'онлайн-бизнесу', other: 'вашему делу', }; var state = { index: 0, answers: {}, advancing: false, planTitle: '', }; function esc(s) { var d = document.createElement('div'); d.textContent = s == null ? '' : String(s); return d.innerHTML; } function goal(name) { try { if (typeof ym === 'function') ym(METRIKA_ID, 'reachGoal', name); } catch (e) {} } function $(sel, root) { return (root || document).querySelector(sel); } function showScreen(name) { var root = $('#scq-root'); if (!root) return; root.querySelectorAll('.scq-screen').forEach(function (el) { el.classList.toggle('is-active', el.getAttribute('data-screen') === name); }); } function stepHtmlParts(why, what, forWhat, example) { var html = ''; if (why) html += '

' + esc(why) + '

'; if (what) html += '

' + esc(what) + '

'; if (forWhat) html += '

' + esc(forWhat) + '

'; if (example) html += '

' + esc(example) + '

'; return html; } function pickLifehack(a) { var mode = a.mode; var noPresence = a.nets === 'none'; var weakPresence = a.nets === 'none' || a.nets === 'one'; var hacks = []; if (mode === 'offline') { hacks.push(LIFEHACKS.maps_qr, LIFEHACKS.aftercare_link); } else if (mode === 'online') { if (noPresence || weakPresence) { hacks.push(LIFEHACKS.start_ig, LIFEHACKS.demand_site); } else { hacks.push(LIFEHACKS.comments, LIFEHACKS.demand_site); } } else { /* both */ if (noPresence || weakPresence) { hacks.push(LIFEHACKS.start_ig, LIFEHACKS.maps_qr); } else { hacks.push(LIFEHACKS.comments, LIFEHACKS.maps_qr); } } return hacks; } function buildPlan(a) { var steps = []; var roleWord = ROLE_LABEL[a.role] || 'вашему бизнесу'; /* 1. Сайт */ if (a.site === 'none') { steps.push({ must: true, title: 'Сделать сайт — якорь трафика', html: stepHtmlParts( 'Зачем: без сайта вы арендуете клиентов у рекламы, маркетплейса и чужих лент. Выключили бюджет / упали охваты — касса встала. В стране, где у людей мало денег, платный клик часто не окупается.', 'Что сделать: посадочная или сайт, куда можно привести человека: кто вы, кому помогаете, что получить, телефон/заявка. Не «визитка для галочки» — точка входа.', 'Зачем именно сейчас: сайт работает месяцами. Пока другие ждут сезона, вы закладываете место, куда ведёте бесплатный и тёплый трафик.', 'Пример: эксперт — страница услуги + ответы на частые страхи. Салон — запись и цены. Селлер — витрина вне кабинета МП + связь напрямую.' ), }); } else if (a.site === 'card') { steps.push({ must: true, title: 'Переделать сайт из визитки в точку заявок', html: stepHtmlParts( 'Зачем: красиво ≠ заявки. Если непонятно, что делать дальше, человек уходит — а вы уже потратили внимание (своё или рекламное).', 'Что сделать: оффер под боль «мало клиентов / не знаю, подойдёт ли», форма или телефон, ответы на вопросы, которые уже задают, до/после или кейсы.', 'Зачем: каждый визит на сайт должен давать шанс на контакт. Иначе трафик в пустоту — в кризис это убийство маржи.', 'Пример: вместо «о нас» — «если у вас … — вот 3 шага / запись». Кнопка звонка выше сгиба на телефоне.' ), }); } else { steps.push({ must: true, title: 'Усилить сайт контентом под поиск', html: stepHtmlParts( 'Зачем: рабочий сайт — уже капитал. Но если на нём тишина, вас находят только те, кто уже знает имя. Остальные уходят к конкуренту в выдаче.', 'Что сделать: регулярные материалы под реальные вопросы клиентов — на сайт, не только в сторис.', 'Зачем: заявки начинают идти не только с рекламы и сарафана. Это закладка под рост, пока рынок сжимается.', 'Пример: один разбор вопроса клиента в неделю = через квартал пачка страниц, которые приводят сами.' ), }); } /* 2. Сети */ if (a.nets === 'none') { steps.push({ must: true, title: 'Завести точки присутствия (Instagram + Threads / VK + Telegram)', html: stepHtmlParts( 'Зачем: если вас нет в сети, клиент выбирает того, кого видит. «Хороший специалист без следа» в 2026 проигрывает среднему с карточками и постами.', 'Что сделать: не «все сети мира». Минимум: Instagram + Threads (для онлайна/экспертов) или VK + Telegram/MAX + Яндекс.Карты (для офлайна). Оформить и начать жить.', 'Зачем: без точек некуда вести контент и лайфхаки. Сначала дом, потом гости.', 'Пример: сегодня аккаунты и ссылка на сайт. На этой неделе — первые 5 экспертных комментов / первый QR на карты.' ), }); } else if (a.nets === 'one') { steps.push({ must: true, title: 'Добавить вторую площадку, где сидит ваш клиент', html: stepHtmlParts( 'Зачем: одна сеть = одна точка отказа. Алгоритм просел / аккаунт завис — поток обнулился.', 'Что сделать: добавить недостающую (часто Instagram↔Threads, VK↔Telegram, для локали — Карты). Вести из одного контент-контура, не геройствовать вручную на каждой.', 'Зачем: страховка и больший охват без удвоения работы — если контент генерируется в систему.', 'Пример: только TG → добавить VK или Instagram. Только инста → Threads + сайт. Только МП → свой канал вне кабинета.' ), }); } else if (a.nets === 'few') { steps.push({ must: true, title: 'Собрать сети в одну систему, а не зоопарк', html: stepHtmlParts( 'Зачем: дыры между площадками = потерянные заявки. Пост в одной сети, тишина в другой — клиент думает, что вы «неактивны».', 'Что сделать: один смысл → адаптация под каждую сеть → ссылка на сайт/запись. Ритм важнее героизма.', 'Зачем: заселять себя там, где человек принимает решение, без выгорания.', 'Пример: разбор кейса на сайт → коротко в TG → пост в VK → коммент-витрина в Instagram.' ), }); } else { steps.push({ must: true, title: 'Привязать сети к заявкам, а не к «охватам»', html: stepHtmlParts( 'Зачем: в жопе рынка охваты без заявок — дорогое самоуспокоение. Лайки не платят аренду.', 'Что сделать: в каждом профиле и почти в каждом посте — куда написать / позвонить / оставить заявку. Цель = контакт.', 'Зачем: присутствие начинает кормить кассу, а не только эго.', 'Пример: закреп «как записаться», сторис с кнопкой, пост → сайт, а не «просто красиво».' ), }); } /* 3. Автоконтент */ if (a.content === 'none' || a.content === 'chaos' || a.content === 'hard') { steps.push({ must: true, title: 'Автоматизировать генерацию контента', html: stepHtmlParts( 'Зачем: вручную «тащить контент» в 2026 — путь к выгоранию и закрытию. Нет сил постить → вас снова не видно → снова нет клиентов. Круг.', 'Что сделать: контур: темы из реальных вопросов клиентов → тексты на сайт → нарезка в сети. Не становиться блогером — поставить систему, которая пишет и раскладывает за вас.', 'Зачем автоматизация: чтобы присутствие не зависело от вечерней силы воли. Пока другие страдают и ждут погоды, у вас идёт закладка империи.', 'Пример: один поток тем → статьи на сайт + посты в сети. Вы правите смысл, система (или помощник) закрывает объём — без ежедневного героизма.' ), }); } else { steps.push({ must: true, title: 'Усилить генерацию и посадить её на сайт', html: stepHtmlParts( 'Зачем: ритм уже есть, но сторис сгорают за сутки. Сайт и поиск живут месяцами — туда должен уходить основной смысл.', 'Что сделать: больше полезных материалов на сайт, меньше пустого «быть на виду». Автоматизировать объём, себе оставить экспертизу и голос.', 'Зачем: масштабировать без удвоения часов. Контент работает на заявки, когда вас нет в телефоне.', 'Пример: каждый сильный пост → доработанная страница на сайте под тот же вопрос клиента.' ), }); } /* 4. Боль */ if (a.pain === 'ads' || a.channel === 'ads') { steps.push({ must: false, title: 'Снизить зависимость от платного трафика', html: stepHtmlParts( 'Зачем: реклама без своего канала — аренда кислорода. Денег мало — каждый слитый рубль больно.', 'Что сделать: сначала сайт + контент + карты/поиск, потом точечная реклама на уже тёплую систему.', 'Зачем: выключили бюджет — поток не умирает.', null ), }); } else if (a.pain === 'few' || a.pain === 'invisible' || a.channel === 'word') { steps.push({ must: false, title: 'Перестать надеяться только на сарафан', html: stepHtmlParts( 'Зачем: сарафан не масштабируется, когда у людей нет денег и они выбирают «проверенное в выдаче».', 'Что сделать: сайт, карты, полезный контент, присутствие в нише — чтобы находили без подруги.', 'Зачем: стабильный вход клиентов, а не лотерея знакомств.', null ), }); } else if (a.pain === 'unstable') { steps.push({ must: false, title: 'Сгладить ямы собственным каналом', html: stepHtmlParts( 'Зачем: скачки — симптом арендованного внимания (реклама, охваты, сезон сарафана).', 'Что сделать: свой сайт + регулярный контент = заявки и в «тихий» месяц.', 'Зачем: можно планировать загрузку и кассу без молитвы на алгоритм.', null ), }); } if (a.role === 'seller') { steps.push({ must: false, title: 'Селлеру: канал вне кабинета маркетплейса', html: stepHtmlParts( 'Зачем: WB/Ozon — чужие правила, растущие комиссии, реклама внутри МП жрёт маржу.', 'Что сделать: сайт + контент + соцсети как запасной аэродром и бренд.', 'Зачем: вас покупают не только «в карточке», а как понятного продавца/бренд.', 'Пример: трафик с VK/TG/поиска на свой сайт или на магазин уже с доверием.' ), }); } /* 5. Обязательный разбор — как пункт плана */ steps.push({ must: true, cta: true, title: 'Записаться на бесплатный разбор', html: '

' + esc( 'Зачем: план выше — каркас. На разборе разложим его под ваш конкретный бизнес: что делать в первую очередь, что подожмёт, что автоматизировать, а что не трогать, чтобы не слить последние деньги.' ) + '

' + '

' + esc( 'Что получите за 30 минут: 1) карту «где вас теряют клиенты»; 2) список обязательных шагов на 2 недели (сайт / сети / контент / карты — что у вас дырявое); 3) какие лайфхаки запускать именно вам; 4) как выглядит система привлечения под ваш тип (эксперт, салон, селлер, товар) — без воды.' ) + '

' + '

' + esc( 'Примеры: нет сайта — с чего собрать якорь за минимальные деньги. Есть инста, нет заявок — куда вести трафик. Офлайн-салон — QR, отзывы, мини-страница. Селлер — что вынести из кабинета МП. Онлайн без Threads/IG — с чего заселяться.' ) + '

' + '

' + esc( 'Это не «продажа в лоб». Хотите понять систему, которая подойдёт вам и приведёт клиентов — запишитесь. Даже если дальше пойдёте сами — уйдёте с ясным планом.' ) + '

', }); var hacks = pickLifehack(a); var title = 'Ваш план бесплатного привлечения'; if (a.now === '0_5' || a.pain === 'few') { title = 'План выхода из ямы: бесплатный трафик'; } else if (a.pain === 'ads') { title = 'План: заявки без слива бюджета'; } else if (a.site === 'none') { title = 'План: сначала якорь, потом поток'; } var reality = 'Сейчас не время открывать новый бизнес и молиться на чудо. Сейчас время заложить систему под рост, который начнётся через несколько месяцев. Пока многие сидят, страдают без клиентов и ждут «погоды», вы заселяете себя в интернет. Неважно, кто вы — психолог, сексолог, селлер, салон или делаете светильники: империя начинается с закладки, не с удачи.'; var bridge = 'Все шаги сходятся в одно: сайт как якорь + автогенерация контента + ритм присутствия. Лайфхаки ниже — быстрые действия на эту неделю. Разбор — чтобы собрать это в работающую систему под вас.'; return { title: title, roleWord: roleWord, intro: 'Ниже — рабочие шаги под ваши ответы: зачем каждый, что сделать, какой будет эффект. Без «просто будьте активнее».', steps: steps, hacks: hacks, reality: reality, bridge: bridge, }; } function renderQuestion() { var q = questions[state.index]; var wrap = $('#scq-question'); var fill = $('#scq-progress-fill'); var label = $('#scq-progress-label'); var pctLabel = $('#scq-progress-pct'); if (!wrap || !q) return; var pct = (state.index / questions.length) * 100; if (fill) fill.style.width = pct + '%'; if (label) label.textContent = 'Вопрос ' + (state.index + 1) + ' из ' + questions.length; if (pctLabel) pctLabel.textContent = Math.round(pct) + '%'; var opts = q.options .map(function (opt, i) { return ( '' ); }) .join(''); wrap.innerHTML = '
' + '
' + esc(q.text) + '
' + '
' + opts + '
'; } function selectOption(optionIndex) { if (state.advancing) return; var q = questions[state.index]; if (!q || !q.options[optionIndex]) return; var buttons = document.querySelectorAll('#scq-question .scq-option'); buttons.forEach(function (btn, i) { btn.classList.toggle('is-selected', i === optionIndex); }); state.advancing = true; state.answers[q.id] = q.options[optionIndex].key; setTimeout(function () { state.index += 1; if (state.index < questions.length) { state.advancing = false; renderQuestion(); } else { runLoading(); } }, 280); } function runLoading() { showScreen('loading'); var fill = $('#scq-analysis-fill'); var label = $('#scq-analysis-label'); var steps = [ { p: 20, t: 'Считываю ситуацию в бизнесе…', d: 280 }, { p: 45, t: 'Ищу дыры в привлечении…', d: 560 }, { p: 72, t: 'Подбираю шаги под онлайн/офлайн…', d: 900 }, { p: 100, t: 'Собираю ваш план…', d: 1220 }, ]; if (fill) fill.style.width = '0%'; var t = 0; steps.forEach(function (s) { t += s.d; setTimeout(function () { if (fill) fill.style.width = s.p + '%'; if (label) label.textContent = s.t; }, t); }); setTimeout(showResult, t + 360); } function showResult() { var plan = buildPlan(state.answers); state.planTitle = plan.title; var fill = $('#scq-progress-fill'); if (fill) fill.style.width = '100%'; var box = $('#scq-result-content'); if (!box) return; var stepsHtml = plan.steps .map(function (s, i) { var badge = s.must ? 'обязательно' : 'усиление'; var cta = s.cta ? '' : ''; var itemClass = s.cta ? 'scq-plan-item scq-plan-item-cta' : 'scq-plan-item'; return ( '
' + '
' + (i + 1) + '
' + '
' + '
' + esc(s.title) + ' ' + badge + '
' + (s.html || '

' + esc(s.body || '') + '

') + cta + '
' ); }) .join(''); var hacksHtml = plan.hacks .map(function (h) { return ( '
' + '
Куда зайти и что сделать
' + '' + esc(h.title) + '' + '

' + esc(h.why) + '

' + '

' + esc(h.what) + '

' + '

' + esc(h.forWhat) + '

' + (h.example ? '

' + esc(h.example) + '

' : '') + '
' ); }) .join(''); box.innerHTML = '
' + '
' + '
Готово · план под ' + esc(plan.roleWord) + '
' + '

' + esc(plan.title) + '

' + '

Конкретные шаги · без бюджета на «ещё одну рекламу»

' + '
' + '
' + '

' + esc(plan.intro) + '

' + '
' + stepsHtml + '
' + '

Что сделать на этой неделе — с указанием где именно

' + '

Каждый лайфхак привязан к конкретной площадке: Instagram, Threads, сайт, Telegram/VK или Яндекс.Карты. Не «в соцсетях вообще».

' + '
' + hacksHtml + '
' + '
К чему всё сходится

' + esc(plan.bridge) + '

' + '

' + esc(plan.reality) + '

' + '
'; showScreen('result'); goal('contema_scale_quiz_result'); state.advancing = false; var openBtn = $('#scq-open-lead'); if (openBtn) { openBtn.addEventListener('click', function () { openLeadModal(); }); } } function openLeadModal() { var modal = $('#scq-lead-modal'); if (!modal) return; modal.classList.add('is-open'); modal.setAttribute('aria-hidden', 'false'); document.body.classList.add('scq-modal-open'); goal('contema_scale_quiz_cta'); var nameInput = $('#scq-name'); if (nameInput) setTimeout(function () { nameInput.focus(); }, 80); } function closeLeadModal() { var modal = $('#scq-lead-modal'); if (!modal) return; modal.classList.remove('is-open'); modal.setAttribute('aria-hidden', 'true'); document.body.classList.remove('scq-modal-open'); } function normalizePhone(v) { var d = String(v || '').replace(/\D+/g, ''); if (d.length === 11 && d[0] === '8') d = '7' + d.slice(1); if (d.length === 10) d = '7' + d; return d; } function showFormMsg(text, ok) { var msg = $('#scq-form-msg'); if (!msg) return; msg.textContent = text; msg.className = 'scq-form-msg ' + (ok ? 'is-ok' : 'is-err'); } function submitLead(e) { e.preventDefault(); var form = $('#scq-lead-form'); var btn = form && form.querySelector('button[type=submit]'); if (!form) return; var name = (form.name.value || '').trim(); var phone = normalizePhone(form.phone.value); var time = (form.time.value || '').trim(); var personal = !!(form.consent_personal && form.consent_personal.checked); var privacy = !!(form.consent_privacy && form.consent_privacy.checked); var offer = !!(form.consent_offer && form.consent_offer.checked); if (name.length < 2) return showFormMsg('Укажите имя.', false); if (!/^7\d{10}$/.test(phone)) return showFormMsg('Введите телефон в формате +7 XXX XXX-XX-XX.', false); if (!time) return showFormMsg('Укажите удобное время для звонка.', false); if (!personal || !privacy) return showFormMsg('Нужно принять обязательные согласия.', false); if (btn) btn.disabled = true; showFormMsg('Отправляем заявку…', true); var a = state.answers; var resultLabel = 'Contema · ' + (state.planTitle || 'План трафика') + ' · ' + (a.role || '') + '/' + (a.mode || '') + '/site:' + (a.site || ''); fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: name, phone: '+' + phone, time: time, result: resultLabel, score: 0, source: location.href, consents: { personal: personal, privacy: privacy, offer: offer }, }), }) .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); }) .then(function (res) { if (res.ok && res.j && res.j.ok) { showFormMsg(res.j.message || 'Заявка принята. Свяжемся с вами.', true); form.reset(); goal('contema_scale_lead_submit'); setTimeout(closeLeadModal, 1200); } else { showFormMsg((res.j && res.j.message) || 'Не удалось отправить. Попробуйте ещё раз.', false); } }) .catch(function () { showFormMsg('Сеть недоступна. Попробуйте ещё раз.', false); }) .finally(function () { if (btn) btn.disabled = false; }); } function bind() { var root = $('#scq-root'); if (!root) return; var start = $('#scq-start'); if (start) { start.addEventListener('click', function () { state.index = 0; state.answers = {}; state.advancing = false; showScreen('quiz'); renderQuestion(); goal('contema_scale_quiz_start'); }); } root.addEventListener('click', function (e) { var opt = e.target.closest('.scq-option'); if (opt && opt.hasAttribute('data-option')) { selectOption(parseInt(opt.getAttribute('data-option'), 10)); } }); var form = $('#scq-lead-form'); if (form) form.addEventListener('submit', submitLead); var closeBtn = $('.scq-modal-close'); var backdrop = $('.scq-modal-backdrop'); if (closeBtn) closeBtn.addEventListener('click', closeLeadModal); if (backdrop) backdrop.addEventListener('click', closeLeadModal); document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeLeadModal(); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bind); } else { bind(); } })();