Разработка Smart-баннеров с персонализацией под каждого пользователя

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка Smart-баннеров с персонализацией под каждого пользователя
Средний
~3-5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1360
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    948

Разработка Smart-баннеров с персонализацией под каждого пользователя

Вы тратите бюджет на рекламные баннеры, но их CTR не дотягивает до 1%. Проблема в том, что все видят одно и то же предложение. Мы решаем это с помощью smart-баннеров: динамических блоков, которые показывают каждому пользователю именно те товары, которые он просматривал или которые алгоритм считает релевантными. Результат — рост CTR в 2–3 раза и конверсии на 15–30%. Снижается и стоимость привлечения клиента (CAC) на 20–30% за счёт более релевантного таргетинга. Закажите разработку smart-баннеров — получите консультацию инженера для предварительной оценки.

Как работает трекинг просмотров?

Персонализация начинается со сбора данных. Мы используем JavaScript-класс ViewHistoryTracker, который сохраняет историю просмотров в localStorage и синхронизирует с сервером для авторизованных пользователей. Это минимально инвазивное решение — не требует cookie-банера и GDPR-согласий для анонимных сессий.

class ViewHistoryTracker {
  private readonly KEY = 'view_history';
  private readonly MAX_ITEMS = 50;

  track(item: ViewedItem): void {
    const history = this.get();
    const filtered = history.filter(i => i.id !== item.id);
    const updated = [
      { ...item, viewed_at: Date.now() },
      ...filtered,
    ].slice(0, this.MAX_ITEMS);
    localStorage.setItem(this.KEY, JSON.stringify(updated));
    this.syncToServer(item);
  }

  get(): ViewedItem[] {
    try {
      return JSON.parse(localStorage.getItem(this.KEY) ?? '[]');
    } catch {
      return [];
    }
  }

  getRecent(count = 10): ViewedItem[] {
    return this.get().slice(0, count);
  }

  private async syncToServer(item: ViewedItem): Promise<void> {
    if (!getAuthToken()) return;
    await fetch('/api/views', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(item),
    });
  }
}

Что даёт коллаборативная фильтрация?

Простой показ последних просмотренных товаров даёт низкий CTR — пользователь уже видел их. Мы используем ранжирование с учётом весов категорий и популярности, а также коллаборативную фильтрацию для построения матрицы "пользователь-товар". Недавние просмотры получают больший вес, а дубли исключаются. Такой подход увеличивает CTR в 2–3 раза по нашим замерам.

function rankItems(history: ViewedItem[], candidates: CatalogItem[]): CatalogItem[] {
  const categoryWeights: Record<string, number> = {};
  const viewedIds = new Set(history.map(i => i.id));

  history.forEach((item, index) => {
    const recencyWeight = 1 / (index + 1);
    categoryWeights[item.category] = (categoryWeights[item.category] ?? 0) + recencyWeight;
  });

  return candidates
    .filter(c => !viewedIds.has(c.id))
    .map(candidate => ({
      ...candidate,
      score: (categoryWeights[candidate.category] ?? 0) * (candidate.popularity ?? 1),
    }))
    .sort((a, b) => b.score - a.score)
    .slice(0, 6);
}

Для крупных проектов (от 10k товаров) выносим движок на сервер на PHP/Laravel с матрицей в PostgreSQL. Кешируем рекомендации в Redis — время ответа API не превышает 50 мс.

Кейс: интернет-магазин электроники с каталогом 5000 товаров. После внедрения smart-баннера CTR вырос с 0,8% до 2,4%, конверсия из баннера в покупку — 12%. Средний чек увеличился на 8% за счёт кросс-сейлов.

Сравнение подходов к реализации

Параметр Клиентский трекинг + серверный движок Внешняя платформа (Retail Rocket)
Время внедрения 3–5 дней 1–2 дня
Точность рекомендаций Высокая (собственные алгоритмы) Высокая (ML-модели)
Стоимость обслуживания Низкая (свой сервер) Ежемесячная подписка
Контроль над данными Полный Частичный (передача данных)
Масштабируемость До 100k товаров От 10k до 1M+ товаров

