Для великого інтернет-магазину мікророзмітка часто стає тим завданням, яке всі розуміють, але постійно відкладають. Причина проста: коли товарів тисячі, ручне додавання JSON-LD у шаблони або через адмінку стає повільним, а плагіни не завжди дають той рівень контролю, який потрібен SEO-фахівцю або вебмайстру. У результаті частина сторінок живе без Product, частина — з урізаною схемою, а BreadcrumbList або взагалі відсутній, або працює нестабільно.

Центрований аркуш Google Sheets, що перетворює дані на блоки розмітки Schema.org; м’які тіні, світлий фон
Центрований аркуш Google Sheets, що перетворює дані на блоки розмітки Schema.org; м’які тіні, світлий фон

Саме тут і починається нормальний engineering approach. Не навантажувати CMS зайвими модулями, а винести генерацію даних туди, де зручно ними керувати: у Google Sheets. Якщо таблиця вже містить назву товару, URL, ціну, валюту, бренд і ланцюжок хлібних крихт, цього достатньо, щоб збирати готовий JSON-LD автоматично. А далі — або імпортувати його на сайт, або вставляти через шаблон, GTM чи базу даних.

Чому саме JSON-LD, а не черговий плагін

JSON-LD та плагіни: порівняння
JSON-LD та плагіни: порівняння

У цій задачі важлива не “магія розширених сніпетів”, а чистота реалізації. Плагіни часто тягнуть за собою шаблонну логіку: одні й ті самі поля для всіх типів сторінок, обмежені налаштування, дублювання розмітки, конфлікти з темою або іншими SEO-модулями. На невеликому сайті це ще терпимо. На великому e-commerce це швидко перетворюється на технічний борг.

JSON-LD дає іншу модель роботи. Ви тримаєте дані окремо, формуєте код передбачувано і точно знаєте, що саме виходить у фіналі. Це особливо корисно там, де каталог великий, CMS самописна, або магазин працює на OpenCart чи WordPress, але власник не хоче вантажити сервер ще одним “універсальним рішенням”.

Якщо ви вже вибудовуєте масові SEO-процеси через таблиці, логічно також подивитися статтю про масову генерацію SEO-тегів через Google Sheets. Вона добре стикується з цією темою: спочатку ви стандартизуєте мета-теги, далі — структуровані дані.

Що підготувати в Google Sheets

База має бути дуже простою. Для Product і BreadcrumbList достатньо таких колонок:

  • A — Назва товару
  • B — URL
  • C — Ціна
  • D — Валюта
  • E — Бренд
  • F — Наявність
  • G — Категорія 1
  • H — Категорія 2
  • I — Назва поточної сторінки
  • J — JSON-LD Product
  • K — JSON-LD BreadcrumbList

Цього вже вистачає, щоб зібрати керований генератор Schema.org JSON-LD без плагінів. Якщо у вас є рейтинг і кількість відгуків, можна додати ще дві колонки. Якщо ні — не вигадуйте їх штучно. У мікророзмітці краще менше, але правдиво.

Обов’язкові та рекомендовані поля: не плутайте ці поняття

Одна з найчастіших технічних помилок — намагатися одразу напхати в розмітку все, що тільки існує в Schema.org. Але на практиці потрібно розділяти дві речі:

  • поля, без яких Google не зможе нормально прочитати або використати ваш тип розмітки;
  • поля, які не є критичними, але роблять результат повнішим.

Для Product це особливо важливо. Якщо сторінка не є сторінкою одного товару, а є списком товарів або категорією, чекати стабільного rich result під Product не варто. Такі сторінки краще не змішувати з реальною товарною розміткою. Тобто не все, що технічно можна розмітити, потрібно розмічати саме як Product.

З BreadcrumbList логіка ще простіша: це ланцюжок сторінок, який має показати ієрархію шляху. Якщо хлібні крихти хаотичні, різняться між шаблонами або не збігаються з реальною навігацією сайту, Google отримає не підказку, а шум.

Магія автоматизації: один скрипт для двох типів розмітки

Магія автоматизації створення JSON-LD схем
Магія автоматизації створення JSON-LD схем

