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. Грамотная техническая реализация повышает доверие и конверсии. Делать это нужно с самого старта проекта, а не постфактум.

Если у вас был аналогичный кейс — пишите, обсудим архитектуру и подводные камни.

Комментарии (0)