# События и кампании Shopify

После того как вы подключите приложение и одобрите запрошенные Shopify разрешения на отслеживание заказов, корзин и оформления заказа (`read_orders`, `write_pixels`, `read_customer_events`), события заказов, оформления заказа и его шагов начинают поступать без отдельного экрана отслеживания в Pushwoosh. См. [Предварительные требования](/ru/product/integrations/shopify/#prerequisites) и [Часть 1](/ru/product/integrations/shopify/#part-1-installation) для шага одобрения. Для просмотра на витрине (просмотры товаров и добавление в корзину) также требуется включить [**Push Init Embed**](/ru/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events).

Отслеживание охватывает три независимые группы событий. Каждой требуется свой доступ, поэтому отключение одной не приостанавливает остальные:

* **Оплата заказа и оформление заказа:** поступают от Shopify, даже если [встроенный код темы](/ru/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events) отключён
* **Просмотр на витрине** (просмотры товаров и добавление в корзину): требует, чтобы встроенный код темы был **включён**
* **Шаги оформления заказа:** требуют разрешений Shopify на отслеживание оформления заказа из [Части 1](/ru/product/integrations/shopify/#part-1-installation) (`write_pixels` и `read_customer_events`), одобряемых отдельно от разрешения на отслеживание заказов (`read_orders`) выше

Прежде чем подключать приложение, проверьте [как Pushwoosh обрабатывает типы атрибутов денег и дат](#order-paid-and-checkout-events) для `PW_OrderCreated` и `PW_AbandonedCart`. Неверный тип, отправленный до того, как вы это заметите, задним числом не исправить.

<span id="order-paid-and-checkout-events" />
## События оплаты заказа и оформления заказа

Используйте их для сообщений после покупки (`PW_OrderCreated`), Journey или сегментов по брошенному оформлению заказа (`PW_AbandonedCart` / `PW_AbandonedCartUpdate`) и сопоставления конверсий покупок. Они поступают от Shopify, даже если покупатель блокирует отслеживание в браузере:

<Aside type="caution" title="Требуется подключённое приложение и одобренный read_orders">
Дополнительных переключателей не требуется: подключите приложение в [Части 1](/ru/product/integrations/shopify/#part-1-installation) и одобрите разрешение Shopify на отслеживание заказов (`read_orders`). В отличие от просмотра на витрине, эти события не зависят от того, включён ли встроенный код темы.
</Aside>

| Имя события в Pushwoosh | Когда срабатывает |
| ----- | ----- |
| `PW_OrderCreated` | Заказ оплачен |
| `PW_AbandonedCart` | Покупатель начинает оформление заказа |
| `PW_AbandonedCartUpdate` | Покупатель добавляет, удаляет или изменяет товары в процессе текущего оформления заказа |

Они соответствуют уведомлениям о заказах и оформлении заказа, которые Shopify автоматически отправляет в Pushwoosh (вебхуки `orders/paid`, `checkouts/create` и `checkouts/update`, перечисленные в разделе [Синхронизируемые сущности](/ru/product/integrations/shopify/#synchronized-entities)).

Собственное условие Shopify Flow, вебхук `checkouts/create` и источник Cart блока Products — это три разные вещи, которые все называются **брошенной корзиной**. Выберите то, что соответствует тому, что вы создаёте, используя таблицу ниже.

| Что вы хотите создать | Что использовать |
| ----- | ----- |
| Напоминание из Shopify Flow (собственное условие Shopify **Cart abandonment**) | Shopify Flow + действие **Pushwoosh send notification**. Не имена событий `PW_AbandonedCart`. |
| Напоминание или сегмент в Pushwoosh по началу оформления заказа или изменению корзины | Customer Journey или сегмент по `PW_AbandonedCart` / `PW_AbandonedCartUpdate` |
| Показать товары из корзины покупателя внутри письма | Источник [Cart](/ru/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart) блока Products (использует тег `PW_AbandonedCartID` в момент отправки). Не зависит от того, какой триггер запустил Journey. |

**Как ведут себя эти события.** `checkouts/create` означает лишь то, что оформление заказа было начато. Shopify ещё не определил его как брошенное, и заказ тоже не подтверждён.

Пока покупатель редактирует оформление заказа, `PW_AbandonedCartUpdate` срабатывает снова для того же оформления заказа и перезаписывает корзину, сохранённую из `PW_AbandonedCart`. Письма-напоминания, использующие источник Cart, получают самые актуальные товары в момент отправки. Вам не нужен отдельный триггер Journey только для обновления корзины.

`PW_AbandonedCart` и `PW_AbandonedCartUpdate` устанавливают покупателю тег `PW_AbandonedCartID`, который источник Cart читает в момент отправки. `PW_OrderCreated` сразу его очищает, поэтому покупатель, который уже оформил заказ, пропускает блок вместо получения напоминания о корзине, которой у него больше нет. Точное поведение очистки см. в [Что происходит при отправке PW_OrderCreated](/ru/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#what-happens-when-you-send-pw_ordercreated).

<Aside type="note" title="Покупатель, дважды начавший оформление заказа, повторно входит в Journey только если вы это разрешили">
По умолчанию Customer Journey не допускает повторный вход того, кто уже в нём находится, поэтому второй `checkouts/create` от того же покупателя, пока его первый Journey по брошенной корзине ещё выполняется, игнорируется, а не перезапускает Journey. Включите **Allow re-entry** на триггере, если хотите, чтобы каждое новое оформление заказа сбрасывало таймер напоминания. См. [Управление повторным входом пользователей в кампанию](/ru/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/#control-whether-users-can-re-enter-the-campaign).
</Aside>

### Атрибуты событий заказа и оформления заказа

`PW_OrderCreated` и `PW_AbandonedCart` включают:

| Атрибут | Описание |
| ----- | ----- |
| `orderId` | Идентификатор заказа или оформления заказа |
| `email` | Email покупателя |
| `totalPrice` | Сумма заказа или корзины |
| `shippingAmount` | Стоимость доставки |
| `taxAmount` | Сумма налога |
| `discountAmount` | Сумма скидки |
| `currency` | Код валюты |
| `items` | Позиции корзины |
| `customerId` | Только для зарегистрированных клиентов, отсутствует для гостевого оформления заказа |
| `orderUrl` | Страница статуса заказа для `PW_OrderCreated`, или URL восстановления для брошенного оформления заказа для `PW_AbandonedCart` и `PW_AbandonedCartUpdate`. Используйте его для создания ссылки или кнопки «Завершить покупку». |
| `createdDate` | Когда был создан заказ или оформление заказа |
| `abandonedDate` | Только для `PW_AbandonedCart` и `PW_AbandonedCartUpdate`. Когда корзину в последний раз трогали, а не когда её впервые создали |

<Aside type="caution" title="Указывайте правильные типы атрибутов денег и дат">
Pushwoosh определяет тип каждого атрибута по первому увиденному событию, и это определение ненадёжно для полей денег и дат, таких как `totalPrice`, `shippingAmount`, `taxAmount`, `discountAmount` и `createdDate`/`abandonedDate` выше. Целое число цены, например `129`, определяется как integer, что затем обрезает `129.90` до `129` в каждом последующем событии.

**Ещё не подключили приложение?** Объявите `PW_AbandonedCart` и `PW_OrderCreated` с правильными типами заранее, используя таблицу в [Создание событий в Control Panel](/ru/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#create-the-events-in-your-control-panel). Пропустите шаг **Send the events from your backend** из этого руководства. Интеграция с Shopify уже отправляет их за вас.

**Уже подключили?** Проверьте типы сейчас: перейдите в **Audience → Events** в Control Panel, откройте `PW_AbandonedCart` и `PW_OrderCreated` и сравните каждый атрибут с той же таблицей. Исправление неверного типа там исправляет его на будущее, но любое значение, уже отправленное с неверным типом, потеряно безвозвратно.
</Aside>

Гостевое оформление заказа тоже может отправлять события заказа и корзины, но без идентификатора зарегистрированного клиента в событии.

`PW_AbandonedCartUpdate` содержит те же атрибуты. Если в вашем аккаунте также подключена интеграция [Magento](/ru/product/integrations/magento-integration/), её заказы и брошенные корзины публикуются в эти же имена событий, поэтому сегмент или Journey, построенные на `PW_OrderCreated` / `PW_AbandonedCart`, охватывают оба магазина, и типы атрибутов выше применяются к обоим тоже. У Magento нет аналога `PW_AbandonedCartUpdate`, поскольку она не отслеживает редактирование оформления заказа в процессе.

В частности, `items` приходит от Shopify лишь с несколькими заполненными полями.

<Aside type="note" title="Товары корзины обогащаются из вашего каталога товаров">
`items`, которые Shopify отправляет в `PW_AbandonedCart` и `PW_AbandonedCartUpdate`, содержат только `productId`, `name`, `sku`, `quantity` и `price`. Pushwoosh заполняет всё остальное, чего не хватает для этого товара, например `description`, `imageUrl`, `productUrl`, `category` и другие поля каталога, из соответствующего товара в вашем подключённом [Каталоге товаров](/ru/product/content/product-catalog/) (см. [Автоматическое подключение каталога товаров](/ru/product/integrations/shopify/#connect-your-pushwoosh-app)), когда `productId` совпадает. Для этого ничего дополнительно отправлять не нужно. Товар, отсутствующий в каталоге, просто продолжает отображаться с полями, которые прислал Shopify.
</Aside>

## События просмотра на витрине

Используйте их для сегментов или Journey по прерванному просмотру и для стратегий рекомендаций в email, которым нужны просмотры товаров (например, **Based on what they viewed**). См. [Как настроить рекомендации товаров в email](/ru/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/).

<Aside type="caution" title="Требуется включённый Push Init Embed">
Включите **Push Init Embed** в [Части 4](/ru/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events). Тот же встроенный код темы, что и для web push. Больше ничего добавлять в тему не нужно.

Если встроенный код отключён, или покупатель блокирует его скрипт, вы теряете только просмотры товаров и добавления в корзину. `PW_OrderCreated` и `PW_AbandonedCart` всё равно поступают от Shopify.
</Aside>

Оба события собираются тем же встроенным кодом темы. Больше ничего добавлять в тему не нужно, если **Push Init Embed** включён:

* `PW_ProductViewed`: покупатель открывает страницу товара.
* `PW_AddToCart`: покупатель добавляет товар в корзину без перезагрузки страницы — так это делает большинство тем Shopify.

<Aside type="note" title="Две вещи, которые стоит проверить перед тем, как строить на этих событиях">
* `PW_ProductViewed` считает каждую загрузку страницы без фильтрации. Перезагрузки, повторные просмотры в рамках одного визита и даже трафик ботов считаются наравне с реальным просмотром товара. Стратегия рекомендаций, построенная на этом событии, наследует этот шум.
* `PW_AddToCart` срабатывает, только если кнопка **Add to cart** вашего магазина не перезагружает страницу. Проверьте это сами: нажмите **Add to cart** в своём магазине и посмотрите, что произойдёт. Обновляется только счётчик корзины, или перезагружается вся страница? Большинство тем Shopify делают первое, обновляя счётчик без перезагрузки (фоновый запрос к `/cart/add`). Если ваша тема вместо этого перезагружает страницу, `PW_AddToCart` никогда не сработает, но `PW_ProductViewed` и события заказа/оформления заказа всё равно будут работать нормально.
</Aside>

### Атрибуты событий просмотра на витрине

Оба события включают:

| Атрибут | Описание |
| ----- | ----- |
| `items` | Просмотренный или добавленный товар(ы), каждый с `productId`, `name`, `sku`, `quantity`, `price` |
| `totalPrice` | Общая цена `items` |
| `productUrl` | Страница, на которой находился покупатель |
| `currency` | Только когда витрина её предоставляет |

Сообщению, показывающему `totalPrice`, нужен запасной вариант на случай, если `currency` отсутствует, поскольку само по себе число не говорит, в какой это валюте.

Ни одно из этих событий не несёт `email` или `customerId` как атрибут. Покупатель идентифицируется так же, как это делает остальной встроенный код темы — через сессию SDK, привязанную к User ID в метаполе (см. [Часть 2](/ru/product/integrations/shopify/#part-2-setup-customer-user-id-via-metafields)), а не через содержимое события.

`items` в `PW_ProductViewed` и `PW_AddToCart` содержат те же поля, что присылает Shopify до обогащения: `productId`, `name`, `sku`, `quantity`, `price`. Pushwoosh не заполняет остальные поля каталога для этих двух событий, в отличие от `items` в `PW_AbandonedCart` (см. [Товары корзины обогащаются из вашего каталога товаров](#order-paid-and-checkout-events) выше).

Стратегия рекомендаций, которой нужны полные данные о товаре, например **Based on what they viewed**, ищет их в вашем [Каталоге товаров](/ru/product/content/product-catalog/) по `productId` в момент формирования сообщения. См. [Как настроить рекомендации товаров в email](/ru/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/), чтобы узнать, что нужно каждой стратегии.

## События шагов оформления заказа

Используйте их, чтобы увидеть, на каком шаге люди уходят до покупки, и отправлять сообщения тем, кто начал оформление заказа, но не дошёл до оплаченного заказа.

<Aside type="caution" title="Требуются разрешения приложения, связанные с pixel">
Одобрите разрешения на отслеживание оформления заказа, которые Shopify запрашивает при подключении приложения (`write_pixels` и `read_customer_events`). См. этот шаг в [Части 1](/ru/product/integrations/shopify/#part-1-installation). Настройка встроенного кода темы не требуется. Shopify автоматически сообщает об этих этапах после одобрения этих разрешений (технически — через [Web Pixel](https://shopify.dev/docs/api/web-pixels-api) Shopify).
</Aside>

* `PW_CheckoutContactInfo`: покупатель ввёл контактные данные.
* `PW_PaymentInfoSubmitted`: покупатель отправил платёжные данные.

Завершённая продажа — это `PW_OrderCreated` из раздела выше, а не эти два события.

`PW_AbandonedCart` сообщает лишь о том, что оформление заказа началось. Эти два события отмечают две более поздние точки того же оформления заказа, в таком порядке: сначала контактные данные, затем платёжные данные. Покупатель, дошедший до `PW_PaymentInfoSubmitted` и так и не получивший последующего `PW_OrderCreated`, продвинулся дальше, чем тот, кто вызвал только `PW_AbandonedCart`, поэтому сообщение, построенное на этом этапе, может обращаться конкретно к застрявшей оплате, а не быть общим напоминанием о корзине.

### Атрибуты событий шагов оформления заказа

Оба события включают:

| Атрибут | Описание |
| ----- | ----- |
| `items` | Позиции оформления заказа, каждая с `productId`, `name`, `sku`, `quantity`, `price` |
| `orderId` | Токен оформления заказа, или ID заказа Shopify, как только он появляется у оформления заказа |
| `totalPrice` | Сумма оформления заказа |
| `email` | Только если он есть у оформления заказа. Оформление заказа по телефону (без введённого email) отправляет событие без него. |
| `currency` | Только если она есть у оформления заказа |

## Проверьте, что всё работает

Выполните соответствующее действие в магазине, затем убедитесь, что имя события появилось в Pushwoosh. Само событие обрабатывается в реальном времени, но два места, где вы можете это проверить, по-разному реагируют на имя, которое Pushwoosh ещё не видел:

* В выпадающем списке **Event**, когда вы [создаёте сегмент по событиям](/ru/product/audience-data-and-segmentation/segmentation/create-segments/by-events/), новое имя появляется сразу же.
* В выпадающем списке **Event**, когда вы добавляете триггер [Customer Journey](/ru/product/customer-journey/pushwoosh-journey-overview/), новому имени может потребоваться до 10 минут, чтобы появиться (этот список кэшируется). Если вы его ещё не видите, подождите, а не считайте, что интеграция сломана.

| Тестовое действие | Событие |
| ----- | ----- |
| Оплатить тестовый заказ | `PW_OrderCreated` |
| Начать оформление заказа | `PW_AbandonedCart` |
| Изменить товары в этом оформлении заказа | `PW_AbandonedCartUpdate` |
| Открыть страницу товара (**Push Init Embed** включён) | `PW_ProductViewed` |
| Добавить товар в корзину | `PW_AddToCart` |
| Ввести контактные данные при оформлении заказа | `PW_CheckoutContactInfo` |
| Отправить платёжные данные при оформлении заказа | `PW_PaymentInfoSubmitted` |

## Используйте события

Когда вы знаете, какое событие вам нужно, используйте его в двух местах:

* Как триггер или условие сегмента: выберите его в выпадающем списке **Event**, когда вы [создаёте сегмент по событиям](/ru/product/audience-data-and-segmentation/segmentation/create-segments/by-events/) или добавляете триггер [Customer Journey](/ru/product/customer-journey/pushwoosh-journey-overview/).
* В тексте сообщения: на шаге сообщения включите **Personalize message with event attributes** и выберите атрибут (например, сумму заказа из `PW_OrderCreated`). Атрибут также можно вставить с помощью плейсхолдера Liquid. См. [Динамический контент и шаблоны Liquid в Journey](/ru/product/customer-journey/journey-elements/dynamic-content-and-liquid-templates-in-journeys/).

Для оплаченных заказов вы также можете сопоставить `PW_OrderCreated` как [событие конверсии](/ru/product/audience-data-and-segmentation/events/conversion-events/), чтобы покупки из Shopify учитывались в RFM-сегментации, атрибуции Journey и [статистике блока Product](/ru/product/statistics-and-analytics/messaging-statistics/email-statistics/).

### Примеры кампаний

Каждая из них срабатывает на разных этапах пути покупателя, поэтому охватывает разную аудиторию: то, как далеко продвинулся человек до ухода, или дошёл ли он до оформления заказа вообще, определяет, какая кампания подходит.

* **Напоминание о брошенной корзине.** Охватывает каждого покупателя, начавшего оформление заказа, независимо от того, как далеко он продвинулся — самая широкая аудитория здесь. Постройте её как Customer Journey: триггер на `PW_AbandonedCart`, ожидание `PW_OrderCreated`, затем отправьте email с блоком [источника Cart](/ru/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart) тем, кто не оплатил. Полную настройку см. в [Как настроить кампанию по брошенной корзине](/ru/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/).
* **Дополнительное сообщение для застрявшего оформления заказа.** Охватывает только покупателей, дошедших до ввода контактных данных, но так и не оплативших — более узкий срез аудитории выше. Постройте сегмент по `PW_CheckoutContactInfo`, затем исключите всех, у кого также есть `PW_PaymentInfoSubmitted` или `PW_OrderCreated`.
* **Восстановление застрявшей оплаты.** Охватывает покупателей, дошедших до оплаты, но так и не завершивших заказ — они продвинулись дальше, чем в дополнительном сообщении выше, и эта аудитория с ней не пересекается. Постройте сегмент по `PW_PaymentInfoSubmitted`, затем исключите всех, у кого также есть `PW_OrderCreated`.
* **Email с рекомендациями по просмотру.** Охватывает покупателей, которые смотрели товары, но вообще не начинали оформление заказа — аудитория, отличная от напоминаний выше. Используйте `PW_ProductViewed` со стратегией **Based on what they viewed** блока Products. См. [Как настроить рекомендации товаров в email](/ru/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/).