Нижче — базовий Apps Script, який читає дані з рядка таблиці й збирає два готових JSON-LD блоки: Product і BreadcrumbList.

    function buildSchemaJsonLd() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      const lastRow = sheet.getLastRow();

      for (let i = 2; i <= lastRow; i++) {
        const name = sheet.getRange(i, 1).getValue();   // A
        const url = sheet.getRange(i, 2).getValue();    // B
        const price = sheet.getRange(i, 3).getValue();  // C
        const currency = sheet.getRange(i, 4).getValue(); // D
        const brand = sheet.getRange(i, 5).getValue();  // E
        const availability = sheet.getRange(i, 6).getValue(); // F
        const cat1 = sheet.getRange(i, 7).getValue();   // G
        const cat2 = sheet.getRange(i, 8).getValue();   // H
        const pageName = sheet.getRange(i, 9).getValue(); // I

        const productSchema = {
          "@context": "https://schema.org",
          "@type": "Product",
          "name": name,
          "brand": {
            "@type": "Brand",
            "name": brand
          },
          "offers": {
            "@type": "Offer",
            "url": url,
            "priceCurrency": currency,
            "price": String(price),
            "availability": availability
          }
        };

        const breadcrumbSchema = {
          "@context": "https://schema.org",
          "@type": "BreadcrumbList",
          "itemListElement": [
            {
              "@type": "ListItem",
              "position": 1,
              "name": cat1,
              "item": "https://example.com/" + encodeURIComponent(cat1.toLowerCase())
            },
            {
              "@type": "ListItem",
              "position": 2,
              "name": cat2,
              "item": "https://example.com/" + encodeURIComponent(cat2.toLowerCase())
            },
            {
              "@type": "ListItem",
              "position": 3,
              "name": pageName,
              "item": url
            }
          ]
        };

        sheet.getRange(i, 10).setValue(JSON.stringify(productSchema, null, 2));
        sheet.getRange(i, 11).setValue(JSON.stringify(breadcrumbSchema, null, 2));
      }
    }

Що тут важливо:

  • Product збирається з фактичних полів сторінки;
  • Offer включає ціну, валюту та availability;
  • BreadcrumbList будується як чіткий ланцюжок;
  • готовий JSON записується прямо в комірки, а далі його вже легко експортувати.

Це й є головна перевага підходу: ви не прописуєте розмітку руками по шаблонах, а генеруєте її як дані.

Як впровадити на сайт без перевантаження CMS

Далі є три робочі сценарії.

Перший — імпорт у базу або шаблон сайту. Це найчистіший варіант, якщо є доступ до розробки і ви можете підставляти JSON-LD із готового поля.

Другий — проміжний експорт. Наприклад, таблиця генерує JSON-фрагменти, а окремий скрипт розкладає їх по сторінках або API.

Третій — вставка через GTM. Це найшвидший шлях для тесту, але не завжди найкращий як фінальна архітектура. Для великого магазину краще, коли дані живуть поруч зі сторінкою й контролюються на рівні шаблону, а не через окремий контейнер.

Як перевіряти результат

Після генерації не можна просто “вірити, що все добре”. Кожен тип розмітки потрібно прогнати через Rich Results Test. Це дозволяє швидко побачити:

  • чи читається код взагалі;
  • чи немає критичних помилок;
  • які поля відсутні;
  • що є лише рекомендованим покращенням, а що вже ламає валідність.

Практично найзручніший підхід такий:

  1. згенерували 5–10 тестових рядків;
  2. вставили JSON-LD на тестові сторінки;
  3. перевірили їх у Rich Results Test;
  4. виправили шаблон;
  5. лише після цього масштабували на весь каталог.

Де тут реальна вигода для SEO

У мікророзмітки є одна сильна сторона: вона добре масштабується, якщо зроблена через дані. Не через “поставили плагін і забули”, а через контрольований шаблон, таблицю і валідацію. Саме тому Google Sheets для SEO розмітки — це не костиль, а нормальний інженерний інструмент.

Для SEO-фахівця це означає менше хаосу в Search Console. Для власника магазину — швидший сайт і менше залежності від сторонніх модулів. Для розробника — зрозумілий JSON-LD, який легко підтримувати й оновлювати.

Schema без плагінів — це не “складніше”, а навпаки чистіше. Ви берете дані, збираєте з них Product і BreadcrumbList, перевіряєте результат і розгортаєте рівно ту розмітку, яка потрібна вашому магазину. Без зайвого навантаження на CMS, без шаблонних SEO-доповнень і без непередбачуваних конфліктів.

У цьому і є технологічний мінімалізм Rocketware: навіщо платити за плагіни та вантажити сервер, якщо можна зробити це елегантно через дані, таблицю і кілька акуратних рядків коду.