Завершено

Сайт для спортивного клуба: кейс UNLIM PADEL

Сайт UNLIM PADEL за 14 дней, пока корт ещё строили. WebGL-мяч связывает страницы, а свайп-карточки помогают уместить длинные подборки без бесконечного скролла.

Сайт для спортивного клуба: кейс UNLIM PADEL
Факты проекта
Факты проекта UNLIM PADEL14 дней, 21 URL, 5 SEO-статей, минус 508 килобайт raw после отказа от Three.js
14 днейна запуск сайта
21 URLв карте сайта
5 SEO-статейна старте
−508 КБ rawпосле отказа от Three.js

Две недели. Корта нет. Контента нет.

Срочно нужен был многостраничный сайт для UNLIM PADEL. Срок: две недели. Корт при этом ещё достраивали. Нормальных фото не было, офферы и УТП не сформулированы, тренеры без описаний.

На руках было ТЗ. Формально список задач, по факту шаблон, который выплюнула нейронка. На вопрос «что и зачем делаем?» там ответа не было. Чем глубже я проектировал, тем чаще выяснялось, что нужный функционал в ТЗ вообще не заложен. Но цена-то уже посчитана. Ёпт.

Тогда я ответственно послал ТЗ нахуй и включил голову: как бы хотел видеть это я и что адекватно именно мне, а не залупной нейронке на бесплатной подписке.

Сначала пришлось выяснить, что мы вообще продаём

Абонементы. Логику переписывали четыре раза. На одном из витков оффер звучал так: «абонемент на 10 часов даёт скидку 5%». В чём суть и почему не сделать фикс-цену, до сих пор загадка. Итог: «цена по запросу))».

Первые 100 клиентов. Скидка 50% на любой час с 07:00 до 23:00, 14 дней с первого бронирования, только через сайт или приложение. Клиент сам считает цену от 3 500 и гадает, 99-й он или уже 101-й. Допустим, позвонил, уточнил: бронь № 90, запись на послезавтра. А за эти дни перед ним записались ещё 11 человек. И что теперь, он 101-й? Задача на самом деле простая: набрать максимум новых игроков в первый месяц. Фикс-цена на первый час и дата окончания решали её без калькулятора.

Финальный оффер. «2 часа по цене одного». Зачёркнутые 11 000 → 5 000, рядом 7 000 → 3 500, акция с 01.11 по 15.11, «предварительно, возможен сдвиг». Четыре суммы, плавающие даты и один вопрос: сколько платить. Пиздец, короче.

Эволюция офферовТри разных предложения: абонемент на 10 часов со скидкой 5 процентов, акция для первых 100 клиентов со скидкой 50 процентов и акция 2 часа по цене одного с четырьмя суммами.Эволюция офферов
Абонемент
10 часов
= −5%
Логику переписывали четыре раза
→ «цена по запросу»
Первые 100 клиентов
−50%
07:00–23:00
14 дней с первой брони
99-й или 101-й?
2 часа по цене одного
11 0005 000
7 0003 500
01.11–15.11
Возможен сдвиг
4 суммы

Пожелание №14. «Добавить блок: ежедневные игры разных уровней, сильное комьюнити». Куда? Что на нём? Звучит как «ежедневно едим еду» в ресторане. Ну да, вы же ресторан, вы работаете каждый день. Про «силу комьюнити» тоже хочется развёрнутую мысль. В чём сила-то, брат? Слово «комьюнити» комьюнити не создаёт, и сто человек на одном корте не сообщество. Сообщество начинается с закрытого или открытого чата, в который новичка сразу зовут. Ни один клуб из референсов не додумался даже до этого минимума.

В итоге на сайте сделали карточку «Комьюнити клуба» с конкретным действием «Вступить в Telegram». Она ведёт в Telegram клуба: у нового человека есть следующий шаг, а не просто обещание сообщества.

И ещё выяснилось, что в преимуществах клуба важно всё, каждая карточка. Поэтому их много, и разложены они по секциям и свайперам, а не простынёй текста.

Главная UNLIM PADEL: акция «2 часа по цене одного» и карточки преимуществ клуба, включая опытных тренеров и комьюнити
Главная и преимущества клуба. Нажмите на скриншот, чтобы открыть его целиком.

