Я спеціаліст з 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: не реклама зливає бюджет. Його зливає ваш сайтЧому реклама не витягне кривий сайт: два реальні CRO-розбори (лендинг медичного сенсора і картка товару) та чекліст першого екрана.
Що лишилось програмісту
Частину задач не варто робити без програміста, який підтримує сайт. Для кожної я описав причину, де саме помилка і готове рішення.
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 — для тих, хто хоче побачити реальні кейси перед зверненням та зрозуміти мій підхід в роботі.