Я специалист по Google Ads, но реклама не живёт отдельно от сайта. Если сайт медленный, с неактуальными условиями доставки и ошибками, реклама приводит людей в никуда, а органический трафик просто проходит мимо.
Ниже разбираю реальный отчёт по SEO и технической оптимизации сайта доставки еды. Интернет-магазин на OpenCart (ocStore 3.0.2.0), две языковые версии — украинская и русская. Работы завершены 29.10.2026. Результатов в позициях ещё нет, их будет видно через несколько недель, поэтому здесь только о том, что сделано и зачем.
Содержание статьи
- Как я вносил изменения
- Контент: категории, главная, заведения, контакты
- Блог
- Условия доставки: одинаковые на всех страницах
- Страницы доставки по районам
- Техническое SEO
- Внутренняя перелинковка
- Микроразметка и превью
- Новое заведение в Чугуеве
- Google Business
- Скорость
- Оформление заказа
- Что осталось программисту
- Сводная таблица изменений
- Что дальше
- Сколько стоят такие работы
- FAQ
| Показатель | Было | Стало |
|---|---|---|
| Категории с текстами и мета-тегами | устаревшие или пустые | 15 × 2 языка |
| Статьи блога | устаревшие | 49 переписано + 4 новые |
| Страницы доставки по районам | 0 | 11 × 2 языка |
| URL в карте сайта | 620 с мусором, UA-карта с ошибкой | 408 живых в каждой карте |
| CLS главной на мобильных | 0,383 | 0 |
| Переадресации 301 | — | 64 |
Как я вносил изменения
Все изменения в базе и файлах я делал скриптами. Каждый скрипт сначала показывает предпросмотр «было → станет», делает резервную копию и имеет кнопку отката. Это важно, когда работаешь на живом сайте, через который каждый день идут заказы.
Повторный запуск скрипта ничего не дублирует: если блок уже добавлен, скрипт его пропускает. После каждого применения очищался кэш шаблонов, а результат я проверял на сайте и в Search Console.
Контент: категории, главная, заведения, контакты
Категории. Для 15 категорий меню (пицца, бургеры, фри, акции, WOK, пиццоне, суши, суши-сеты, салаты, супы, десерты, завтраки, напитки, пиво, алкоголь) на двух языках написал блок «Подробно» внизу страницы, meta title и meta description. Категории — главные посадочные страницы под запросы вроде «пицца доставка Бровары» или «суши Троещина». Раньше тексты были устаревшими или пустыми, да ещё и с неправильной суммой бесплатной доставки. Новые тексты собрал под реальные запросы из Search Console.
Главная и страницы заведений. Новый текст и мета-теги, актуальные условия доставки. Страницы трёх заведений (Троещина и два в Броварах) получили новые тексты. Закрытые точки отметил «закрыто» с предложением заказать доставку из действующих заведений. Информация о закрытых точках вводила клиентов в заблуждение, а трафик на эти страницы не должен теряться. Локальные запросы вроде «пиццерия Троещина» ведут именно сюда. В шаблон страницы заведения добавил стили, потому что текст там плохо читался.
Контакты. В заголовке H1, title и description страницы контактов не было Чугуева, где открылось новое заведение. Теперь есть: «Телефоны и адреса пиццерий — Киев, Бровары, Чугуев». Заодно убрал устаревшую пометку «обновлено» с датой в title.
Мета-теги товаров. Раньше у всех товаров были одинаковые шаблонные заголовки. Для 100 приоритетных записей (топ-50 товаров по показам × 2 языка) написал индивидуальные title и description. Код карточки товара доработал так: если у товара заполнены собственные мета-теги, используются они, иначе — общий шаблон, как и раньше. Заодно исправил эмодзи в мета-тегах: база в кодировке utf8 не хранит 4-байтовые эмодзи, и они превращались в «?». Таких записей было 172, эмодзи заменил на допустимые символы.
Блог
49 статей переписано. Взял статьи, у которых уже были показы в Google: новые заголовки H1, тексты, мета-теги, внутренние ссылки на категории и другие статьи, блок «Читайте также» в конце. Убрал устаревшие акции, неправильные суммы и адреса закрытых точек. Обе языковые версии. В шаблоне статьи исправил стили: заголовки наезжали на текст.
4 новые статьи под информационные запросы, каждая на двух языках и с баннером 1920×600:
| Статья | Под какие запросы | Публикация |
|---|---|---|
| Калорийность пиццы | калорийность пиццы, ккал в куске | опубликовано |
| Пицца 30 или 40 см | какую пиццу заказать, сколько пицц на компанию | опубликовано |
| Чикен ролл: что это, состав и цена | чикен ролл что это, состав, цена | 30.10 |
| Сколько роллов заказать на человека | сколько роллов заказать, суши-сет на компанию | 30.10 |
Блог собирает информационный трафик и передаёт вес категориям через внутренние ссылки. А актуальные факты в статьях — это доверие и конверсия.
Условия доставки: одинаковые на всех страницах
Это, пожалуй, самая важная часть для бизнеса. Страница «Доставка и оплата» была только на русском, с устаревшими условиями и без правого берега. Теперь она на двух языках, с таблицами по зонам:
| Зона | Районы | Мин. заказ | Принимаем до | Время доставки |
|---|---|---|---|---|
| 1 | Киев: Троещина, Воскресенка, Лесной, Русановка, Левобережный, Березняки; Бровары | 400 грн | 22:00 | до 59 мин |
| 2 | Сёла возле Броваров: Погребы, Калиновка, Квитневое, Требухов, Княжичи | 800 грн | 22:00 | до 89 мин |
| 3 | Киев: ДВРЗ; возле Броваров: Гоголев, Безугловка, Чубинское, Счастливое, Гора | 1200 грн | 21:00 | до 89 мин |
| 4 | Киев: Позняки, Осокорки, Харьковский, Дарница, Бортничи + правый берег | 2000 грн | 21:00 | до 89 мин |
| Чугуев 1 | Центр города | 400 грн | 21:00 | до 59 мин |
| Чугуев 2 | Микрорайон Авиатор и окрестности | 800 грн | 20:30 | до 89 мин |
| Чугуев 3 | Эсхар, Малиновка, Клугино-Башкировка | 1300 грн | 20:00 | до 89 мин |
Но обновить одну страницу мало. Старые условия разошлись по описаниям категорий, статьям и страницам заведений. Отдельный скрипт исправил их везде. Например, для дальней зоны в текстах стояло «от 400 грн, до 59 минут», а на самом деле — «от 2000 грн, до 89 минут, до 21:00». Для ДВРЗ и сёл указал их минимальные суммы и везде добавил ссылку на страницу условий.
Что это значило на практике: клиенты из отдалённых районов читали «бесплатно от 400 грн» и получали отказ от оператора. Одинаковые условия на всех страницах — меньше отказов и жалоб, больше доверия и от людей, и от Google.
Страницы доставки по районам
Создал 11 посадочных страниц под запросы «доставка пиццы + район», каждую на двух языках — 22 URL: Позняки, Осокорки, Харьковский массив, Бортничи, ДВРЗ, Березняки, Русановка, Воскресенка, Лесной массив, Левобережный массив, Правый берег.
- на каждой странице: условия именно этой зоны, ориентиры района, популярные блюда, акции, блок «Вопросы и ответы», кнопки на меню и телефон;
- баннеры 1920×600 сгенерировал в Gemini и конвертировал в WebP, отдельно для UA и RU версий;
- на страницы районов поставил ссылки со страницы условий доставки и из статей о левом береге;
- публикация 30.10, в тот же день — запрос индексации в Search Console для 6 главных URL.
Раньше по запросам вроде «пицца Осокорки» или «доставка пиццы Позняки» на сайте просто не было подходящей страницы. Отдельная страница под район — основной способ получить такой трафик.
Техническое SEO
Карты сайта. Старая карта содержала 620 URL: удалённые товары, дубли, адреса вида index.php?route=…, страницы пагинации. Украинская карта вообще отдавала ошибку и не попадала в Google. Теперь две карты, /sitemap.xml (RU) и /sitemap-ua.xml (UA), по 408 URL: только товары из активных категорий, категории, статьи и заведения. Статус в Search Console — «Успешно».
robots.txt. Добавил строку с украинской картой, закрыл служебные разделы (логин, админку, системные папки), поиск и сортировку.
«Битые» товары и 301. Нашёл товары без активной категории: их страницы отдавали ошибку 500. 32 товара отключил и убрал из карт сайта. Добавил 64 правила 301 со старых URL отключённых товаров и устаревших страниц на актуальные разделы меню. Ошибки 500 портят оценку сайта в Google, а переадресации сохраняют накопленный вес и клиентов, которые приходят по старым ссылкам.
Canonical. Search Console показывал страницы заведений как «Копия, канонический вариант не выбран»: каждая открывалась ещё и по адресу с чужим языковым slug, а тега canonical не было (у статей он был). Добавил canonical, как в статьях блога — одна строка в контроллере.
Язык страницы. Было lang="ua", стало lang="uk". Кода «ua» в стандарте нет, и Google мог неправильно определять язык.
Внутренняя перелинковка
- в описания 13 категорий (оба языка, 26 записей) добавил блок «Полезное из блога» с 1–4 профильными статьями;
- под статьями — 3 карточки похожих статей «Ещё из блога», подбор по теме: пицца, суши, бургеры, акции, дети. Показываются только там, где нет собственного «Читайте также», а старые акции и закрытые заведения не предлагаются;
- на страницы районов поставил ссылки со страницы условий доставки и из статей о соответствующих районах.
Внутренние ссылки ускоряют индексацию новых страниц, передают вес категориям, а пользователь дольше остаётся на сайте.
Микроразметка и превью
Товары (Product). Старая разметка была с ошибками: вместо названия блюда — название категории, ошибка в поле цены (lowprice вместо lowPrice), без фото и описания, а для товаров без размеров цена считалась из строки «250 грн». Теперь есть название блюда, фото, описание, бренд, цена (для пиццы 30/40 см — диапазон «от–до», для остальных — одна цена), наличие. Проверка Google «Описания товаров» и «Данные о товарах продавца» — без ошибок. Корректная разметка позволяет показывать в выдаче цену и фото, а это заметнее обычной ссылки.
Заведения (Restaurant). На страницах четырёх действующих заведений: название, адрес, телефон, часы работы (10:00–22:00, в Чугуеве до 21:00), кухня, ссылка на меню и на профиль в Google Картах. Разметка подтверждает Google адреса и часы работы для локального поиска.
Организация (Organization) — в шапке сайта: название и альтернативное название, логотип в PNG, телефон, служба поддержки на украинском и русском, соцсети (Facebook, Instagram, YouTube, Telegram), приложения в App Store и Google Play.
FAQPage — на страницах районов блок «Вопросы и ответы» автоматически превращается в разметку: на Осокорках 3 вопроса, на Позняках 5.
Open Graph. Раньше картинкой превью на всех страницах был логотип в SVG, который мессенджеры не показывают. Ссылки в Telegram, Viber и Facebook отправлялись без картинки. Теперь у товара — фото блюда, у статьи — её баннер, на остальных страницах — общая картинка 1200×630 с логотипом и телефонами. Язык превью (og:locale) зависит от языка страницы: uk_UA или ru_UA. Красивое превью — больше переходов из чатов.
Новое заведение в Чугуеве
1 июля 2026 года сеть открыла заведение в Чугуеве, а на сайте его не было. Создал страницу на двух языках: дата открытия, самовывоз и места в зале, 3 зоны доставки, меню, акции, карта. Фото взял из баннера новости об открытии.
- разметка Restaurant: адрес, телефон, время закрытия 21:00;
- Чугуев добавлен в H1, title и description страницы контактов;
- проверка Google «Местные компании» и «Организация» — без ошибок.
Google Business
В разметку Restaurant четырёх заведений добавил ссылки на их профили в Google Картах (hasMap, sameAs). Так Google связывает страницу сайта с профилем заведения на картах.
Во время проверки нашёл, что в одном из аккаунтов Google Business висят 3 старых заблокированных профиля со старыми адресами. Действующие заведения — в другом аккаунте. Такие вещи стоит знать до того, как разбираться с локальной выдачей.
Скорость
Сдвиг вёрстки (CLS). На мобильных главная «прыгала» во время загрузки слайдера: CLS 0,383 при норме до 0,1. Зарезервировал место под слайдер и загрузил первый слайд сразу с высоким приоритетом. Результат — CLS 0. В Search Console 29.10 запустил проверку исправления, она длится до 28 дней.
Баннеры в WebP. Баннеры слайдера главной теперь отдаются в WebP: они легче JPG при том же качестве. Для этого модуль обработки картинок получил параметр WebP, а на главной изменено 6 вызовов. Шрифты получили font-display: swap, чтобы текст был виден сразу, без ожидания шрифта. С главной убрал 4 картинки «лоадера», которые грузились с тестового домена.
Лишнее с каждой страницы:
| Что | Почему убрано |
|---|---|
| Шрифт Open Sans из Google Fonts | Не используется (на сайте другой шрифт), блокировал отрисовку |
| select2 (JS + CSS) | Не вызывается ни в одном шаблоне, а грузился на всех страницах |
| swiper (JS 204 КБ + CSS) | Слайдеры работают на другой библиотеке |
| Google Maps API | Теперь грузится только на странице с картой |
| 4 картинки «лоадера» | Грузились с тестового домена |
После применения проверил: в шапке остались только jQuery и основной файл стилей, слайдер, корзина и оформление заказа работают, ошибок в консоли нет.
Оформление заказа
Поле Email в форме оформления никто не заполнял. Я его скрыл, но значение по-прежнему передаётся, так что обработка заказа и выгрузка в учётную систему iiko (Syrve) не затронуты. Тестовый заказ после правки прошёл.
Долгое оформление. После нажатия «Оформить заказ» индикатор крутился 5–6 секунд. Я замерил каждый шаг и нашёл причину: при каждом заказе сайт заново загружает из iiko (Syrve) всё меню, около 9 МБ. Только это занимает 4,35 секунды.
| Шаг оформления | Время |
|---|---|
| Токен Syrve | 0,05 с |
| Загрузка всего меню (9 072 КБ) | 4,35 с |
| Разбор меню (61 МБ памяти) | 0,10 с |
| Группы терминалов | 0,05 с |
| Письмо администратору через SMTP | 0,02 с, ошибка |
| Итого без создания заказа | 4,57 с |
| Создание заказа и проверка статуса | ещё ~1–3 с |
Решение — хранить меню на сервере 10 минут и не тянуть его каждый раз. Детали ниже, в задачах для программиста.
Голодный человек не хочет ждать 6 секунд после клика по кнопке. О том, как оформление заказа убивает конверсию в доставке еды, я писал отдельно.
Google Ads · МаркетингCRO для Google Ads: не реклама сливает бюджет. Его сливает ваш сайтРеклама приводит на страницу, а продаёт сайт. Два разбора: лендинг и карточка товара. Что мешает конверсии и как удешевить заявки без смены рекламы.
Что осталось программисту
Часть задач не стоит делать без программиста, который поддерживает сайт. Для каждой я описал причину, где именно ошибка и готовое решение.
1. Кэш меню iiko (Syrve) — важно
Сайт при каждом заказе загружает всё меню из учётной системы — 9 МБ и 4,35 секунды. Решение: хранить меню на сервере 10 минут. Если в кэше не найдётся товара из корзины (например, его только что добавили в iiko), сайт сам загрузит свежее меню и повторит попытку, так что заказы не потеряются. Готовый скрипт с бэкапом и откатом передал — его можно применить или взять за образец.
2. Заказы в логе остаются в статусе «pending»
Каждый заказ в логе заканчивается записью «После трёх проверок создание заказа ещё продолжается». Сайт трижды проверяет статус в Syrve с паузой 0,2 секунды и не дожидается подтверждения, поэтому сверка суммы не выполняется. Нужно убедиться, что все заказы доходят в iiko, и увеличить паузу, например, до 1 секунды.
3. Защита от ошибки 500 на товарах без категории — важно
Если у товара нет категории или её удалили, открытие карточки товара уходит в бесконечную рекурсию в методе построения «хлебных крошек», и сайт отдаёт 500. Последствия я убрал вручную (32 товара отключено), но причина осталась: после любого удаления или переноса категории ошибка вернётся. Для программиста описал три шага: безопасный метод с защитой от пустого результата и ограничением глубины, проверку в контроллере товара и, желательно, 404 или 301 для товаров без активной категории. Плюс как это проверить на тестовом товаре.
4. jQuery подключается дважды
Одна версия в шапке, вторая в подвале. Вторая перезаписывает первую, и плагины, подключённые к первой, теряются. Нужно оставить одну версию, проверить встроенные скрипты в шаблонах и перенести загрузку скриптов в конец страницы или подключить с defer.
5. main.css на 232 КБ блокирует отрисовку
Критические стили первого экрана стоит вынести в шапку, а остальное подгружать асинхронно. Это главный резерв ускорения LCP на мобильных.
6. Очистка сервера и персональные данные
- убрать временные скрипты, бэкапы и мусор из корня сайта после проверки всех правок;
- файлы выгрузок из iiko (~90 МБ) с телефонами и именами клиентов лежат в публичной папке. Прямой доступ я закрыл, но их нужно вынести за пределы сайта или удалить;
- очистить
error.logна 17 МБ.
7. Письма о заказах через SMTP
Письмо администратору отправляется синхронно через Gmail с таймаутом 5 секунд, а во время замера оно вернуло ошибку. Нужно проверить, доходят ли письма. Если не нужны — отключить, это сократит оформление заказа.
Сводная таблица изменений
Чтобы программист или следующий подрядчик понимал, что изменено, в отчёте есть полный перечень файлов и таблиц базы.
| Файл | Что изменено |
|---|---|
product/product.php | Собственные мета-теги товара; фото для Open Graph; корректная разметка Product и расчёт цены |
product/product.twig | Старый блок разметки заменён новым |
posts/news.php | «Ещё из блога»; баннер статьи в превью; FAQPage |
posts/news_info.twig | Стили текста статьи; карточки «Ещё из блога»; вывод FAQPage |
posts/restaurantsList.php | Canonical; разметка Restaurant (4 заведения, время закрытия, hasMap / sameAs) |
restaurantsList_info.twig | Стили текста; вывод разметки Restaurant |
common/header.php | Картинка и язык для Open Graph; lang="uk" |
common/header.twig | og:image и og:locale; разметка Organization; убраны Google Fonts |
common/footer.twig | Google Maps API только на странице с картой |
common/home.twig | CLS: место под слайдер, первый слайд без отложенной загрузки, убран лоадер |
common/home.php, tool/image.php | Баннеры в WebP |
main.css | font-display: swap |
checkout/form.php | Отключено подключение select2 |
module/banner.php | Отключено подключение swiper (также carousel и slideshow) |
checkout/form.twig | Поле Email скрыто |
feed/custom_sitemap.php | Чистые карты сайта RU и UA |
robots.txt | Карта UA, закрытие служебных URL |
.htaccess | 64 переадресации 301, адреса карт сайта |
image/og-default.jpg | Новая типовая картинка превью |
| Таблица базы | Что изменено |
|---|---|
oc_category_description | Тексты, мета-теги, «Полезное из блога», условия доставки — 15 категорий × 2 языка |
oc_posts_description | 49 статей обновлено; 4 новые статьи, 11 страниц районов, страница заведения × 2 языка; условия доставки; контакты; тексты заведений и главной |
oc_product_description | Мета-теги 100 записей, исправление эмодзи в 172 записях |
oc_product | 32 товара без категории отключено |
Резервные копии базы и файлов сохранены, откат — кнопкой в соответствующем скрипте.
Что дальше
- 30.10: поле «Сайт» в профилях Google Business — ссылка на страницу своего заведения с UTM-метками;
- 30.10: запрос индексации страниц районов и замер PageSpeed после правок скорости;
- через 2–3 недели в Search Console: CLS, индексация страниц районов и новых статей, исчезновение дублей заведений, расширенные результаты (товары, местные компании);
- через 4–6 недель: позиции и клики по запросам «доставка пиццы + район» и по новым статьям;
- страница «Доставка пиццы в Чугуеве» по аналогии с районами Киева;
- наполнение профилей Google Business: меню, фото, публикации;
- следующие статьи: «Пицца на тонком тесте», «Бортики для пиццы», «Запечённые или темпура роллы», «Что заказать к пиву».
Когда появятся цифры, покажу их отдельно.
Сколько стоят такие работы
Ориентировочная оценка такого объёма работ на рынке Украины — $3 500–6 500, если делает фрилансер. Агентство за такой объём выставило бы примерно $6 000–10 000. Это ориентир по текущим ставкам на рынке, а не прайс.
| Блок | Объём | Оценка |
|---|---|---|
| Аудит: Search Console, индексация, код | анализ и план | $150–300 |
| Контент категорий | 15 × 2 языка, тексты и мета-теги | $300–450 |
| Обновление блога | 49 статей × 2 языка | $1 000–2 000 |
| Новые статьи | 4 × 2 языка | $150–300 |
| Страницы районов и условия доставки | 11 × 2 языка + страница условий | $450–900 |
| Главная, заведения, контакты | тексты, мета-теги, новое заведение в Чугуеве | $200–350 |
| Мета-теги товаров | 100 шт. + исправление эмодзи | $100–200 |
| Техническое SEO | карты сайта, 64 редиректа, ошибка 500, canonical, lang | $300–600 |
| Микроразметка и Open Graph | Product, Restaurant, Organization, FAQ | $200–400 |
| Скорость | CLS, WebP, очистка скриптов | $250–500 |
| Баннеры | ~25 шт., генерация и WebP | $100–250 |
| Диагностика оформления заказа | замеры, ТЗ для программиста | $100–200 |
| Отчёты | 2 PDF | $100–200 |
| Итого | ≈ $3 400–6 650 |
Такое SEO я делаю в пакете с Google Ads и рекламой в ChatGPT — $1000 в месяц.
Кейс Google Ads · Доставка едыКейс доставки еды в Google Ads | Локальный бизнес | CPL 42 грн6+ лет сотрудничества с сетью доставки пиццы. CPL 41,26 грн по всем кампаниям, 174 грн без бренда. Как манипулируют цифрами в кейсах Google Ads.
16 — СайтCRO-аудит сайтаАнализ сайта с точки зрения конверсии: что мешает пользователю из рекламы оставить заявку или сделать заказ. Список конкретных правок с приоритетами.
Где меня найти
Пишите в Telegram или на почту — отвечаю быстро. Telegram-канал и YouTube — для тех, кто хочет увидеть реальные кейсы перед обращением и понять мой подход к работе.