Сравнение алгоритмов рекомендаций

Критерий Клиентское ранжирование Серверная коллаборативная фильтрация
Данные История в localStorage Матрица покупок и просмотров
Точность Средняя Высокая
Загрузка сервера Нет Умеренная (с кэшем)
Холодный старт Не проблема Требует данных
Типичные ошибки при внедрении
  • Показывать товары, которые пользователь только что видел. Всегда исключайте просмотренные позиции.
  • Игнорировать популярность товара — категорийный вес без учёта популярности даёт слабые рекомендации.
  • Не кэшировать серверные запросы. Без Redis каждый просмотр генерирует SQL-запрос — при 10k пользователей БД ляжет.
  • Не отслеживать клики по баннеру. Без аналитики вы не узнаете реальный CTR.
  • Забыть про мобильную адаптацию — баннер должен корректно отображаться на всех устройствах.

Как мы реализуем рендеринг smart-баннера?

Компонент на React (или Vue) встраивается в нужное место: sidebar, inline или sticky-bottom. Он запрашивает рекомендации через API и отображает товары с фото, названием и ценой. При клике отправляется событие в Google Analytics.

interface SmartBannerProps {
  placement: 'sidebar' | 'inline' | 'sticky-bottom';
  title?: string;
}

function SmartBanner({ placement, title = 'Вы смотрели' }: SmartBannerProps) {
  const [items, setItems] = useState<CatalogItem[]>([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const history = tracker.getRecent();
    if (history.length === 0) {
      setLoading(false);
      return;
    }

    fetch('/api/recommendations', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        viewed_ids: history.map(i => i.id),
        categories: [...new Set(history.map(i => i.category))],
        limit: placement === 'sidebar' ? 4 : 6,
      }),
    })
      .then(r => r.json())
      .then(data => setItems(data.items))
      .finally(() => setLoading(false));
  }, [placement]);

  if (loading) return <BannerSkeleton count={4} />;
  if (items.length === 0) return null;

  return (
    <div className={`smart-banner smart-banner--${placement}`}>
      <h3 className="smart-banner__title">{title}</h3>
      <div className="smart-banner__grid">
        {items.map(item => (
          <a
            key={item.id}
            href={item.url}
            className="smart-banner__item"
            onClick={() => trackBannerClick(item, placement)}
          >
            <img src={item.image} alt={item.title} loading="lazy" />
            <span className="smart-banner__name">{item.title}</span>
            <span className="smart-banner__price">{formatPrice(item.price)}</span>
          </a>
        ))}
      </div>
    </div>
  );
}

function trackBannerClick(item: CatalogItem, placement: string): void {
  gtag('event', 'smart_banner_click', {
    item_id: item.id,
    item_name: item.title,
    placement,
    item_category: item.category,
  });
}

Серверный эндпоинт рекомендаций

Мы используем Laravel-контроллер, который исключает просмотренные товары и ранжирует по категории и популярности. Для ускорения запросов добавляем Redis-кэш.

class RecommendationsController extends Controller
{
    public function index(Request $request): JsonResponse
    {
        $viewedIds = $request->input('viewed_ids', []);
        $categories = $request->input('categories', []);
        $limit = min($request->input('limit', 6), 12);

        $items = Product::query()
            ->whereNotIn('id', $viewedIds)
            ->where('is_active', true)
            ->where(function ($q) use ($categories) {
                $q->whereIn('category_slug', $categories)
                  ->orWhere('is_bestseller', true);
            })
            ->orderByRaw('
                CASE WHEN category_slug = ANY(?) THEN 1 ELSE 2 END,
                popularity DESC
            ', ['{' . implode(',', $categories) . '}'])
            ->limit($limit)
            ->get(['id', 'title', 'price', 'image', 'url', 'category_slug']);

        return response()->json(['items' => $items]);
    }
}

Когда подключать внешние платформы?

Для магазинов с каталогом от 10k товаров или когда нужна готовая ML-модель, интегрируем Retail Rocket или Mindbox. Базовая интеграция Retail Rocket занимает 1-2 дня:

rrApi.view(123456);
rrApi.addToBasket(123456);
rrApiOnReady(function() {
  rrApi.recommend('block_id_from_rr_panel', {
    callback: function(items) { renderRecommendations(items); }
  });
});

Что входит в работу?

