Недавно клиент переделал checkout — конверсия упала на 20%. Мы запустили A/B-тест, который показал, что старый вариант работал лучше на 15%. Это стоило бы бизнесу миллионы при полном внедрении. A/B-тестирование — единственный способ принимать дизайнерские решения на основе данных, а не интуиции. За время работы мы провели более 200 экспериментов для интернет-магазинов, лендингов и SaaS-продуктов. Средний прирост конверсии составил 15–30%. Некоторые тесты приносили значительную дополнительную прибыль.
Без A/B-тестов каждое изменение — лотерея. Один наш клиент потратил значительный бюджет на новый дизайн главной, который просел на 8%. Тест показал бы это за 2 недели, не тратя бюджет.
Допустим, вы меняете лендинг без теста. Если конверсия падает на 10%, при 1000 посетителей в день это 100 потерянных лидов. За месяц — 3000 лидов, каждый стоит в среднем 500 рублей — потери существенны. Стоимость теста значительно ниже потенциальных потерь.
Какие проблемы решает A/B-тестирование?
Часто команды уверены, что новый дизайн или CTA улучшат конверсию, но статистика показывает обратное. Например, мы тестировали изменение цвета кнопки — ожидали рост на 20%, а получили падение на 5%. Технические ошибки тоже встречаются: неправильная сегментация пользователей, утечка данных между вариантами, некорректный трекинг. Однажды мы обнаружили, что из-за неверной реализации 30% пользователей попадали в оба варианта — тест пришлось перезапускать. И классическая ловушка — преждевременная остановка теста, когда разница кажется очевидной, но выборка ещё не набрана. По данным Nielsen Norman Group, 73% тестов останавливают раньше времени, что приводит к ложным выводам.
Как мы это делаем
Каждый эксперимент проходим по схеме: аналитика → проектирование → реализация → трекинг → анализ. Используем современный стек: React 18, Next.js 14, TypeScript, Node.js, Docker. Для хранения данных — PostgreSQL и Redis. Growthbook позволяет итерировать гипотезы в 3 раза быстрее по сравнению с VWO: вы пишете логику на клиенте или сервере, а не через визуальный редактор.
Реализация через Vercel Edge Middleware
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
const EXPERIMENT_COOKIE = 'exp_checkout_v2';
const VARIANTS = ['control', 'variant-a', 'variant-b'];
function assignVariant(): string {
const rand = Math.random();
if (rand < 0.34) return 'control';
if (rand < 0.67) return 'variant-a';
return 'variant-b';
}
export function middleware(request: NextRequest) {
const response = NextResponse.next();
// Не участвуют: боты, уже назначенные пользователи
const existing = request.cookies.get(EXPERIMENT_COOKIE)?.value;
if (existing && VARIANTS.includes(existing)) {
return response;
}
const variant = assignVariant();
response.cookies.set(EXPERIMENT_COOKIE, variant, {
maxAge: 60 * 60 * 24 * 30, // 30 дней
httpOnly: true,
sameSite: 'lax',
});
// Variant передаём в заголовке для Server Components
response.headers.set('x-ab-checkout', variant);
return response;
}
export const config = {
matcher: ['/checkout/:path*'],
};
// app/checkout/page.tsx
import { cookies, headers } from 'next/headers';
export default function CheckoutPage() {
const variant = headers().get('x-ab-checkout') ??
cookies().get('exp_checkout_v2')?.value ??
'control';
return (
<>
{variant === 'control' && <CheckoutV1 />}
{variant === 'variant-a' && <CheckoutV2OneStep />}
{variant === 'variant-b' && <CheckoutV2TwoStep />}
<ABTracker experiment="checkout_v2" variant={variant} />
</>
);
}
Трекинг результатов
// components/ABTracker.tsx (Client Component)
'use client';
import { useEffect } from 'react';
export function ABTracker({ experiment, variant }: {
experiment: string;
variant: string;
}) {
useEffect(() => {
gtag('event', 'experiment_impression', {
experiment_id: experiment,
variant_id: variant,
});
posthog.capture('$experiment_started', {
'$experiment_id': experiment,
'$variant_key': variant,
});
}, [experiment, variant]);
return null;
}
// Трекинг конверсии — в момент покупки
function trackConversion(variant: string) {
gtag('event', 'purchase', {
experiment_id: 'checkout_v2',
variant_id: variant,
value: orderTotal,
});
}
Statsig: быстрая интеграция
// Statsig SDK (серверная и клиентская части)
import Statsig from 'statsig-node';
await Statsig.initialize(process.env.STATSIG_SERVER_KEY!);
// В API route / Server Action
const experiment = Statsig.getExperiment(
{ userID: userId, email: userEmail },
'checkout_redesign'
);
const checkoutLayout = experiment.get('layout', 'single-page');
const ctaColor = experiment.get('cta_color', 'blue');
// Клиентская сторона (React SDK)
import { useExperiment } from 'statsig-react';
function PricingCTA() {
const { config } = useExperiment('pricing_cta');
const buttonText = config.get('button_text', 'Get Started');
const buttonVariant = config.get('button_variant', 'primary');
return (
<Button variant={buttonVariant} onClick={() => {
statsig.logEvent('cta_clicked', buttonText);
}}>
{buttonText}
</Button>
);
}
Почему статистическая значимость критична?
Без неё вы рискуете принять случайное колебание за победу. Перед запуском рассчитываем необходимую выборку:
# Python: расчёт sample size
from statsmodels.stats.power import zt_ind_solve_power
baseline_rate = 0.03
expected_effect = 0.15 # относительное улучшение
lift = baseline_rate * expected_effect # 0.0045 абсолютно
n = zt_ind_solve_power(
effect_size=lift / (baseline_rate * (1 - baseline_rate)) ** 0.5,
alpha=0.05,
power=0.8,
)
print(f"Sample size per variant: {int(n)}") # ~12,000
Правило: не останавливать тест раньше запланированного размера выборки, даже если результаты выглядят хорошо. Для теста с конверсией 5% и ожидаемым улучшением 10% потребуется 6 500 пользователей на вариант — это 2-3 недели трафика для среднего сайта.
Совет: не заглядывайте в результаты ежедневно — это искажает статистику. Автоматически считайте p-value и останавливайте тест только при достижении запланированной выборки. Используйте sequential testing, если нужны промежуточные решения.
Как выбрать инструмент для A/B-тестирования?
| Инструмент | Тип | Лучший для |
|---|---|---|
| Growthbook | Open source / SaaS | Технические команды, self-hosted |
| Statsig | SaaS | Быстрый старт, интеграция с аналитикой |
| Optimizely | Enterprise SaaS | Крупные компании, сложные эксперименты |
| VWO | SaaS | Маркетинговые команды без dev |
| Vercel Edge Experiments | PaaS | Next.js на Vercel |
| Собственная реализация | - | Полный контроль, минимальный overhead |
Какие метрики отслеживать в A/B-тесте?
| Метрика | Тип | Пример |
|---|---|---|
| Первичная (Primary) | Целевое действие | Конверсия в покупку, регистрация |
| Вторичная (Secondary) | Вовлечённость | Время на сайте, просмотр страниц |
| Бизнесовая (Business) | Доход, LTV | Средний чек, возвращаемость |
| Побочная (Guardrail) | Риск | Отказы, ошибки |
Все метрики должны быть заданы до старта эксперимента. Отслеживайте их в GA4: используйте events experiment_impression и experiment_conversion.
Что входит в работу
- Настройка инструмента A/B-тестирования под ваш стек (Growthbook, Statsig, VWO, Optimizely или custom).
- Реализация распределения вариантов на backend/edge с гарантией консистентности.
- Интеграция трекинга событий в GA4, PostHog, Amplitude.
- Расчёт необходимого размера выборки и длительности теста.
- Документация результатов и рекомендации по дальнейшим экспериментам.
- Обучение команды: как запускать тесты и интерпретировать результаты.
Процесс работы
- Аналитика: изучаем текущие метрики, выявляем узкие места, формулируем гипотезу.
- Проектирование: выбираем инструмент, определяем варианты и метрики успеха.
- Реализация: интегрируем распределение и трекинг, настраиваем дашборды.
- Запуск: начинаем тест, контролируем корректность данных.
- Анализ: после набора выборки — статистическая проверка, формирование отчёта.
Сроки: от 2 до 4 рабочих дней на простой тест, 5–10 дней на комплексный с кастомной логикой. Стоимость рассчитывается индивидуально.
Закажите настройку A/B-тестирования и получите данные для роста конверсии. Свяжитесь с нами для консультации по выбору инструмента и проведению экспериментов.







