Выход на новые рынки без необходимости перенастраивать сайт: опыт Sunction.store
Как мы добавили на сайт 9 стран, поменяли цены, валюты и контакты, не переписывая всё с нуля
Привет, это Лиза из Лиги А. Мы делаем сложные цифровые сервисы для стартапов и растущего бизнеса. Любим, когда сайт не только красивый, но и быстрый, удобный и готовый к развитию. Sunction.store — онлайн-магазин оптики с каталогом почти на 100 000 товаров — как раз такой. Мы развиваем проект с клиентом уже почти 5 лет. В этот раз обновили дизайн, вывели магазин на международный рынок и даже немного поговорили с роботами (в хорошем смысле). Ниже — честный рассказ о том, как мы всё это сделали: с задачами, правками и примерами. Поехали.
Коротко о главном. Что мы сделали
- Редизайн страниц товара и брендов: промоплашки, модалка «Хочу скидку», увеличение картинки на мобилках, видео в баннер, карточки с преимуществами, анимация фотохромных линз.
- Адаптация под 9 стран (Азербайджан, Грузия, Беларусь, Казахстан и другие): новые валюты, контакты и поле телефона с кодом страны.
- SEO-доработка: заголовки Last-Modified и If-Modified-Since, чтобы поисковики не грузили сервер без необходимости.
Теперь подробнее.
Редизайн: фишки, которые реально помогают продавать
Сначала клиент пришёл с задачей на редизайн: не просто перекрасить кнопки в другой цвет, а отрисовать элементы для удобства и конверсии.
Страница товара
Мы добавили промоплашки с акциями, чтобы встроить рекламу прямо в нужное место, не разрывая контекст. Сделали модалку «Хочу скидку» — теперь можно собирать лиды, не дожидаясь, пока пользователь дойдёт до корзины. А на мобилках и планшетах сделали увеличение картинки по нажатию: потому что люди хотят рассмотреть оправу, прежде чем отдать за неё деньги.
Страницы брендов
Там мы добавили возможность вставлять в баннер не только логотип компании, но и видео. Страница сразу становится живее — это не ещё одна карточка бренда, а уже полноценная история. Плюс поменяли вид кнопок категорий: они стали компактнее (так что на экран помещается больше кнопок за раз) и симпатичнее.
Длинные тексты про историю бренда на мобилках стали сворачиваться до трёх строк. Экран не перегружен, но кто хочет — раскроет страницу и получит всю информацию.
Ещё добавили карточки с фишками бренда. Ключевые преимущества вынесли в отдельный блок, чтобы они не терялись в простыне текста. А на карточки товара добавили несколько новых стикеров и перерисовали старые. Теперь акции и особые предложения, например, «Новинка» и «Доставка за 24 часа», реально бросаются в глаза.
Отдельная история — фотохромные линзы. Для них мы сделали анимацию затемнения. Как это работает: берём два одинаковых изображения (светлые и тёмные линзы), накладываем одно поверх другого и поочерёдно анимируем прозрачность одного из них. Решение простое, но эффектное. Пользователь сразу видит магию в действии — анимация работает на продажу лучше любого описания.
Адаптация: 10 валют, контакты и доставка в страны
Пока работали над редизайном, бизнес клиента рос. Появилась новая задача: адаптировать сайт для онлайн-покупок в других странах. Всё это звучало как «интернационализация». Поясним. Сначала магазин работал только в России, а клиент уже планировал продавать очки в Азербайджане, Грузии, Белоруссии, Казахстане и не только. Надо было адаптировать сайт, не переписывая всё с нуля.
Но адаптация — это не перевод. Язык мы оставили русский, а вот кое-какие вещи поменяли.
Что изменилось технически
- Цены и валюта. Когда меняется страна, меняется и валюта, в которой указаны цены. Соответственно, пересчитывается сумма и добавляется нужный значок. Плюс мы сократили длинные числа при конвертации, например, пишем не 8 000 000 UZS, а 8000К UZS.
- Номер телефона. Когда пользователь переходит в корзину, в поле ввода телефона уже есть код нужной страны. Но если регион надо поменять, это легко сделать вручную, нажав на значок флажка.
- Контакты на одноимённой страничке. Для России адрес и телефон указаны в Москве, для других стран — в Казахстане.
Ещё подкрутили метатеги, чтобы они соответствовали международному сайту. Но это уже мелочи.
Как это работает
В URL есть код страны — например, /az для Азербайджана. Когда пользователь заходит на сайт, мы определяем его страну по IP и показываем плашку: «Ваш регион — Азербайджан. Оставляем так?». Удобно и заботливо.
Дальше вставляем код страны в специальный заголовок запроса к бэкенду. Бэкенд смотрит на этот заголовок и возвращает данные (цены, номер телефона, контакты), соответствующие Азербайджану. Всё происходит за секунду.
Технический нюанс для тех, кто в теме. Мы боялись, что придётся мигрировать на новую версию Next.js. Но оказалось, что наша 12-я версия уже поддерживает базовую адаптацию. Мы указали набор локалей — и фреймворк сам начал генерировать страницы с кодами стран. Так у нас появилась возможность получать код региона с помощью средств, предоставляемых фреймворком, именно когда это нужно в нашей работе.
Какой баг мы нашли
На тестовом сервере всё работало идеально. Но под нагрузкой начались странности: редким пользователям показывались цены не того региона, в котором они находились. Сначала мы грешили на бэкенд. Потом одновременно с клиентом поняли, в чём дело. Оказалось, при большом трафике запросы от разных пользователей влияли друг на друга.
Как так вышло? При серверном рендеринге (SSR) мы использовали общий объект для хранения настроек региона. В браузере такой подход работает без проблем — там пользователь только один и настройки у него тоже одни, пока он сам их не изменит. А на сервере, где одновременно обрабатываются сотни запросов, этот объект мог «перезаписываться» одним запросом в тот момент, когда другой ещё не завершился. В программировании это называется мутацией общего объекта. Отсюда и путаница с регионами.
Клиент поставил временную заплатку. А мы взялись за основательное решение: заменили мутацию на передачу параметра во все запросы к бэкенду. Теперь каждый SSR-запрос получает свой собственный параметр региона, независимый от других. Путаница исключена, сайт работает стабильно.
SEO: разгрузка серверов
Параллельно с основными задачами сделали одну неочевидную, но важную вещь. Каталог Sunction.store разрастался, и поисковые роботы начали создавать заметную нагрузку на сервер. Надо было сделать так, чтобы они не грузили его, если на странице не было никаких изменений.
В чём суть
Когда робот (Яндекс или Google) приходит на страницу, он проверяет, изменилась ли она с прошлого визита. Если нет — незачем каждый раз отдавать все данные, можно передать сигнал, что всё по-старому. Это от нас и требовалось настроить.
Что мы сделали
Реализовали работу с заголовками Last-Modified и If-Modified-Since:
- На этапе SSR проверяем дату последнего изменения страницы (данные с бэкенда плюс дата сборки нашего фронта).
- Сравниваем с тем, что передаёт робот.
- Если ничего не изменилось — отвечаем кодом 304 Not Modified.
Робот уходит, сервер не нагружается. Как итог: индексация проходит эффективнее, ресурсы тратятся экономнее.
Наша позиция простая: нерешаемых задач не бывает. Когда не хватает опыта, привлекаем ИИ. Так мы превращаем «я не умею» в «я разобрался и сделал». Конкретно для этой задачи попросили ChatGPT подсказать направление. Дальше действовали сами: проверили информацию и взяли в работу.
Команда и процесс
Над проектом работали два разработчика. Андрей начинал редизайн, делал страницы товара. Юра вёл проект дальше: закончил редизайн, закрыл всю адаптацию и SEO. Работа заняла примерно три месяца с перерывами на согласования.
Что всё это дало бизнесу
- Готовность к расширению. Сайт теперь работает в 9 странах. Когда бизнес разрастётся ещё больше, мы легко добавим 10 или 15 страну — это будет вопрос нескольких часов, а не месяцев.
- Экономия ресурсов сервера. SEO-доработка снизила количество холостых обращений поисковиков. Сервер не дёргается по пустякам — трафик и вычислительные мощности расходуются только на реальных пользователей.
- Рост конверсии. Промоплашки, модалка «Хочу скидку», увеличение картинок на мобилках, карточки с фичами — всё это работает на то, чтобы пользователь быстрее принял решение и оформил заказ. Удобный и красивый интерфейс продаёт лучше, чем просто красивый.
- Техническая готовность к будущему. Следующие доработки обойдутся дешевле и быстрее.
Планы на будущее
Бизнес клиента продолжает развиваться, а мы будем рядом — с новыми идеями и для других проектов. Например, готовы ускорять страницы каталогов и брендов за счёт поэтапной подгрузки информации: сначала будут подгружаться картинки и текст, а потом детали вроде слайдеров.
***
Есть похожая задача? Нужно адаптировать интернет-магазин под новые рынки, ускорить его или просто «причесать» код? Пишите мне в телеграм @gingerliza Посмотрим, что можно сделать, и предложим решение, которое не сломает то, что уже работает.