# Shopify 이벤트 및 캠페인

앱을 연결하고 주문, 장바구니, 체크아웃 추적에 대해 Shopify가 요청한 권한(`read_orders`, `write_pixels`, `read_customer_events`)을 승인하면, 별도의 Pushwoosh 추적 화면 없이 주문, 체크아웃, 체크아웃 단계 이벤트가 도착하기 시작합니다. 승인 단계는 [전제 조건](/ko/product/integrations/shopify/#prerequisites)과 [1부](/ko/product/integrations/shopify/#part-1-installation)를 참조하세요. 스토어프론트 탐색(제품 조회 및 장바구니 담기)에도 [**Push Init Embed** 켜짐](/ko/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events)이 필요합니다.

추적은 세 가지 독립적인 이벤트 그룹을 다룹니다. 각각 다른 액세스가 필요하므로, 하나를 끈다고 해서 나머지가 일시 중지되지는 않습니다:

* **주문 결제 및 체크아웃:** [테마 임베드](/ko/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events)가 꺼져 있어도 Shopify에서 도착합니다
* **스토어프론트 탐색**(제품 조회 및 장바구니 담기): 테마 임베드가 **켜져** 있어야 합니다
* **체크아웃 단계:** 위의 주문 추적 권한(`read_orders`)과 별도로 승인되는, [1부](/ko/product/integrations/shopify/#part-1-installation)의 Shopify 체크아웃 추적 권한(`write_pixels` 및 `read_customer_events`)이 필요합니다

앱을 연결하기 전에, `PW_OrderCreated`와 `PW_AbandonedCart`에 대해 [Pushwoosh가 금액 및 날짜 속성 유형을 처리하는 방법](#order-paid-and-checkout-events)을 확인하세요. 발견하기 전에 잘못 전송된 유형은 소급하여 수정할 수 없습니다.

<span id="order-paid-and-checkout-events" />
## 주문 결제 및 체크아웃 이벤트

구매 후 메시징(`PW_OrderCreated`), 체크아웃 이탈 journey 또는 세그먼트(`PW_AbandonedCart` / `PW_AbandonedCartUpdate`), 구매 전환 매핑에 이를 사용하세요. 쇼핑객이 브라우저 추적을 차단하더라도 Shopify에서 도착합니다:

<Aside type="caution" title="앱 연결 및 read_orders 승인이 필요합니다">
그 외 추가 토글은 필요하지 않습니다: [1부](/ko/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` webhook, [동기화되는 엔티티](/ko/product/integrations/shopify/#synchronized-entities)에 나열됨)에 해당합니다.

Shopify 자체의 Flow 조건, `checkouts/create` webhook, Products 블록의 Cart 소스는 모두 **장바구니 이탈**이라고 불리는 세 가지 서로 다른 것입니다. 아래 표를 사용하여 구축하려는 것과 일치하는 것을 선택하세요.

| 구축하려는 것 | 사용할 것 |
| ----- | ----- |
| Shopify Flow의 리마인더(Shopify 자체의 **Cart abandonment** 조건) | Shopify Flow + **Pushwoosh send notification** 액션. `PW_AbandonedCart` 이벤트 이름이 아님. |
| 체크아웃 시작 또는 장바구니 변경에 대한 Pushwoosh의 리마인더 또는 세그먼트 | `PW_AbandonedCart` / `PW_AbandonedCartUpdate`의 Customer Journey 또는 세그먼트 |
| 이메일 내에서 쇼핑객의 장바구니 항목 표시 | Products 블록의 [Cart 소스](/ko/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart)(전송 시점에 `PW_AbandonedCartID` 태그 사용). 어떤 트리거가 journey를 시작했는지와 무관함. |

**이 이벤트들의 동작 방식.** `checkouts/create`는 체크아웃이 시작되었다는 것만을 의미합니다. Shopify는 아직 이탈로 판단하지 않았으며, 주문도 확정되지 않았습니다.

쇼핑객이 체크아웃을 편집하는 동안, `PW_AbandonedCartUpdate`가 동일한 체크아웃에 대해 다시 트리거되어 `PW_AbandonedCart`에서 저장된 장바구니를 덮어씁니다. Cart 소스를 사용하는 리마인더 이메일은 전송 시점에 최신 항목을 가져옵니다. 장바구니를 새로고침하기 위해서만 두 번째 journey 트리거가 필요하지는 않습니다.

`PW_AbandonedCart`와 `PW_AbandonedCartUpdate`는 쇼핑객에게 `PW_AbandonedCartID` 태그를 설정하며, 이는 Cart 소스가 전송 시점에 읽는 값입니다. `PW_OrderCreated`는 이를 즉시 지우므로, 이미 체크아웃을 완료한 쇼핑객은 더 이상 갖고 있지 않은 장바구니에 대한 리마인더를 받는 대신 해당 블록을 건너뜁니다. 정확한 삭제 동작은 [PW_OrderCreated를 보낼 때 발생하는 일](/ko/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는 이미 참여 중인 사람의 재진입을 허용하지 않으므로, 첫 번째 장바구니 이탈 journey가 아직 실행 중인 동안 동일한 쇼핑객의 두 번째 `checkouts/create`는 재시작되지 않고 무시됩니다. 각 새 체크아웃이 리마인더 타이밍을 재설정하도록 하려면 트리거에서 **Allow re-entry**를 켜세요. [사용자가 캠페인에 재진입할 수 있는지 제어하기](/ko/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`의 주문 상태 페이지, 또는 `PW_AbandonedCart`와 `PW_AbandonedCartUpdate`의 이탈된 체크아웃 복구 URL. "구매 완료하기" 링크나 버튼을 만드는 데 사용하세요. |
| `createdDate` | 주문 또는 체크아웃이 생성된 시점 |
| `abandonedDate` | `PW_AbandonedCart`와 `PW_AbandonedCartUpdate`에만 해당. 장바구니가 처음 생성된 시점이 아니라 마지막으로 수정된 시점 |

<Aside type="caution" title="금액 및 날짜 속성 유형을 올바르게 설정하세요">
Pushwoosh는 처음 본 이벤트로부터 각 속성의 유형을 추론하며, 이 추론은 위의 `totalPrice`, `shippingAmount`, `taxAmount`, `discountAmount`, `createdDate`/`abandonedDate` 같은 금액 및 날짜 필드에는 신뢰할 수 없습니다. `129`와 같은 정수 가격은 정수로 추론되어, 이후 모든 이벤트에서 `129.90`을 `129`로 잘라냅니다.

**아직 앱을 연결하지 않았나요?** [Control Panel에서 이벤트 생성하기](/ko/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#create-the-events-in-your-control-panel)의 표를 사용하여 연결하기 전에 `PW_AbandonedCart`와 `PW_OrderCreated`를 올바른 유형으로 선언하세요. 해당 가이드의 **Send the events from your backend** 단계는 건너뛰세요. Shopify 연동이 이미 이를 대신 보냅니다.

**이미 연결되어 있나요?** 지금 유형을 확인하세요: Control Panel에서 **Audience → Events**로 이동하여 `PW_AbandonedCart`와 `PW_OrderCreated`를 열고, 각 속성을 동일한 표와 비교하세요. 그곳에서 잘못된 유형을 수정하면 이후부터는 바로잡히지만, 이미 잘못된 유형으로 전송된 값은 영구히 손실됩니다.
</Aside>

게스트 체크아웃도 주문 및 장바구니 이벤트를 보낼 수 있지만, 이벤트에 등록된 고객 ID는 없습니다.

`PW_AbandonedCartUpdate`는 동일한 속성을 가집니다. 계정에 [Magento](/ko/product/integrations/magento-integration/) 연동도 연결되어 있다면, 해당 주문과 이탈된 장바구니는 동일한 이벤트 이름으로 게시되므로, `PW_OrderCreated` / `PW_AbandonedCart`를 기반으로 구축된 세그먼트나 journey는 두 스토어를 모두 포착하며, 위의 속성 유형도 둘 다에 적용됩니다. Magento는 진행 중인 체크아웃 편집을 추적하지 않으므로 `PW_AbandonedCartUpdate`에 상응하는 것이 없습니다.

특히 `items`는 Shopify로부터 몇 개의 필드만 채워진 채로 도착합니다.

<Aside type="note" title="장바구니 항목은 제품 카탈로그에서 보강됩니다">
Shopify가 `PW_AbandonedCart`와 `PW_AbandonedCartUpdate`에 보내는 `items`에는 `productId`, `name`, `sku`, `quantity`, `price`만 포함됩니다. `productId`가 일치할 때마다, Pushwoosh는 연결된 [제품 카탈로그](/ko/product/content/product-catalog/)의 해당 제품에서 `description`, `imageUrl`, `productUrl`, `category` 및 기타 카탈로그 필드처럼 그 항목에 여전히 누락된 나머지를 채웁니다(참조: [자동 제품 카탈로그 연결](/ko/product/integrations/shopify/#connect-your-pushwoosh-app)). 이를 위해 추가로 보낼 것은 없습니다. 카탈로그에 없는 제품은 Shopify가 보낸 필드만으로 계속 표시됩니다.
</Aside>

## 스토어프론트 탐색 이벤트

탐색 이탈 세그먼트나 journey, 그리고 제품 조회가 필요한 이메일 추천 전략(예: **Based on what they viewed**)에 이를 사용하세요. [이메일에서 제품 추천 설정하는 방법](/ko/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/)을 참조하세요.

<Aside type="caution" title="Push Init Embed가 켜져 있어야 합니다">
[4부](/ko/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events)에서 **Push Init Embed**를 **켜세요**. 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`를 속성으로 가지고 있지 않습니다. 쇼핑객은 이벤트 페이로드가 아니라, 나머지 테마 임베드와 동일한 방식으로, 메타필드 User ID에 연결된 SDK 세션을 통해 식별됩니다([2부](/ko/product/integrations/shopify/#part-2-setup-customer-user-id-via-metafields) 참조).

`PW_ProductViewed`와 `PW_AddToCart`의 `items`는 Shopify가 보강 이전에 보내는 동일한 필드를 가집니다: `productId`, `name`, `sku`, `quantity`, `price`. `PW_AbandonedCart`의 `items`에 대해 하는 것처럼(위의 [장바구니 항목은 제품 카탈로그에서 보강됩니다](#order-paid-and-checkout-events) 참조), Pushwoosh는 이 두 이벤트에 대해 나머지 카탈로그 필드를 채우지 않습니다.

**Based on what they viewed**처럼 전체 제품 세부 정보가 필요한 추천 전략은 메시지가 렌더링될 때 `productId`로 [제품 카탈로그](/ko/product/content/product-catalog/)에서 이를 조회합니다. 각 전략에 필요한 것은 [이메일에서 제품 추천 설정하는 방법](/ko/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부](/ko/product/integrations/shopify/#part-1-installation)를 참조하세요. 테마 임베드 단계는 없습니다. 이러한 권한이 승인되면 Shopify가 자동으로 이러한 이정표를 보고합니다(기술적으로는 Shopify의 [Web Pixel](https://shopify.dev/docs/api/web-pixels-api)을 통해).
</Aside>

* `PW_CheckoutContactInfo`: 쇼핑객이 연락처 정보를 입력했습니다.
* `PW_PaymentInfoSubmitted`: 쇼핑객이 결제 정보를 제출했습니다.

완료된 판매는 위 섹션의 `PW_OrderCreated`이지, 이 두 이벤트가 아닙니다.

`PW_AbandonedCart`는 체크아웃이 시작되었다는 것만 알려줍니다. 이 두 이벤트는 동일한 체크아웃에서 다음 순서로 이후의 두 지점을 표시합니다: 먼저 연락처 정보, 그다음 결제 정보. `PW_PaymentInfoSubmitted`에 도달했지만 이후 `PW_OrderCreated`를 받지 못한 쇼핑객은 `PW_AbandonedCart`만 트리거한 쇼핑객보다 더 진행한 것이므로, 이 단계를 기반으로 한 메시지는 일반적인 장바구니 리마인더 대신 정체된 결제를 구체적으로 다룰 수 있습니다.

### 체크아웃 단계 이벤트의 속성

두 이벤트 모두 다음을 포함합니다:

| 속성 | 설명 |
| ----- | ----- |
| `items` | 체크아웃의 항목, 각각 `productId`, `name`, `sku`, `quantity`, `price` 포함 |
| `orderId` | 체크아웃 토큰, 또는 체크아웃에 Shopify 주문 ID가 생긴 이후에는 해당 ID |
| `totalPrice` | 체크아웃 총액 |
| `email` | 체크아웃에 있는 경우에만. 전화 기반 체크아웃(email 미입력)은 이 필드 없이 이벤트를 보냅니다. |
| `currency` | 체크아웃에 있는 경우에만 |

## 작동 여부 확인

스토어에서 해당 작업을 수행한 다음, 이벤트 이름이 Pushwoosh에 나타나는지 확인하세요. 이벤트 자체는 실시간으로 처리되지만, 확인할 수 있는 두 곳은 Pushwoosh가 아직 보지 못한 이름에 다르게 반응합니다:

* [이벤트로 세그먼트를 생성할 때](/ko/product/audience-data-and-segmentation/segmentation/create-segments/by-events/) **Event** 드롭다운에서는 새 이름이 즉시 나타납니다.
* [Customer Journey](/ko/product/customer-journey/pushwoosh-journey-overview/) 트리거를 추가할 때 **Event** 드롭다운에서는 새 이름이 나타나는 데 최대 10분이 걸릴 수 있습니다(이 드롭다운은 캐시됩니다). 아직 보이지 않는다면, 연동이 고장 났다고 가정하기보다는 기다리세요.

| 테스트 작업 | 이벤트 |
| ----- | ----- |
| 테스트 주문 결제 | `PW_OrderCreated` |
| 체크아웃 시작 | `PW_AbandonedCart` |
| 해당 체크아웃에서 항목 변경 | `PW_AbandonedCartUpdate` |
| 제품 페이지 열기(**Push Init Embed** 켜짐) | `PW_ProductViewed` |
| 장바구니에 항목 추가 | `PW_AddToCart` |
| 체크아웃에서 연락처 정보 입력 | `PW_CheckoutContactInfo` |
| 체크아웃에서 결제 정보 제출 | `PW_PaymentInfoSubmitted` |

## 이벤트 사용하기

필요한 이벤트를 파악한 후에는, 다음 두 곳에서 이를 사용하세요:

* 트리거 또는 세그먼트 조건으로: [이벤트로 세그먼트를 생성](/ko/product/audience-data-and-segmentation/segmentation/create-segments/by-events/)하거나 [Customer Journey](/ko/product/customer-journey/pushwoosh-journey-overview/) 트리거를 추가할 때 **Event** 드롭다운에서 선택합니다.
* 메시지 텍스트에서: 메시지 단계에서 **Personalize message with event attributes**를 켜고 속성을 선택합니다(예: `PW_OrderCreated`의 주문 총액). Liquid 플레이스홀더로 속성을 삽입할 수도 있습니다. [journey의 동적 콘텐츠 및 Liquid 템플릿](/ko/product/customer-journey/journey-elements/dynamic-content-and-liquid-templates-in-journeys/)을 참조하세요.

결제된 주문의 경우, `PW_OrderCreated`를 [전환 이벤트](/ko/product/audience-data-and-segmentation/events/conversion-events/)로 매핑하여 Shopify 구매가 RFM 세그멘테이션, journey 기여도, [Product 블록 통계](/ko/product/statistics-and-analytics/messaging-statistics/email-statistics/)에 반영되도록 할 수도 있습니다.

### 캠페인 예시

각각은 쇼핑객 경로의 다른 지점에서 트리거되므로 서로 다른 대상에게 도달합니다: 누군가 이탈하기 전에 얼마나 멀리 갔는지, 또는 체크아웃에 도달했는지 여부가 어떤 것이 적용되는지를 결정합니다.

* **장바구니 이탈 리마인더.** 얼마나 멀리 갔든 체크아웃을 시작한 모든 쇼핑객을 포착합니다 — 여기서 가장 넓은 대상입니다. Customer Journey로 구축하세요: `PW_AbandonedCart`에 트리거하고, `PW_OrderCreated`를 기다린 다음, 결제하지 않은 사람에게 [Cart 소스](/ko/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart) 블록이 포함된 이메일을 보냅니다. 전체 설정은 [장바구니 이탈 캠페인 설정하는 방법](/ko/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/)을 참조하세요.
* **정체된 체크아웃에 대한 후속 조치.** 연락처 정보 입력까지 도달했지만 결제하지 않은 쇼핑객만 포착합니다. 위 대상보다 더 좁은 범위입니다. `PW_CheckoutContactInfo`로 세그먼트를 만든 다음, `PW_PaymentInfoSubmitted`나 `PW_OrderCreated`도 있는 사람을 제외합니다.
* **정체된 결제에 대한 회복.** 결제에는 도달했지만 주문을 완료하지 않은 쇼핑객을 포착합니다. 위의 후속 조치보다 더 진행되었으며 상호 배타적입니다. `PW_PaymentInfoSubmitted`로 세그먼트를 만든 다음, `PW_OrderCreated`도 있는 사람을 제외합니다.
* **탐색 추천 이메일.** 제품을 봤지만 체크아웃을 아예 시작하지 않은 쇼핑객을 포착합니다. 위의 리마인더와는 다른 대상입니다. Products 블록의 **Based on what they viewed** 전략과 함께 `PW_ProductViewed`를 사용하세요. [이메일에서 제품 추천 설정하는 방법](/ko/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/)을 참조하세요.