TL;DR
Мы реализовали мультирегиональность на eCommerce-платформе OpenPets с помощью поддоменов, геолокации по IP, MODX и интеграции с CRM. Делимся архитектурой, кодом, решениями и подводными камнями.
Зачем нам понадобилась мультирегиональность
OpenPets — это маркетплейс и контентная платформа для владельцев домашних животных. Мы начали с одного региона — Челябинска, но поняли, что запросы типа «купить корм Royal Canin в Новосибирске» требуют не просто SEO‑оптимизации, а полноценной географической кастомизации сайта:
цены, склады и доставка зависят от города,
пользователи хотят видеть локальные акции и телефоны,
поисковики любят «локальные страницы», если они уникальны.
Подход: поддомены + гео-IP + SEO
Мы выбрали поддомены для каждого региона: chel.openpets.ru
, msk.openpets.ru
и т.д. Это позволяет:
сегментировать контент по городам,
генерировать уникальные URL,
подключать региональные SEO-элементы.
Пользователя при первом заходе определяем по IP‑геолокации, но предлагаем окно с выбором города, чтобы исключить ошибочную автоподстановку.
Архитектура решения
Технологии
MODX Revolution (CMS)
PHP / MySQL
RetailCRM (интеграция через API)
NGINX / Cloudflare
База регионов
Мы создали таблицу regions
с ID, названием, алиасом поддомена, телефонными номерами и локальными настройками.
CREATE TABLE regions (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
subdomain VARCHAR(50),
phone VARCHAR(20),
city_lat FLOAT,
city_lon FLOAT
);
Определение города по IP
На backend мы используем SxGeo
:
require_once("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$ip = $_SERVER['REMOTE_ADDR'];
$city = $SxGeo->getCity($ip)['city']['name'];
Если город найден в базе regions
, делаем редирект на нужный поддомен. Иначе — показываем popup с выбором.
Каноникал и hreflang
Чтобы избежать дублирования в индексе:
каждая региональная страница получает
rel=canonical
на саму себя,между регионами расставляем
hreflang
:
<link rel="alternate" hreflang="ru-ru" href="https://msk.openpets.ru/product/123" />
<link rel="alternate" hreflang="ru-ru" href="https://chel.openpets.ru/product/123" />
Генерация уникального контента
Для каждого региона мы формируем:
уникальные
title
,description
,H1
;блоки с адресами, телефонами, локальными акциями;
уникальные SEO‑тексты внизу страниц.
$title = "Купить корм Royal Canin для кошек в " . $region['name'];
$meta_description = "Интернет-магазин OpenPets — быстрая доставка по " . $region['name'];
Интеграция с RetailCRM
Для каждого региона настроен свой склад в CRM. При заказе мы передаём регион ID через API, и система автоматически распределяет заказы.
$client = new \\RetailCrm\\ApiClient(...);
$client->ordersCreate([
'site' => $region['subdomain'],
'customFields' => ['region_id' => $region['id']]
]);
Результаты
Через 3 месяца после запуска:
+48% SEO‑трафика за счёт региональных LSI и geo‑запросов;
снижение отказов на 21% (люди сразу видят свой город);
рост конверсии в Челябинске на 33%.
Что дальше
Мы планируем:
подключить регионы Казахстана и Беларуси (multilang + мультистрана);
автоматическую генерацию контента на основе GPT + шаблонов;
улучшить инфраструктуру для Core Web Vitals в регионах.
Выводы
Мультирегиональность — это не только SEO, но и UX. Грамотная техническая реализация повышает доверие и конверсии. Делать это нужно с самого старта проекта, а не постфактум.
Если у вас был аналогичный кейс — пишите, обсудим архитектуру и подводные камни.