Что запустили

На старте вышел сайт на 21 URL и пять статей для новичков. Но важнее, как он устроен: контент можно менять блоками, длинные подборки не превращают мобильную версию в бесконечный скролл, а с карточек клуба пользователь может перейти к бронированию.

Что пришлось спроектировать вместе с сайтом21 URL. Три важных решения: управляемые секции, короткая мобильная навигация по длинным подборкам и понятный путь от карточки к бронированию.Что пришлось спроектировать вместе с сайтом
21URL на старте
Секции, которыми можно управлятьСодержимое блоков меняется в CMS без свободного конструктора, где легко развалить структуру.
Карточки вместо простыниПреимущества, предложения и подборки собраны в компактные свайперы для мобильной версии.
От интереса к записиСайт ведёт к бронированию и личному кабинету через VivaCRM.

Секции главной остались в коде, а тексты, изображения и элементы внутри них редактируются отдельно. Так команда может обновлять страницу без риска собрать из неё конструктор с неожиданным порядком блоков.

Десктоп: тренеры, комьюнити, мероприятие, JUBO, переход на тренеров и обратно. Запись 3360×1890, 16:9.

CMS, в которой сложно что-то сломать

Payload CMS. Через неё правятся страницы и содержимое каждого блока, статьи, турниры и тренеры. Команда клуба меняет контент без разработчика и без пересборки.

Конструктора «ставь любой блок куда хочешь» нет, и это сознательно. Структура секций задана кодом, из CMS правятся поля и контент. Иначе через месяц сайт превратится в винегрет из чужих экспериментов.

Страница продажи кортов JUBO: модели корта, комплектации, инженерные технологии и монтаж под ключ
Отдельная страница кортов JUBO: модели, комплектации и инженерные технологии. Полный скриншот открывается по нажатию.

Мяч, который летит между страницами

Один переход, 4,5 секунды, зацикленный WebM. Мяч и след частиц сняты с работающего сайта.

При переходе между страницами мяч пролетает через экран и склеивает уходящую страницу с новой в одну анимацию. Живёт он в отдельном WebGL2-слое поверх сайта.

Сначала это была сцена на Three.js. Но тащить почти полмегабайта ради одного мяча перебор даже для падела. Я переписал всё на чистый WebGL2 и вырезал ~508 КБ raw. Заодно сайт стал быстрее грузиться и перестал мучить слабые устройства.

Дальше пошла уже тонкая настройка:

  • Модуль переходов грузится по намерению перейти по ссылке.
  • Тяжёлая сцена ждёт первого завершённого перехода и свободного времени браузера.
  • На мобильных отключён след частиц и ограничен буфер.
  • При долгих просадках кадров рендер сам снижает качество.
  • Нет WebGL2? Работает обычная навигация, без мяча и без ошибок.
Когда загружается мячНамерение перейти по ссылке запускает загрузку модуля переходов. После первого перехода и в свободное время браузера загружается WebGL2-сцена. Мобильные устройства используют облегчённый режим. Без WebGL2 работает обычная навигация.Когда загружается мяч
Намерение перейти по ссылке
Грузится модуль переходов
Первый переход завершён + браузер свободен
Грузится тяжёлая WebGL2-сцена
МобильныеБез следа частиц · лимит буфера · авто-снижение качества при просадках
Нет WebGL2Обычная навигация
PageSpeed: мобильный и десктопЛабораторный замер 12 октября 2026 года, 16:51 GMT+3. Производительность мобильного устройства 95, компьютера 99. Специальные возможности, рекомендации и SEO по 100. Мобильный LCP 2,7 секунды, десктопный 0,7 секунды.PageSpeed: мобильный и десктоп
Мобильный: 95 из 100Оценка производительности PageSpeed в приложенном замере95
МобильныйЭмуляция Moto G Power
Производительность
Десктоп: 99 из 100Оценка производительности PageSpeed в приложенном замере99
ДесктопЭмуляция компьютера
Производительность
100Специальные возможности
на обоих устройствах
100Рекомендации
на обоих устройствах
100Поисковая оптимизация
на обоих устройствах
2/2Агентный просмотр
на обоих устройствах
Показатели одного замера PageSpeed
ПоказательМобильныйДесктоп
FCP1,2 сек.0,3 сек.
LCP2,7 сек.0,7 сек.
TBT50 мс20 мс
CLS00
Speed Index3,2 сек.1,0 сек.

