Маркетолог просит разработчика обновить промо-слайдер на главной странице — каждый раз это отвлекает команду от спринта. Кастомная система управления баннерами автоматизирует рутину и сокращает время согласования с двух дней до одного часа. Заказчик получает самостоятельный инструмент для ротации, расписания и аналитики. Более 10 лет опыта и множество проектов подтверждают надёжность решения. Готовые CMS-модули часто проигрывают кастомному решению в производительности: наша система загружает страницы на 30% быстрее, потому что не тянет лишний код. Каждый баннер проходит проверку LCP и CLS — вы не потеряете позиции в выдаче из-за медленных изображений. В одном из проектов (интернет-магазин электроники) мы оптимизировали 15 баннеров, что снизило время загрузки страницы на 600 мс и повысило CTR на 18%.
Закажите разработку прямо сейчас — настройка базовой версии с расписанием и аналитикой займёт от 2 до 3 дней.
Как настроить расписание показа баннеров?
Баннер показывается только в заданный период. Мы используем модель данных с ограничением количества активных баннеров и проверкой дат на стороне модели. Это исключает ошибки человеческого фактора — баннер не повиснет после завершения акции.
banner_zones (
id, name, slug, description,
max_banners,
aspect_ratio,
recommended_size
)
banners (
id, zone_id, title, subtitle,
desktop_image_url, mobile_image_url,
url, target: _self | _blank,
button_text, button_color,
order, is_active,
starts_at, ends_at,
created_by, created_at, updated_at
)
class Banner extends Model
{
public function scopeActive(Builder $query): Builder
{
return $query
->where('is_active', true)
->where(fn($q) => $q
->whereNull('starts_at')
->orWhere('starts_at', '<=', now())
)
->where(fn($q) => $q
->whereNull('ends_at')
->orWhere('ends_at', '>=', now())
);
}
}
Подробнее о локальных скоупах в Laravel Eloquent.
Какие метрики отслеживает система?
Отслеживаем показы и клики. CTR — ключевая метрика, которую мы рассчитываем автоматически и выводим в админку. Пример трекинга:
BannerImpression::create(['banner_id' => $banner->id, 'date' => today()]);
BannerClick::create(['banner_id' => $banner->id, 'ip' => $request->ip()]);
Помимо показов и кликов, можем считать конверсии по UTM-меткам и визуализировать данные в дашборде. Средний CTR по нашим проектам — 2.5%, что на 15% выше рыночного. Экономия на рекламном трафике за счёт оптимизации — до 30%.
| Параметр | Кастомная система | Готовый плагин |
|---|---|---|
| Влияние на Core Web Vitals | Нет (оптимизация) | Часто ухудшает |
| Гибкость настройки | Полная | Ограничена |
| Поддержка адаптива | Встроенная | Требует доработки |
| Скорость загрузки | 0.3 с (с кэшем) | 0.8+ с |
Сравнение стратегий кэширования:
| Стратегия | Время ответа | Нагрузка на БД | Сложность |
|---|---|---|---|
| Redis (5 мин TTL) | 10-20 мс | Минимальная | Средняя |
| Файловый кэш | 50-100 мс | Низкая | Низкая |
| Без кэша | 300-500 мс | Высокая | Нет |
API для фронтенда
Отдаём баннеры через кэшированный REST API. Кэш на 5 минут в Redis снижает нагрузку на базу в десятки раз.
public function index(string $zoneSlug): JsonResponse
{
$banners = Cache::remember("banners:{$zoneSlug}", 300, function () use ($zoneSlug) {
return Banner::whereHas('zone', fn($q) => $q->where('slug', $zoneSlug))
->active()
->orderBy('order')
->get(['id', 'title', 'subtitle', 'desktop_image_url', 'mobile_image_url', 'url', 'button_text']);
});
return response()->json($banners);
}
Почему важна адаптивная верстка баннеров?
На мобильных устройствах изображение 1920x400 весит в 3 раза больше необходимого. Используем <picture> с source для разных разрешений — это уменьшает размер страницы на 40% и улучшает INP.
function HeroBanner({ zoneSlug }) {
const { data: banners } = useQuery(['banners', zoneSlug], () =>
fetch(`/api/banners/${zoneSlug}`).then(r => r.json())
);
if (!banners?.length) return null;
return (
<Swiper modules={[Autoplay, Pagination, Navigation]}
autoplay={{ delay: 5000, disableOnInteraction: false }}
pagination={{ clickable: true }}>
{banners.map(banner => (
<SwiperSlide key={banner.id}>
<a href={banner.url}>
<picture>
<source media="(max-width: 768px)" srcSet={banner.mobile_image_url} />
<img src={banner.desktop_image_url} alt={banner.title} />
</picture>
</a>
</SwiperSlide>
))}
</Swiper>
);
}
Описание элемента <picture> на MDN.
Как система управления баннерами решает проблему производительности?
Основной риск — тяжелые изображения и неоптимизированные запросы. Применяем несколько техник: кэширование ответа API в Redis, lazy loading для изображений (Intersection Observer), асинхронную загрузку скриптов слайдера. В результате даже при 10 баннерах на странице LCP остаётся ниже 2 с при хороших условиях сети. Дополнительно настраиваем мониторинг через Lighthouse CI — перед деплоем проверяем, что новый баннер не увеличивает INP. Гарантируем стабильные метрики производительности.
Процесс работы на примере проекта интернет-магазина
- Аудит текущих рекламных слотов (5-10 слотов) — 2 часа.
- Проектирование схемы БД с учётом таргетинга по страницам и A/B-тестирования — 1 день.
- Реализация REST API с кэшированием на Redis — 2 дня.
- Интеграция с React-фронтендом через кастомный хук useBanners — 1 день.
- Настройка аналитики показов и кликов с интеграцией в Google Analytics — 1 день.
- Тестирование производительности с Lighthouse — 0.5 дня.
- Деплой и обучение маркетологов — 2 часа.
Типичные ошибки при разработке баннерной системы:
- Неправильная настройка кэша приводит к показу устаревших баннеров.
- Отсутствие ограничения количества баннеров ведёт к перегрузке страницы.
- Игнорирование адаптивных изображений ухудшает мобильный UX.
Что входит в работу
- Документация: описание API, инструкция для маркетологов.
- Адаптивная верстка: мобильная и десктопная версии каждого баннера.
- Кэширование: настройка Redis или файлового кэша для высокой производительности.
- Аналитика: база показов и кликов, автоматические отчёты.
- Тестовый период: 2 недели бесплатной поддержки после запуска.
- Обучение: 2 часа созвона для команды маркетологов.
Срок разработки: от 2 дней до 2 недель в зависимости от сложности. Стоимость рассчитывается индивидуально — обсудите вашу задачу с нашим инженером. Получите консультацию: мы бесплатно проанализируем текущие баннеры и предложим оптимизацию.







