Разработка квиза (Quiz) с расчётом результата на сайте
Типичная ситуация: компания вкладывает бюджет в разработку квиза, но после запуска конверсия не превышает 5%. Посетители бросают опрос на третьем вопросе, расчёт результата выдаёт очевидный ответ, а данные не попадают в CRM. Всё потому, что квиз делали «на коленке»: без продуманной логики, без захвата лидов и без аналитики. Мы решаем эту проблему, используя продвинутый движок с четырьмя типами квизов и интеграцией с популярными CRM. Наш опыт — разработка более 50 квизов для разных ниш, от подбора тарифа до типирования личности. Гарантируем: после внедрения ваш квиз будет конвертировать не хуже, чем персонализированная лендинговая страница.
По данным CXL, персонализированные интерактивные опросы увеличивают время на сайте в 2 раза и повышают конверсию на 30%.
Как выбрать тип квиза под задачи бизнеса?
| Тип | Описание | Сложность | Подходит для |
|---|---|---|---|
| Типологический | Каждый ответ добавляет очки к профилю, побеждает профиль с максимумом | Средняя | Сегментация аудитории, подбор тарифа |
| Балльный | Ответы дают числовые очки, итог — по диапазону | Низкая | Тесты знаний, оценка уровня |
| Ветвящийся (branching) | Следующий вопрос зависит от предыдущего ответа | Высокая | Сложные сценарии с разными итогами |
| Рекомендательный | Сбор параметров и рекомендация продукта/специалиста | Средняя | Подбор товаров, услуг |
Ветвящиеся квизы конвертируют на 25% лучше линейных, а типологические — на 30% лучше балльных для сегментации. Правильный выбор типа напрямую влияет на engaged time и quality of leads.
Почему ветвящаяся логика повышает конверсию?
Ветвящиеся сценарии позволяют задавать только релевантные вопросы, исключая неактуальные для пользователя. Это снижает когнитивную нагрузку и повышает вовлечённость. В одном проекте для онлайн-школы мы заменили линейный типологический квиз на ветвящийся — конверсия в лид выросла с 12% до 18%, а среднее время прохождения сократилось на 40%.
Как устроен движок расчёта?
Структура данных описывается на TypeScript: QuizQuestion, QuizAnswer, QuizResult. Движок на JavaScript аккумулирует баллы по профилям и определяет результат.
interface QuizQuestion {
id: string;
text: string;
type: 'single' | 'multiple' | 'scale';
answers: QuizAnswer[];
nextQuestion?: string | ((answers: Record<string, string[]>) => string);
}
interface QuizAnswer {
id: string;
text: string;
scores: Record<string, number>;
image?: string;
}
interface QuizResult {
id: string;
title: string;
description: string;
recommendation?: string;
cta?: { text: string; url: string };
minScore?: number;
maxScore?: number;
}
class QuizEngine {
constructor(questions, results) {
this.questions = questions;
this.results = results;
this.answers = {};
this.scores = {};
}
answer(questionId, answerIds) {
this.answers[questionId] = answerIds;
const question = this.questions.find(q => q.id === questionId);
for (const answerId of answerIds) {
const answer = question.answers.find(a => a.id === answerId);
if (!answer?.scores) continue;
for (const [profile, score] of Object.entries(answer.scores)) {
this.scores[profile] = (this.scores[profile] || 0) + score;
}
}
}
getNextQuestion(currentId) {
const question = this.questions.find(q => q.id === currentId);
if (typeof question.nextQuestion === 'function') {
return question.nextQuestion(this.answers);
}
return question.nextQuestion;
}
calculateResult() {
const [topProfile] = Object.entries(this.scores)
.sort(([, a], [, b]) => b - a);
return this.results.find(r => r.id === topProfile?.[0]) ?? this.results[0];
}
getTotalScore() {
return Object.values(this.scores).reduce((s, v) => s + v, 0);
}
}
React-компонент для квиза с захватом лида
Компонент Quiz управляет шагами, вызывает engine и отображает результат после захвата лида.
function Quiz({ config }) {
const engine = useRef(new QuizEngine(config.questions, config.results));
const [step, setStep] = useState(0);
const [selected, setSelected] = useState([]);
const [result, setResult] = useState(null);
const [leadCaptured, setLeadCaptured] = useState(false);
const currentQ = config.questions[step];
const progress = ((step / config.questions.length) * 100).toFixed(0);
function handleNext() {
engine.current.answer(currentQ.id, selected);
setSelected([]);
if (step + 1 >= config.questions.length) {
setResult(engine.current.calculateResult());
} else {
setStep(s => s + 1);
}
}
if (result && !leadCaptured) {
return (
<form onSubmit={(e) => { e.preventDefault(); submitLead({ contact: { email: e.target.email.value }, result, answers: engine.current.answers }); setLeadCaptured(true); }}>
<h3>Ваш результат готов!</h3>
<p>Укажите email, чтобы получить персональные рекомендации</p>
<input name="email" type="email" placeholder="[email protected]" required />
<input name="name" placeholder="Имя (необязательно)" />
<button type="submit">Показать результат</button>
</form>
);
}
if (result && leadCaptured) {
return <QuizResult result={result} score={engine.current.getTotalScore()} />;
}
return (
<div className="quiz">
<ProgressBar value={progress} />
<QuizQuestion
question={currentQ}
selected={selected}
onSelect={setSelected}
/>
<button onClick={handleNext} disabled={!selected.length}>
{step + 1 < config.questions.length ? 'Далее' : 'Узнать результат'}
</button>
</div>
);
}
Для аналитики используем GTM или GA4: отслеживаем каждый шаг и завершение.
function trackStep(questionIndex, questionId) {
window.dataLayer?.push({
event: 'quiz_step',
quiz_step: questionIndex + 1,
quiz_question_id: questionId,
});
}
function trackCompletion(resultId, score) {
window.dataLayer?.push({
event: 'quiz_complete',
quiz_result: resultId,
quiz_score: score,
});
}
Как мы создаём квиз: пошаговый процесс
- Аналитика и сбор требований — определяем цель, целевую аудиторию и сценарии.
- Проектирование логики — выбираем тип квиза, составляем дерево вопросов и правил расчёта.
- Дизайн интерфейса — создаём прототип в Figma с адаптивной вёрсткой и анимацией.
- Разработка движка и компонентов — реализуем на React с опциональным использованием TypeScript.
- Интеграция с CRM — настраиваем передачу лидов через REST API или вебхуки.
- Тестирование и Q/A — проверяем все сценарии, корректность расчёта, юзабилити.
- Запуск и аналитика — разворачиваем на продакшене, настраиваем события.
- Пост-запускная поддержка — мониторинг, правки, оптимизация.
Что входит в разработку?
- Техническое задание с детальным описанием логики.
- Прототип интерфейса в Figma.
- Вёрстка адаптивных компонентов с анимацией.
- Реализация движка расчёта с поддержкой выбранного типа.
- Интеграция с CRM (Bitrix24, amoCRM, HubSpot) через REST API или вебхуки.
- Настройка событий в GA4 / Яндекс.Метрике.
- Документация по интеграции и инструкция для менеджеров.
- Обучение команды работе с результатами квиза.
Преимущества разработки квиза в нашей команде
Мы используем собственный гибкий движок, который адаптируется под любую логику — от простого балльного до сложного ветвящегося с динамическими правилами. Квиз можно встроить в любой сайт: отдельной страницей, попапом или виджетом. Анимация переходов на framer-motion делает прохождение плавным и вовлекающим.
Разработка квиза окупается за 1–2 месяца за счёт роста конверсии лидогенерации. Один из наших клиентов увеличил количество квалифицированных лидов на 60% всего за 3 недели после запуска. Экономия бюджета — до 40% по сравнению с разработкой с нуля без готового движка.
Сроки разработки
| Тип квиза | Сроки |
|---|---|
| Простой (5–10 вопросов, захват лида, результат) | 3–4 рабочих дня |
| Средней сложности (ветвление, несколько профилей, анимация) | 6–8 рабочих дней |
| Сложный (ветвление, интеграция, A/B-тестирование) | 8–12 рабочих дней |
Стоимость рассчитывается индивидуально после согласования ТЗ. Закажите консультацию инженера — получите оценку вашего проекта.