  • Проектирование схемы трекинга и хранения данных
  • Разработка клиентского компонента баннера с поддержкой разных placement
  • Серверный эндпоинт рекомендаций с кэшированием
  • Интеграция с аналитикой (GA/Яндекс.Метрика)
  • Документация API и инструкция по встраиванию
  • Передача доступов к репозиторию и хостингу
  • Обучение вашего разработчика (1 час онлайн)
  • Гарантия 3 месяца на корректную работу алгоритмов

Сроки и стоимость

Сроки реализации: от 3 до 8 дней в зависимости от сложности. Стоимость рассчитывается индивидуально — оценим проект после брифа. За время работы мы реализовали smart-баннеры для десятков интернет-магазинов, средний рост CTR составил 180%. Наша команда имеет 5+ лет опыта в e-commerce персонализации.

Если вы хотите увеличить конверсию с рекламных блоков без лишних затрат, свяжитесь с нами — обсудим вашу задачу и предложим оптимальное решение. Получите консультацию инженера для предварительной оценки.

Настройка веб-аналитики: GA4, GTM, Яндекс.Метрика и Amplitude

Мы часто видим: конверсия 1.2 %, трафик растёт, а конверсия стоит. Маркетолог смотрит в Google Analytics и говорит: «пользователи уходят с шага 2 оформления заказа». Разработчик открывает тот же шаг — ошибок нет, в Sentry тишина. Значит, дело не в JS-баге, а в UX или в кривых данных, которые показывает аналитика. Аналитика ломается незаметно: событие перестало трекаться после редеплоя — никто не заметил; GTM-тег стреляет дважды — данные задвоились; фильтр GA4 исключает бота, который на самом деле — реальный трафик с корпоративного прокси. Закажите аудит текущих тегов — мы найдём причину за неделю.

После правильной настройки экономия рекламного бюджета может достигать 150 000 ₽ в месяц — это реальный кейс интернет-магазина с 50 000 сессий в день, где дедупликация purchase вернула 20 % неверно приписанных конверсий.

Почему события GA4 дублируются и как это исправить?

Universal Analytics закрыт, его место заняла событийная модель GA4. В ней нет фиксированных хитов страниц и транзакций — только события с параметрами. Это гибче, но требует правильного дизайна событий.

Автоматические события GA4 собирает сам: page_view, scroll, click, session_start. Рекомендуемые события нужно реализовать самостоятельно: purchase, add_to_cart, begin_checkout, view_item. Google ожидает конкретную схему параметров — если передать product_id вместо item_id, данные попадут в GA4, но не в стандартные отчёты e-commerce. Кастомные события для специфики проекта: filter_applied, video_progress, form_step_completed. Кастомные параметры необходимо зарегистрировать в GA4 Admin → Custom definitions, иначе они не будут доступны в отчётах.

Частая ошибка — событие purchase с дублями. Причина: тег срабатывает на странице /thank-you, пользователь обновляет страницу — второй purchase уходит в GA4. Решение: на бэкенде генерируем уникальный transaction_id и передаём в событие. GA4 de-duplicates по нему (в теории — проверяйте через DebugView). Правильная атрибуция экономит до 20 % рекламного бюджета, который раньше уходил на неверно приписанные конверсии.

Как настроить data layer, чтобы не потерять данные?

GTM — инструмент для управления тегами без деплоя кода. Но «без кода» не значит «без архитектуры». Data Layer — основа всего. Передаём данные из приложения в GTM через dataLayer.push(). Структура: event + контекстные данные. Для e-commerce: перед открытием страницы продукта — push с данными товара. GTM-тег читает из dataLayer, не из DOM.

window.dataLayer = window.dataLayer || [];
dataLayer.push({
  event: 'view_item',
  ecommerce: {
    items: [{
      item_id: 'SKU-12345',
      item_name: 'Название товара',
      price: 1990.00,
      currency: 'RUB'
    }]
  }
});

Плохая практика: GTM-тег парсит DOM — ищет цену в span.price, название в h1. Это ломается при любом изменении верстки. Хорошая практика: всегда dataLayer. Используем Preview Mode для отладки и GTM Server-Side для чувствительных данных — отправка с сервера, не с браузера, обходит блокировщики рекламы, не теряет данные.

Как Яндекс.Метрика дополняет веб-аналитику?

Для российской аудитории Метрика обязательна — особенно Вебвизор. Запись сессии пользователя, который бросил корзину, часто даёт ответ быстрее, чем неделя анализа воронки. Цели в Метрике: событийные (через ym(COUNTER_ID, 'reachGoal', 'GOAL_NAME')) или автоматические (клик по кнопке, посещение страницы). Связка с CRM через Метрика Плюс — передача офлайн-конверсий. Наш опыт: в 8 из 10 проектов после настройки Метрики находили скрытые баги в UX, которые не показывали другие системы.

Что даёт product analytics в Amplitude?

Amplitude — продуктовый инструмент, в отличие от маркетинговых GA4 и Метрики. Он заточен под анализ поведения пользователей внутри продукта: воронки, ретеншн, user paths. Amplitude подходит для SaaS-продуктов, мобильных приложений и любых сервисов с зарегистрированными пользователями, где важно понять, как проходят онбординг, на каком шаге уходят, какие фичи используют чаще. Ключевые концепции: identify (связать анонимного пользователя с userId после авторизации), group (аккаунт в B2B SaaS), когорты для удержания. Amplitude Chart — воронка шагов за последние 30 дней с разбивкой по источнику.

Мониторинг качества данных

Аналитика без мониторинга — чёрный ящик. Настраиваем:

