<!-- Canonical: https://docs.shopstory.live/docs/guide/analytics-mobile -->

# Mobile tracking и AppMetrica

Приложение клиента отправляет события своей аналитики. Mobile SDK передаёт типизированный product action; embedded player отдельно отправляет события ShopStory. Эти потоки измеряют разные действия: [что измеряется](<https://docs.shopstory.live/docs/guide/analytics>).

Инструкция относится к [native iOS](<https://docs.shopstory.live/docs/guide/mobile-sdk-ios>) и [Flutter на iOS](<https://docs.shopstory.live/docs/guide/mobile-sdk-flutter>). Примеры старого WebView bridge и Android runtime к этой поставке не относятся.

## Когда отправлять событие

1. Получите типизированный product action.
2. Проверьте `payload.feedProductId` и найдите товар в каталоге приложения.
3. Для перехода откройте PDP и при необходимости отправьте событие перехода.
4. Для прямой корзины выполните Cart API с текущей сессией.
5. После подтверждённого изменения отправьте add-to-cart из analytics adapter приложения.

Если оба действия открывают PDP, add-to-cart в этот момент отсутствует. Оно появится только после отдельного успешного добавления на PDP.

В native iOS delegate не имеет completion для корзины player. Flutter handler возвращает типизированный результат adapter, но он не является подтверждением изменения корзины для embedded player. Аналитика магазина должна опираться на Cart API.

## Данные события

| Данные | Источник |
| --- | --- |
| Товарный ID | Проверенный `payload.feedProductId` |
| Источник просмотра | Необязательный `payload.source`: ожидаемые `live`, `vod`, `mini-player` |
| SKU и quantity | Результат cart operation приложения |
| Цена и валюта | Результат Cart API, а не карточка из старого снимка |
| Успех | Подтверждение изменения корзины |
| Order ID | Система заказов; для add-to-cart не нужен |

`source` может отсутствовать или содержать неизвестное значение. В таком случае сохраните `unknown` в своей схеме; не восстанавливайте источник по URL и не подменяйте его предполагаемым Live. Название товара можно уточнить в каталоге приложения.

SDK payload не содержит подтверждённую цену покупки. Нулевая цена вместо неизвестной исказит денежные показатели. Согласуйте обработку неполных данных в analytics adapter.

## AppMetrica

Используйте E-commerce API версии AppMetrica, закреплённой в приложении. Для iOS ориентируйтесь на текущие классы `AppMetrica` и `ECommerce`; старые примеры с `YMM*` не являются инструкцией установки нового SDK.

После подтверждения Cart API создайте `ECommerceProduct` с товарным SKU и `ECommerceCartItem` с `quantity` и `revenue`. В `revenue` передаётся сумма по добавленной позиции с учётом количества и скидок, а не цена одной единицы. Событие `ECommerce.addCartItemEvent(cartItem:)` отправляется через `AppMetrica.reportECommerce`.

`quantity` и `revenue` описывают добавленные единицы. Если Cart API возвращает всю корзину, analytics adapter сначала выделяет результат текущего добавления.

Источник можно передать в product payload под согласованным ключом `shopstory_source`. Это поле схемы клиента, не автоматически добавляемое SDK событие.

Для Flutter вызов AppMetrica выполняет существующий analytics adapter приложения. Mobile SDK ShopStory не устанавливает AppMetrica и не включает analytics plugin вместо клиента.

Примеры поставщика: [E-commerce](<https://appmetrica.yandex.ru/docs/en/data-collection/about-ecommerce>), [iOS Swift ECommerce API](<https://yandex.ru/support/appmetrica-io/ru/sdk/ios/analytics/swift/ECommerce>), [поля ECommerceCartItem](<https://yandex.ru/support/appmetrica-io/ru/sdk/ios/analytics/swift/ECommerceCartItem>), [iOS usage examples](<https://appmetrica.yandex.ru/docs/en/sdk/ios/analytics/ios-operations>).

## Consent и данные

Применяйте принятый в приложении consent flow до передачи события в систему аналитики. Согласуйте его отдельно для аналитики приложения и embedded player. Публичный контракт ShopStory не задаёт универсальный метод отключения всех систем аналитики.

Native SDK получает параметры проекта, товарный ID, SDK/host version и сведения, нужные для media lifecycle. Embedded player имеет собственную аналитику. Полный состав данных конкретной версии и `PrivacyInfo.xcprivacy` проверяются по privacy-документации выданного пакета.

Не передавайте в product action или diagnostics auth tokens, cookies, платёжные данные, профиль покупателя или содержимое корзины. Analytics adapter клиента использует только поля своей согласованной схемы.

## Проверка разработчиком и аналитиком

| Сценарий | Ожидаемый результат |
| --- | --- |
| Открытие товара из player | PDP открыта; add-to-cart не отправлен |
| Подтверждённое добавление | Одно событие с правильным товаром, ценой и quantity |
| Отказ Cart API | Нет успешного add-to-cart |
| Потерянный ответ | Исход проверяется до события и повторной записи |
| Отсутствующий `source` | `unknown` без выдуманного канала |
| Возврат из background | Нет повторного cart event только из-за lifecycle |
| Повторная доставка действия | Нет второй cart operation и события без нового подтверждения |
| Consent запрещён | Поведение соответствует согласованной политике приложения |

Проверьте сначала локальный analytics adapter, затем доставку и отчёт AppMetrica. Отсутствие записи в ShopStory не доказывает отсутствие заказа в системе магазина.
