Мне нужно было одно число. Какая доля салонов красоты в моём городе даёт клиенту записаться онлайн — без звонка. Я делаю сервис записи для салонов и постоянно слышу от мастеров «нам пишут ночью», «клиенты приходят из интернета». Но сколько всё-таки таких салонов, куда ночью не записаться? Десять процентов? Половина?
Полез искать — и не нашёл. Есть отчёты про объём бьюти-рынка. Есть пресс-релизы CRM про «повальную цифровизацию отрасли». Есть подборки «5 трендов индустрии красоты». А простого числа — у скольких салонов клиент может записаться, не звоня, — нет нигде.
Ну хорошо. Город один, руки есть. Посчитаю сам. Считал два дня, и по дороге выяснил, что самое интересное — не результат, а то, во что упираешься по пути.
Стена рынка данных
Наивный план: взять справочник, выгрузить категорию «салоны красоты», посчитать. Оказалось, справочники устроены так, чтобы этого нельзя было сделать.
2ГИС. Регистрируюсь, беру демо-ключ, открываю документацию. Демо отдаёт максимум пять страниц по десять объектов. Пятьдесят карточек — на пятимиллионный город. Это не выборка, это прогулка по одному кварталу. Дальше — платная подписка без публичного прайса, «считаем через менеджера», ориентир по рынку около 200 тысяч в год.
Данные карт по лицензии. У другого поставщика геоданные отдаются, но лицензия запрещает не перепродажу и не публикацию — она запрещает сохранить результат в файл. То есть операция «выгрузил и посчитал» уже нарушение, даже если число я оставлю себе. Лицензия, которая это разрешает, на момент проверки стоила 226 200 рублей в год. Двести двадцать шесть тысяч — за возможность посчитать салоны красоты в своём городе.
ВКонтакте. У салонов есть сообщества, у VK открытое API. Пробую хотя бы узнать, можно ли им написать. Старый способ авторизации закрыт, новый требует полноценной серверной обвязки с обменом кодов. Ради одной метрики строить это не окупается. Отступаю.
OpenStreetMap. Карта, которую рисуют волонтёры. Единственный источник, чья лицензия (ODbL) прямо разрешает и хранить данные, и публиковать по ним статистику. Бесплатно, без ключей, без менеджеров.
Вот и весь портрет рынка данных: три компании знают про город всё — и либо продают это за месячную зарплату разработчика, либо запрещают записывать в файл. А доступна бесплатно только карта, которую нарисовали энтузиасты по вечерам.