Лабораторный замер начальной загрузки одной страницы: 12.10.2026, 16:51 GMT+3 · Lighthouse 13.5.0. Данные взяты из приложенных скриншотов PageSpeed.

Тридцать экранов скроллить никто не будет

Секций на главной много, и все нужные. Просто сложить их в столбик мог бы только разработчик, который сам этот сайт не открывает. Поэтому карточки преимуществ, тренеров, тарифов и другие подборки сделаны свайперами. Листаешь внутри блока, страница не растёт.

Анимации появления не прячут контент до загрузки JS. Страницы отдаются готовым HTML, интерактив подключается только там, где он нужен. У картинок заданы размеры и варианты под карточки, мобильные экраны и крупные блоки. Огромный оригинал ради маленькой карточки не грузится, вёрстка не прыгает.

Главная UNLIM PADEL: характеристики кортов JUBO, тарифы аренды и тренировок, карточки тренеров
Корты, цены и тренировки на главной. Полный скриншот с карточками тренеров открывается по нажатию.
Мобильная главная UNLIM PADEL с акцией «2 часа по цене одного», кнопкой бронирования и нижним меню
Главная и нижнее меню
Мобильный блок «Цены и абонементы»: вкладка «Тренировки» и карточка индивидуальной тренировки
Тарифы и тренировки
Мобильная карточка корта JUBO и панель быстрых действий: бронирование корта, личный кабинет и построение маршрута
Быстрые действия
Мобильная версия: прокрутка до JUBO, меню справа, тренеры и обратно на главную. Без наведений.

Аналитика: не только «сколько зашло»

Своя аналитика считает:

  • просмотры страниц и активное время;
  • клики по кнопкам записи и контактам;
  • показы форм, начало заполнения, шаги, успешную отправку и ошибки;
  • просмотры карточек тренеров, турниров, статей и абонементов;
  • глубину чтения статей, источники и кампании;
  • Core Web Vitals: LCP, INP, CLS, TTFB, FCP.

Видно, где человек тянется записаться и на каком шаге бросает форму. Текст из полей не собирается.

Карта событий аналитикиФорма отслеживается от показа до начала заполнения, шагов и отправки. Ошибки фиксируются отдельно. Также учитываются просмотры, клики, карточки, чтение статей, источники и Web Vitals. Текст полей не собирается.Карта событий аналитики
Показ формы
Начало заполнения
Шаги
Отправка
↳ Ошибка
Просмотры и активное времяКлики: запись, контактыКарточки: тренеры, турниры, статьи, абонементыГлубина чтения статейИсточники и кампанииWeb Vitals: LCP INP CLS TTFB FCP
Текст полей не собирается

CRM оставили чужой

Бронирование и личный кабинет подключены через VivaCRM. Я предлагал свою CRM: по моей оценке, она окупилась бы за 1–2 года, в зависимости от объёма. Выбрали стороннюю, это тоже решение. Сайт интегрирован с CRM и не делает вид, что вся логика бронирования его.

Своё и стороннееСайт использует собственные Payload CMS и аналитику. Бронирование и личный кабинет находятся в сторонней VivaCRM. Оценка окупаемости собственной CRM составляет 1-2 года.Своё и стороннее
Сайт
Разработано в проекте
Payload CMSСтраницы, блоки, статьи, турниры, тренерыАналитикаСобытия, формы, источники, Web Vitals
Сторонняя система
VivaCRMБронирование
Личный кабинет
1–2 годаСвоя CRM: оценка окупаемости, в зависимости от объёма разработки
О проекте: стекВ проекте используются Astro, React, Payload CMS, PostgreSQL, WebGL2, Swup и GSAP.О проекте: стек
AstroReactPayload CMSPostgreSQLWebGL2SwupGSAP

Итог

За две недели: CMS, каталог тренеров, турниры, статьи, аналитика и мяч, который летает между страницами. Верстать блоки было самым лёгким. Тяжело было принимать продуктовые решения, пока вводные, материалы и сами офферы менялись под ногами.

Слово «комьюнити» комьюнити не создаёт. Зато мяч летает.