Что болело до сайта
Наталья работает 15 лет: база в Санкт-Петербурге плюс выезды на свадьбы и съёмки за границу. Флагманская специализация это кудрявый метод, стрижка сухих кудрей по завитку. Сайта не было вообще.
Портфолио лежало в соцсетях. Заявки приходили в личные сообщения. Из поиска её не находили ни по запросу «мастер по кудрявым волосам СПб», ни по «парикмахер Пхукет», хотя на Пхукете она реально работает сезонами.
Отдельная сложность: два непересекающихся рынка. Свадебный destination и кудрявый метод с уходом. Разная аудитория, разная семантика, разная экономика. В один лендинг они не складываются. Англоязычные клиенты на Пхукете не ловились никак.
Развели рынки по отдельным посадочным
Собрали 21 индексируемую страницу: главная, девять страниц услуг и гео-направлений, портфолио, отзывы, блог с четырьмя статьями, «обо мне», политика и 404.
Гео-кластер достроили под то, как она работает на самом деле. Пхукет получил собственную страницу как место регулярной работы. Раньше он был строчкой в списке «свадьбы за границей». Добавили Италию, а страницу выезда переписали в хаб: с 593 до 1707 слов.
Английскую версию сделали отдельной страницей /en/phuket со своей упрощённой шапкой и hreflang в обе стороны. Запросы «hairdresser Phuket» и «curly hair specialist Phuket» переключателем языка не ловятся в принципе: поисковику нужен отдельный адрес.
Сайт в индексе с 21 июля 2026 года. Замеров результата за такой срок просто нет, а наш собственный план прямо оговаривает горизонт 4-8 месяцев и зависимость от факторов, которые кодом не решаются. Поэтому все цифры в кейсе технические: вес, скорость, объём работ. Обещать позиции и заявки мы не будем.
Как это устроено внутри
Сайт это честная статика. Обычные HTML-страницы, один файл стилей, один файл скриптов. Ни фреймворков, ни сборки на сервере.
Чтобы страницы не разъезжались, меню и стартовый скрипт лежат по одному разу в папке partials, а маленький python-скрипт разносит их по всем страницам и сам подсвечивает нужный пункт. Карту сайта собирает второй скрипт: обходит файлы, выкидывает черновики и закрытое от индексации, ставит дату изменения. Разойтись с реальным составом сайта она уже не может.
Тексты обоих языков лежат в одном словаре, к элементам привязаны ключи: 1116 привязок в разметке. Язык переключается мгновенно, без перезагрузки. Тема оформления и язык применяются крошечным скриптом до первой отрисовки, поэтому страница не моргает.
Микроразметку свели в один связный граф: 38 блоков на 24 файлах, везде одна и та же Наталья с одним идентификатором. Поисковик и нейросети собирают из этого одного человека. Выкатка это один git push, на сервер руками никто не заходит.
SEO-волна и скорость
Вторым заходом прошли аудит: 91 находка, 86 подтвердили, 14 предложений отклонили как вредные или бессмысленные. Дизайн при этом не трогали.
- H1 с ключом и городом на 11 страницах
- 22 контекстные ссылки внутри текстов, до этого их было ровно ноль
- видимые хлебные крошки на 19 страницах, текст берётся из микроразметки, поэтому вёрстка и разметка совпадают по построению
- FAQ-разметка на 13 страницах, 50 вопросов: этот формат чаще всего цитируют быстрые ответы и нейросети
- семантика на 349 запросов сведена в 232 строки по 6 кластерам и разведена по посадочным
- первый экран перестал ждать выполнения скрипта весом 148 КБ
- четыре декоративные накладки из PNG в webp: с 3,2 МБ до 0,5 МБ
- 165 картинок переведены на адаптивные размеры, замер главной после работ: LCP 840 мс, 21 запрос
Грабли, на которые наступили
Главные грабли это порядок слоёв в словаре переводов. Тексты собирались десятками последовательных присваиваний, и поздний слой молча перекрывал ранний. Дважды теряли уже сделанную работу: в словаре лежал правильный SEO-заголовок флагмана с городом, а ниже его затирала строка без города. Коварство в том, что поиском по исходнику находишь правильное значение и думаешь, что всё на месте. Свели 54 слоя к двум, все SEO-значения собрали одним слоем в самом конце, завели правило сверять итоговое значение ключа, а не искать его по файлу.
- Первый экран не рисовался без JavaScript: заголовок, подзаголовок и кнопки ждали класса от скрипта. Перевели на CSS-анимации, в head поставили сторожевой таймер на 2,5 секунды.
- Один упавший getElementById прятал всю страницу. На страницах без кнопки смены темы скрипт падал, и 32 блока, скрытых до появления, оставались невидимыми. Ниже первого экрана была белая пустота.
- Ключ перевода на элементе с вложенным текстом стирал описание услуги вместе с тегом: 14 строк на пяти страницах исчезали через долю секунды после загрузки.
- Скрытое через opacity:0 всё равно качается. Тропический декор тянул 1,36 МБ картинок, которых в основной теме никто не видит.
- Замена фото под тем же именем до вернувшихся посетителей не доходила: сервер отдаёт изображения на месяц как неизменяемые. Лечение это версия в адресе, но только в HTML: в микроразметке путь к картинке работает идентификатором.
- Язык залипал на весь сайт. Одного визита на английскую страницу хватало, чтобы до очистки браузера везде встречал английский.
Развилка, которую прошли без переписывания
Когда меню задублировалось в 16 файлах, обсуждали переезд на сборщик. Отказались осознанно. Миграция 17 страниц со шрифтами, двумя языками, двумя темами и декором это большой риск ради одного меню, плюс появляется этап сборки, зависимости и потеря простого автозабора. Взяли два партиала и идемпотентный скрипт с маркерами вставки. После первого прогона вёрстка воспроизвелась байт-в-байт.
Заодно скрипт вскрыл старый баг: на странице политики не было первого экрана, и при нулевой прокрутке с верхней панели снимался плотный фон. Белый текст меню на кремовом фоне, то есть меню было невидимым.
Часть работ сознательно не делали. Разметку отзывов и рейтинга не ставили: реальных отзывов с подтверждением от клиенток нет, а фальшивая разметка это прямое нарушение правил поиска. Круглую цифру «20+ стран» заменили перечислением подтверждённых направлений. Четыре проверяемых факта работают лучше одной красивой цифры, которую нечем подтвердить.
Частые вопросы
Сколько времени занимает сделать сайт для парикмахера?
Сайт natali.hair собрали за месяц. Домен заработал 21 июля 2026 года, работы по проекту шли до 16 августа, это 119 коммитов. За это время сделали 21 страницу: главная, девять страниц услуг и гео-направлений, портфолио, отзывы, блог из четырёх статей, страница о мастере, политика и 404.
Нужен ли сайт мастеру по волосам, если есть соцсети?
Портфолио в соцсетях поиск не показывает как страницы под запросы. Наталью не находили ни по запросу мастер по кудрявым волосам СПб, ни по запросу парикмахер Пхукет, хотя на Пхукете она работает сезонами. Под каждый рынок сделали свою посадочную: семантику на 349 запросов свели в 232 строки по 6 кластерам и развели по страницам. Внутри текстов появились 22 контекстные ссылки, до этого их было ровно ноль.
Нужна ли отдельная английская версия сайта или хватит переключателя языка?
Переключателем языка запросы вроде hairdresser Phuket и curly hair specialist Phuket не ловятся в принципе. Поисковику нужен отдельный адрес, поэтому английскую версию вынесли на страницу /en/phuket со своей упрощённой шапкой и hreflang в обе стороны. Тексты обоих языков лежат в одном словаре, к элементам привязаны ключи: 1116 привязок в разметке. Язык переключается мгновенно, без перезагрузки страницы.
Когда сайт начнёт приводить клиентов из поиска?
Быстрых замеров по этому проекту нет. Сайт в индексе с 21 июля 2026 года, а наш собственный план прямо оговаривает горизонт 4-8 месяцев и зависимость от факторов, которые кодом не решаются. Поэтому все цифры в кейсе технические: первый экран 772 → 283 КБ, LCP главной 840 мс, 21 запрос. Позиции и заявки мы не обещаем.
Можно ли добавить отзывы и рейтинг в сниппет поиска?
На этом сайте разметку отзывов и рейтинга не ставили. Подтверждённых отзывов от клиенток нет. Фальшивая разметка это прямое нарушение правил поиска. Вместо звёзд сделали FAQ-разметку на 13 страницах, 50 вопросов: этот формат чаще цитируют быстрые ответы и нейросети.