Каркас: Overpass
Из OSM я вытащил каркас выборки одним запросом к Overpass API. Категории shop=beauty и shop=hairdresser, рамкой по координатам (bbox), а не поиском админ-границы по имени — area-lookup стабильно валит публичные зеркала в 504:
[out:json][timeout:120]; ( nwr["shop"="beauty"](59.63,29.55,60.10,30.65); nwr["shop"="hairdresser"](59.63,29.55,60.10,30.65); ); out center tags;
Одна тонкость: публичные инстансы Overpass без внятного User-Agent отвечают 406/429, а основной часто отдаёт 429 под нагрузкой. Поэтому в скрипте — список зеркал, идём по нему до первого рабочего.
Получилось 3 556 объектов, из них 3 046 с названием.
Почему я выбросил самые красивые цифры
Тут был момент, когда я чуть не написал другую статью. В OSM у объекта есть теги: сайт, телефон, часы. Считай не хочу. Я и посчитал — вышли красивые проценты «у скольких салонов заполнен сайт». А потом понял, что считаю не то. OSM-теги заполняют волонтёры выборочно: отсутствие тега website не значит, что у салона нет сайта, — значит, что кто-то его не вписал. Это метрика полноты OSM, а не рынка.
Красивые цифры пришлось выбросить и пойти длинным путём: у кого в OSM указан сайт — зайти на этот сайт и посмотреть глазами скрипта, что там есть для клиента.
Метод: читаем сайты
Сайтов с URL набралось под тысячу. Каждый я загрузил и в HTML искал два признака.
Первый — маркеры систем онлайн-записи в коде страницы (виджеты, ссылки, скрипты):
const BOOKING_HOSTS = ["yclients", "dikidi", "altegio", "sonline", "arnica", "beautybot"]; const hasBooking = (html) => BOOKING_HOSTS.filter((h) => html.toLowerCase().includes(h));
Второй — ссылки на мессенджеры (t.me, wa.me, vk.com/im, и т.п.): есть ли вообще куда написать, кроме телефона.
И здесь — главный урок массового обхода, из-за которого чуть не получил красивую ложь. Первый прогон в десять потоков напечатал «открылось 41 из 906». Я почти поверил — а это моя сеть захлебнулась под VPN, и половина «мёртвых» сайтов на самом деле живые. Правильно так: низкая параллельность (≤4), три попытки на адрес, отдельная категория «ответил ошибкой, но жив» — иначе таймаут своей сети записывается в «у салона нет сайта». Проверять всегда на одиночном запросе, прежде чем верить массовому.
После аккуратного повтора из 963 проверенных адресов чисто открылись 623. Их и взял за базу. Остальные (мёртвый домен, просроченный сертификат, недоступность, неотличимый от неё таймаут) в базу не пошли — поэтому оценка ниже консервативная, а не завышенная.
Результат
База — 623 открывшихся сайта салонов Петербурга.
- 48,0% (299) — записаться онлайн нельзя вообще. Только телефон или форма «оставьте заявку».
- 52,0% (324) — онлайн-запись есть.
- 20,5% (128) — ни записи, ни какого-либо мессенджера. Совсем некуда обратиться, кроме звонка.

Среди 324 сайтов, где запись есть, — кто её делает (сумма чуть больше 100%, у части стоит две системы):
YCLIENTS — 79,3%
DIKIDI — 13,3%
Sonline — 8,3%
Arnica — 0,9%
Altegio — не встретился ни разу.

Почти четыре из пяти «записывающихся» салонов сидят на одной системе. Для рынка это и монополия, и точка входа: интегрируешься с одним — говоришь с большинством.
Где это может врать (честно)
Выборка смещена в цифровую сторону. Я смотрел салоны, у которых в OSM указан сайт, — это заведомо самая интернет-продвинутая часть рынка. Значит реальная доля «без онлайн-записи» по всему рынку (включая тех, у кого сайта нет вовсе) выше моих 48%, а не ниже.
Один город. Питер — не вся Россия, в регионах картина может отличаться.
Детект по маркерам не идеален. Салон с самописным виджетом записи, не оставившим узнаваемых следов в HTML, я мог посчитать как «без записи». Это тоже смещает оценку в сторону занижения доли с записью.
Таймауты. Часть недоступных сайтов — возможно, живые, просто медленные. Они исключены, база консервативна.
Ни один из этих перекосов не работает в сторону «на самом деле всё хорошо». Все — в сторону «без записи ещё больше».
Зачем это было
Мне это число нужно было для дела — я делаю NAMI, сервис онлайн-записи для салонов, и хотел понять размер проблемы не по ощущениям, а по данным. Получил: половина салонов даже среди самых цифровых не даёт записаться, не позвонив, а пятая часть оставила клиенту один телефон. При том что звонить люди всё меньше любят — но это уже тема отдельной статьи.
А ещё я получил побочный вывод, ради которого, может, и стоило всё затевать: простое число про твой собственный город — уже не общественное достояние. Его либо продают за месячную зарплату разработчика, либо запрещают сохранить в файл. Спасает только карта, которую по вечерам рисуют волонтёры. Спасибо им.
Скрипт (OSM Overpass + обход сайтов) — на Node без зависимостей; при интересе выложу отдельно.
—
Данные и метод: OpenStreetMap (ODbL), июль 2026, Санкт-Петербург, база — 623 сайта.
Скрипт лежит здесь: github.com/MelnikovDenisG/salon-scan.
Версия про рынок для тех, кому не про код, а про бизнес.