Начните со сверки двух наборов: offer id из той версии YML, которая передана в Директ, и товарных ID из событий сайта. Если просмотр, корзина или покупка отправляют другой ключ, исправный XML ещё не обеспечивает связь поведения посетителя с товаром.
В требованиях Яндекс Директа к YML прямо указано: товарные ID электронной коммерции должны совпадать с offer id для корректного офферного ретаргетинга в РСЯ. Ниже — протокол проверки этой связи для магазина, у которого такой сценарий уже доступен в аккаунте. Он подходит и для команды в Беларуси: сверка выполняется локально, без покупки сервиса и передачи клиентских данных.
Сначала определите, какой объект обозначает ID
Одна карточка может объединять модель кресла и несколько вариантов цвета. Если фид описывает чёрный вариант как CHAIR-202-BLACK, а событие корзины передаёт родительский CHAIR-202, это разные ключи. Одинаковое название и правильная цена расхождение не устраняют.
Зафиксируйте единицу учёта вместе с разработчиком: модель, вариант или комплект. Затем укажите поле-источник в CMS для выгрузки и каждого события. Не начинайте с удаления префиксов или ведущих нулей: сначала нужно доказать, что обе записи относятся к одному объекту.
В собственном формате электронной коммерции Метрики товар находится в массиве products, его ключ — id. Для описания товара справка допускает id или name, но наличие одного названия не решает задачу сопоставления с фидом. ID покупки в purchase.actionField.id обозначает заказ; сравнивать его с offer id нельзя. Для сайта с GA4-форматом сначала проверьте фактический items[].item_id и способ его обработки вашей интеграцией.
Соберите проверяемый срез
Сохраните файл фида, URL источника, время скачивания и контрольную сумму. Проверьте его в анализаторе товарных фидов: структура и уникальность ключей нужны до межсистемной сверки. Если в файле два одинаковых offer id, сначала разберите дубли идентификаторов.
Для событий подготовьте таблицу: одна строка — один товар внутри одного события. Покупка с тремя товарами даст три строки с общим идентификатором события. Количество единиц товара остаётся отдельным полем и не увеличивает число строк автоматически.
Минимально сохраните row_id, время, действие, исходный товарный ID, URL карточки и выбранный вариант. Укажите также источник наблюдения: сообщение в dataLayer, отправленный запрос или обработанные данные. Эти уровни проверки дают разные доказательства. Выберите контрольные товары с вариантами, числовыми ID, ведущими нулями и недавними изменениями; такая выборка помогает найти дефекты, но не измеряет весь трафик магазина.
Таблицу можно собрать при контрольном проходе: открыть карточку, выбрать вариант, добавить его в корзину и оформить разрешённый тестовый заказ. Не отправляйте вымышленные покупки в рабочий счётчик без согласованного способа исключения теста. Для каждого шага сохраните исходное значение, не меняя регистр, пробелы, префикс или формат числа. Телефоны, email, имена покупателей и содержимое заказа для этой задачи не нужны.
Учебный пример: три совпадения из восьми строк
В вымышленном фиде четыре уникальных ID: 00101, CHAIR-202-BLACK, 303 и SPARE-404. Проверяем восемь товарных строк событий. Это синтетические данные для воспроизведения метода.
| Строка | Действие | ID в событии | Результат точной сверки |
|---|---|---|---|
| R1 | просмотр | 00101 | найден в фиде |
| R2 | корзина | 101 | не найден: проверьте потерю нулей |
| R3 | просмотр | CHAIR-202-BLACK | найден в фиде |
| R4 | корзина | CHAIR-202 | не найден: проверьте модель и вариант |
| R5 | покупка | SKU-303 | не найден: проверьте источник префикса |
| R6 | просмотр | пусто | ID отсутствует |
| R7 | покупка | 303 | найден в фиде |
| R8 | просмотр | OLD-9 | не найден: проверьте состав выгрузки |
Получились три точных совпадения, четыре ненайденных ключа и одна пустая строка. Локальная доля совпавших товарных строк — 3 / 8 = 37,5%. Знаменатель включает пустой ID; исключить его молча означало бы скрыть часть дефектов. Это результат учебной выборки, а не показатель сопоставления из Директа и не доля потерянных продаж.
Схема основана на таблице выше. Ненайденный ключ требует разбора причины; он не всегда означает ошибку магазина.
OLD-9 может принадлежать товару, который сознательно исключён из рекламного ассортимента. Тогда нужно подтвердить правило исключения и выделить такую строку в отдельную группу. SPARE-404 присутствует в фиде, но не встречается в контрольных событиях: само по себе это нормально. Посетители и тестировщик не обязаны просмотреть каждый товар каталога.
Повторите точную сверку локально
Для небольшого согласованного среза достаточно Python 3. Сохраните ниже events.csv и запустите код рядом с доверенным YML-файлом feed.yml. CSV хранит ID как текст. Скрипт поддерживает обычный YML без XML-пространств имён; он не скачивает файлы и не отправляет данные в аналитику.
Для воспроизведения чисел сохраните такой минимальный feed.yml. Это сокращённый XML только для локальной сверки ID; для загрузки в Директ нужны остальные поля полноценного товарного фида.
<yml_catalog><shop><offers>
<offer id="00101"/>
<offer id="CHAIR-202-BLACK"/>
<offer id="303"/>
<offer id="SPARE-404"/>
</offers></shop></yml_catalog>row_id,action,item_id
R1,detail,00101
R2,add,101
R3,detail,CHAIR-202-BLACK
R4,add,CHAIR-202
R5,purchase,SKU-303
R6,detail,
R7,purchase,303
R8,detail,OLD-9import csv
from collections import Counter
from xml.etree import ElementTree as ET
root = ET.parse("feed.yml").getroot()
ids = [offer.get("id", "") for offer in root.findall("./shop/offers/offer")]
if not ids or any(not value.strip() for value in ids):
raise ValueError("Нет офферов или найден пустой offer id")
if any(count > 1 for count in Counter(ids).values()):
raise ValueError("Сначала устраните дубли offer id")
feed_ids = set(ids)
with open("events.csv", encoding="utf-8-sig", newline="") as src:
rows = list(csv.DictReader(src))
if not rows:
raise ValueError("Нет товарных строк событий")
row_ids = [row["row_id"] for row in rows]
if any(not value.strip() for value in row_ids) or len(set(row_ids)) != len(rows):
raise ValueError("row_id должен быть непустым и уникальным")
for row in rows:
value = row["item_id"]
if value is None:
raise ValueError("Неполная строка CSV")
row["status"] = ("MISSING_ID" if not value.strip() else
"MATCH" if value in feed_ids else "NOT_IN_FEED")
with open("audit.csv", "w", encoding="utf-8-sig", newline="") as dst:
out = csv.DictWriter(dst, fieldnames=["row_id", "action", "item_id", "status"])
out.writeheader()
out.writerows({key: row[key] for key in out.fieldnames} for row in rows)
print(dict(Counter(row["status"] for row in rows)))На учебных файлах результат: MATCH: 3, NOT_IN_FEED: 4, MISSING_ID: 1. Для своего магазина используйте сохранённую версию рекламного фида и собственную таблицу контрольных наблюдений. Совпадение проверяется посимвольно; код специально не превращает 00101 в 101 и не заменяет SKU-303 на 303.
Передайте исправление конкретному владельцу
Для R2 сопоставьте исходный ID в CMS с шаблонами просмотра и корзины: если просмотр сохраняет нули, а корзина их теряет, ошибка находится между этими слоями. Для R4 проверьте передачу выбранного варианта после смены цвета. Для R5 выясните, какой модуль добавил префикс. Это направления проверки, а не доказанные причины по одному внешнему виду ключа.
Задача разработчику должна содержать строку отчёта, URL и вариант, ожидаемый offer id, фактический ID события, способ воспроизведения и версию фида. Например: «После выбора чёрного кресла событие add передаёт CHAIR-202; фид содержит CHAIR-202-BLACK. Согласуйте источник ID варианта, затем повторите просмотр, корзину и покупку». Массово менять ключи фида ради одного сломанного события без проверки действующих связей рискованно.
Примите исправление на двух уровнях
Сначала повторите локальную сверку: нужные товары и варианты имеют согласованные ключи, пустые значения устранены, исключения документированы, неожиданных дублей в фиде нет. Повторите тот же набор сценариев, чтобы исправление корзины не сломало покупку.
Затем проверьте фактическое получение данных по инструкции Метрики и состояние фида в рекламном аккаунте. Запись в контейнере браузера ещё не доказывает доставку события; наличие ключа в скачанном YML не подтверждает, что площадка уже обработала именно эту версию. Полную настройку событий продолжайте по руководству по электронной торговле, приёмку файла — по чек-листу исправленного фида.
Готовый результат проверки — версия фида, исходные наблюдения, таблица исключений и повторный контроль после исправления. Даже полное совпадение ID в выборке не подтверждает доступность рекламного формата для аккаунта, настройки аудиторий, модерацию, показы или рост продаж.
Источники
Материал подготовлен редакцией WiseLab с помощью AI. Источники и фактические утверждения проверены при подготовке.
Что думаете?
Загружаем комментарии…