  • GA4 Realtime — проверяем после каждого деплоя, что ключевые события приходят
  • Alerting в GA4 — аномалия в количестве событий purchase (резкое падение = что-то сломалось)
  • GTM Preview в staging-окружении перед продакшеном
  • Ручные тесты воронок раз в неделю — просто пройти путь покупателя и проверить, что всё трекается

Что проверяем после каждого деплоя

  • Все ли рекомендуемые события присутствуют в DebugView
  • Нет ли задвоений (считаем количество purchase на 100 сессий)
  • Не изменилась ли структура dataLayer после обновления фронтенда

Что входит в работу

Компонент Описание
Аудит текущих тегов Проверка существующих GTM-тегов, dataLayer, дублей и ошибок
Дизайн событийной схемы Документация: список событий, параметры, триггеры
Настройка GA4 + GTM Создание конфигурации, тегов, Custom definitions
Яндекс.Метрика Установка счётчика, создание целей, настройка Вебвизора
Amplitude (опционально) Настройка клиентского и серверного SDK, когорты
QA и мониторинг Тестирование в Preview Mode, Alerting
Обучение и передача Доступы, инструкция по добавлению новых событий, консоль

Процесс и сроки

  1. Аудит текущих тегов и данных (2 дня)
  2. Дизайн событийной схемы (2 дня)
  3. Разработка Data Layer и настройка тегов (3–5 дней)
  4. QA в Preview Mode и на staging (2 дня)
  5. Деплой и настройка дашбордов (1 день)
Сценарий Срок
Базовая настройка GA4 + GTM 1 неделя
Полный e-commerce tracking + Метрика 2–3 недели
Server-side GTM + Amplitude 3–5 недель

Стоимость рассчитывается индивидуально. Получите консультацию по настройке веб-аналитики для вашего проекта — мы оценим объём работ за один день. Свяжитесь с нами, чтобы начать.

Wikipedia: Веб-аналитика — подробнее о методах и метриках. Официальная документация по событийной модели GA4 доступна в Google Analytics 4.