# วิธีตั้งค่าแคมเปญตะกร้าสินค้าที่ถูกทิ้ง

นักช้อปที่เพิ่มสินค้าลงในตะกร้าแล้วจากไปโดยไม่ซื้อ เป็นหนึ่งในกลุ่มที่สามารถกู้คืน conversion ได้ง่ายที่สุด พวกเขาได้แสดงเจตนาที่จะซื้อแล้ว

คู่มือนี้จะแสดงวิธีส่งอีเมลตะกร้าสินค้าที่ถูกทิ้งใน Pushwoosh: เริ่มจากยิง event `PW_AbandonedCart` จากร้านค้าของคุณ, แสดงรายการสินค้าที่ถูกทิ้งไว้ในอีเมลด้วยบล็อก [Products](/th/product/content/email-content/drag-and-drop-email-editor/blocks/#products) และกระตุ้นการส่งจาก Customer Journey

## PW_AbandonedCart คืออะไร

`PW_AbandonedCart` เป็นการทำเครื่องหมายว่าผู้ใช้ทิ้งสินค้าไว้ในตะกร้าโดยไม่ซื้อ ไม่ใช่ [default event](/th/product/audience-data-and-segmentation/events/default-events/) ที่มีมาให้ในตัว แต่เป็นชื่อ event ที่ใช้ร่วมกันในการผสานรวม e-commerce ของ Pushwoosh เพื่อให้ journeys, บล็อก Products และ segments ทำงานในลักษณะเดียวกันทั้งหมด

*   **[การผสานรวม Magento](/th/product/integrations/magento-integration/):** ส่ง `PW_AbandonedCart` และ `PW_OrderCreated` ให้คุณโดยอัตโนมัติ
*   **[การผสานรวม Shopify](/th/product/integrations/shopify-integration/):** ส่ง `PW_AbandonedCart`, `PW_OrderCreated` และ `PW_AbandonedCartUpdate` (ยิงอีกครั้งเมื่อนักช้อปยังคงแก้ไขการชำระเงินเดิม) ให้คุณโดยอัตโนมัติ พร้อมด้วยรายการสินค้าในตะกร้าที่สมบูรณ์ขึ้นจาก Product Catalog ของคุณ
*   **ร้านค้าอื่น ๆ หรือ backend ที่กำหนดเอง:** ทีมของคุณจะส่ง event ทั้งสองผ่าน [postEvent](/th/developer/api-reference/user-centric-api/#postevent) ด้วยชื่อและ attributes ที่ระบุใน [วิธีส่งการแจ้งเตือนตะกร้าสินค้าที่ถูกทิ้ง](#how-to-send-abandoned-cart-reminders)

### จะเกิดอะไรขึ้นเมื่อคุณส่ง PW_AbandonedCart

การส่ง `PW_AbandonedCart` จะทำให้เกิดสองสิ่งในฝั่งของ Pushwoosh:

1.  มันจะถูกบันทึกเหมือนกับ custom event อื่น ๆ ดังนั้นคุณจึงสามารถดูได้ใน [สถิติ Event](/th/product/audience-data-and-segmentation/events/) และใช้ใน [segments](/th/product/audience-data-and-segmentation/segmentation/create-segments/by-events/)
2.  Pushwoosh จะจัดเก็บเนื้อหาในตะกร้าและติด Tag ผู้ใช้ด้วย:
    *   **PW_AbandonedCartID:** ตัวระบุสำหรับตะกร้าปัจจุบัน ใช้เพื่อดึงข้อมูลเนื้อหาในตะกร้า ณ เวลาที่ส่ง
    *   **PW_AbandonedCartDate:** ค่า `abandonedDate` จาก payload ของ event

### จะเกิดอะไรขึ้นเมื่อคุณส่ง PW_OrderCreated

เมื่อนักช้อปทำการสั่งซื้อ ให้ส่ง `PW_OrderCreated` (หรือ `PW_OrderUpdated`) Pushwoosh จะล้าง `PW_AbandonedCartID` และ `PW_AbandonedCartDate` สำหรับผู้ใช้นั้นทันที โดยจะไม่จับคู่ค่า `orderId`: การสั่งซื้อใด ๆ จากผู้ใช้จะลบ Tag ทั้งสองออก แม้ว่าการซื้อนั้นจะเป็นสำหรับตะกร้าอื่นก็ตาม

**ตัวอย่าง:** นักช้อปทิ้งตะกร้า `ORDER-100` จากนั้นซื้อ `ORDER-200` ก่อนที่การแจ้งเตือนจะถูกส่งออกไป Pushwoosh จะล้าง Tag ดังนั้นพวกเขาจะไม่ได้รับการแจ้งเตือนเกี่ยวกับ `ORDER-100`

<Aside type="note" title="สิ่งที่ปรากฏในอีเมลแจ้งเตือน">
บล็อก Products จะอ่านข้อมูลตะกร้าที่จัดเก็บไว้ในโปรไฟล์ผู้ใช้ ณ เวลาที่ส่ง โดยจะไม่ใช้รายการสินค้าจาก event `PW_AbandonedCart` ที่เริ่มต้น journey

*   **`orderId` เดียวกัน:** `PW_AbandonedCart` ใหม่แต่ละรายการจะเขียนทับตะกร้าที่จัดเก็บไว้ การแจ้งเตือนจะแสดงรายการล่าสุด
*   **`orderId` ที่แตกต่างกัน:** Pushwoosh จะจัดเก็บตะกร้าแยกต่างหาก รายการสินค้าจะไม่ถูกรวมเข้าด้วยกัน
</Aside>

## วิธีส่งการแจ้งเตือนตะกร้าสินค้าที่ถูกทิ้ง

ทำตามขั้นตอนเหล่านี้เพื่อสร้าง event, ส่งจากร้านค้าของคุณ, สร้างอีเมล และเปิดใช้งาน Customer Journey

### สร้าง event ใน Control Panel ของคุณ

[Pushwoosh จะสร้าง event โดยอัตโนมัติ](/th/product/audience-data-and-segmentation/events/#1-create-events-in-pushwoosh-control-panel) พร้อมกับ attributes ของมันจากการเรียก `postEvent` ครั้งแรกภายใต้ชื่อที่ไม่รู้จัก โดยจะอนุมานประเภทของ attribute แต่ละตัวจากค่าที่ส่งมา การอนุมานนั้นไม่น่าเชื่อถือสำหรับฟิลด์ที่เป็นเงินใน `PW_AbandonedCart` ให้ประกาศ event ทั้งสองอย่างชัดเจนเพื่อให้ประเภทถูกตั้งค่าอย่างถูกต้อง:

1.  ไปที่ **Audience → Events** ใน Pushwoosh Control Panel ของคุณแล้วคลิก **Create Event**
2.  สร้าง custom event ชื่อ `PW_AbandonedCart` พร้อม attributes เหล่านี้:

| Attribute | ประเภท |
| :---- | :---- |
| `email` | string |
| `orderId` | string |
| `customerId` | string |
| `orderUrl` | string |
| `abandonedDate` | date |
| `createdDate` | date |
| `totalPrice` | decimal (price) |
| `shippingAmount` | decimal (price) |
| `taxAmount` | decimal (price) |
| `discountAmount` | decimal (price) |
| `currency` | string |

3.  ทำซ้ำสำหรับ `PW_OrderCreated` ด้วย attribute `orderId` เพียงตัวเดียว

<Aside type="caution" title="ใช้ประเภท attribute ที่ถูกต้อง">
Pushwoosh จะจัดเก็บค่า attribute แต่ละค่าในประเภทที่ตั้งไว้เท่านั้น ไม่ว่าจะประกาศไว้ที่นี่หรืออนุมานสำหรับ attribute ที่สร้างขึ้นโดยอัตโนมัติ ค่าที่ไม่ตรงกับประเภทจะถูกทิ้งไปอย่างเงียบ ๆ และ `postEvent` จะยังคงส่งคืนค่าสำเร็จ ดังนั้นคุณจะไม่เห็นในการตอบกลับว่าข้อมูลสูญหาย คุณสามารถแก้ไขประเภทที่ไม่ถูกต้องได้ในภายหลังโดยการแก้ไข event ใน Control Panel แต่ข้อมูลใด ๆ ที่ส่งไปก่อนการแก้ไขจะหายไปแล้ว

เพื่อให้ตะกร้าสินค้าที่ถูกทิ้งทำงานได้ ให้จับคู่ประเภทในตารางด้านบน:

*   **ฟิลด์เงิน** (`totalPrice`, `shippingAmount`, `taxAmount`, `discountAmount`): ใช้ **decimal (price)** หากไม่ได้ประกาศ ค่าจำนวนเต็มเช่น `129` จะถูกอนุมานเป็น **integer** หากประกาศเป็น **string** ตะกร้าจะไม่ถูกจัดเก็บและไม่มีการตั้งค่า Tag หากประกาศเป็น **integer** ค่า `129.90` จะกลายเป็น `129`
*   **วันที่** (`abandonedDate`, `createdDate`): ใช้ **date**
*   **`items`:** อย่าเพิ่มลงในคำจำกัดความของ event ให้ส่งใน JSON payload เป็นอาร์เรย์ของอ็อบเจกต์ ใช้ตัวเลข JSON จริงสำหรับ `price` และ `quantity` ไม่ใช่สตริงที่อยู่ในเครื่องหมายคำพูด
</Aside>

[เรียนรู้เพิ่มเติมเกี่ยวกับการสร้าง custom events](/th/product/audience-data-and-segmentation/events/custom-events/#creating-custom-events)

### ส่ง event จาก backend ของคุณ

<Aside type="caution" icon="setting" title="ต้องการความช่วยเหลือจากนักพัฒนา">
คุณจะต้องได้รับความช่วยเหลือจากทีมนักพัฒนาของคุณเพื่อส่ง event จากร้านค้าหรือ backend ของคุณ โปรดแชร์คู่มือนี้กับพวกเขา
</Aside>

ขอให้ทีมนักพัฒนาของคุณเรียกใช้ [postEvent](/th/developer/api-reference/user-centric-api/#postevent) ทุกครั้งที่มีการทิ้งตะกร้า โดยใช้สคีมา attribute นี้:

```json
{
  "request": {
    "hwid": "8f65b16df378e7a6bece9614e1530fb2",
    "application": "XXXXX-XXXXX",
    "event": "PW_AbandonedCart",
    "attributes": {
      "email": "shopper@example.com",
      "orderId": "ORDER-10293",
      "customerId": "CUST-4471",
      "orderUrl": "https://yourstore.com/cart/restore/ORDER-10293",
      "abandonedDate": "2026-07-28T10:15:00Z",
      "createdDate": "2026-07-28T09:40:00Z",
      "totalPrice": 129.90,
      "shippingAmount": 9.90,
      "taxAmount": 0,
      "discountAmount": 0,
      "currency": "USD",
      "items": [
        {
          "productId": "SKU-4821",
          "name": "Wireless headphones",
          "quantity": 1,
          "price": 119.90,
          "sku": "SKU-4821",
          "description": "Over-ear, noise-cancelling",
          "imageUrl": "https://yourstore.com/media/sku-4821.jpg",
          "productUrl": "https://yourstore.com/products/sku-4821",
          "category": "Audio"
        }
      ]
    },
    "userId": "shopper@example.com"
  }
}
```

เมื่อตะกร้าถูกแปลงเป็นการสั่งซื้อ ให้ส่ง `PW_OrderCreated` พร้อมกับ `orderId` เพียงอย่างเดียวเพื่อล้าง Tag ของตะกร้า:

```json
{
  "request": {
    "hwid": "8f65b16df378e7a6bece9614e1530fb2",
    "application": "XXXXX-XXXXX",
    "event": "PW_OrderCreated",
    "attributes": {
      "orderId": "ORDER-10293"
    },
    "userId": "shopper@example.com"
  }
}
```

<Aside type="tip">
หากคุณใช้ [การผสานรวม Magento](/th/product/integrations/magento-integration/#abandoned-cart-sync-configuration) หรือ [การผสานรวม Shopify](/th/product/integrations/shopify-integration/#part-5-track-orders-carts-and-checkout-steps) คุณไม่จำเป็นต้องส่ง event เหล่านี้จาก backend ของคุณ Magento จะส่ง `PW_AbandonedCart` และ `PW_OrderCreated` ให้คุณตามกำหนดเวลา; Shopify จะส่ง (พร้อมกับ `PW_AbandonedCartUpdate` สำหรับการแก้ไขการชำระเงินที่กำลังดำเนินการ) จาก webhooks แบบเรียลไทม์
</Aside>

### เพิ่มบล็อก Products ในอีเมลของคุณ

1.  เปิด [ตัวแก้ไขเนื้อหาอีเมล](/th/product/content/email-content/drag-and-drop-email-editor/) และเพิ่มบล็อก [Products](/th/product/content/email-content/drag-and-drop-email-editor/blocks/#products) ลงใน canvas
2.  ในแผงการตั้งค่า ตั้งค่า **Source** เป็น [Cart](/th/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart)

<Aside type="note">
แหล่งที่มา **Cart** ของบล็อก Products ต้องการ **Content Templates** ในแผนของคุณและ [API access token](/th/developer/api-reference/api-access-token/) ดูที่ [บล็อก Products](/th/product/content/email-content/drag-and-drop-email-editor/blocks/#products)
</Aside>

3.  ตั้งค่า **Max products shown** เพื่อจำกัดจำนวนรายการสินค้าในตะกร้าที่จะปรากฏในอีเมล

<img src="/lifecycle-marketing-campaigns-how-to-set-up-an-abandoned-cart-campaign-1.webp" alt="การตั้งค่าบล็อก Products โดยตั้งค่า Source เป็น Cart และ Max products shown"/>

4.  จัดรูปแบบกริดและเทมเพลตการ์ดตามต้องการ ดูที่ [จัดรูปแบบกริด](/th/product/content/email-content/drag-and-drop-email-editor/blocks/#style-the-grid)

<img src="/lifecycle-marketing-campaigns-how-to-set-up-an-abandoned-cart-campaign-2.webp" alt="บล็อก Products บน canvas ของอีเมลพร้อมเทมเพลตการ์ดและการตั้งค่าสไตล์กริด" width="580"/>

เมื่ออีเมลถูกส่ง บล็อก Products จะค้นหาตะกร้าที่จัดเก็บไว้ของผู้รับแต่ละรายโดยใช้ Tag `PW_AbandonedCartID` ของพวกเขา จากนั้นจะเติมบล็อกด้วยรายการสินค้าในตะกร้าปัจจุบัน: รูปภาพ, ชื่อ, ราคา และลิงก์กลับไปยังตะกร้า เลย์เอาต์จะมาจากเทมเพลตการ์ดที่คุณตั้งค่าไว้ในตัวแก้ไข ผู้รับที่ไม่มี Tag นั้น (ไม่มีอะไรถูกทิ้ง หรือสั่งซื้อไปแล้ว) จะข้ามบล็อกนี้ไปแทนที่จะแสดงเนื้อหาว่างเปล่า ดังนั้นจึงปลอดภัยที่จะใช้ในแคมเปญที่กว้างขึ้นด้วย

<Aside type="tip">
แหล่งที่มา Cart มีให้ใช้งานในตัวแก้ไขเนื้อหาอีเมล หากต้องการเตือนนักช้อปด้วย push แทน ให้ใช้ขั้นตอน [Push](/th/product/customer-journey/journey-elements/channels/push/) พร้อมกับ [การปรับแต่งเนื้อหา](/th/product/personalization/dynamic-content/) ที่อ้างอิงรายละเอียดตะกร้าจาก event
</Aside>

### สร้าง Customer Journey

1.  เพิ่ม [Trigger-based Entry](/th/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/) โดยใช้ event `PW_AbandonedCart`
2.  เพิ่มขั้นตอน [Wait for Trigger](/th/product/customer-journey/journey-elements/flow-controls/wait-for-trigger/) ตั้งค่าระยะเวลารอเป็นหนึ่งหรือสองชั่วโมง ตั้งชื่อสาขาว่า **Order placed** และเพิ่ม event `PW_OrderCreated` เข้าไป

<Aside type="caution">
ตั้งค่าระยะเวลารอที่ **Wait for Trigger** โดยตรง อย่าเพิ่มขั้นตอน **Time Delay** แยกต่างหากก่อนหน้า

**Wait for Trigger** จะเริ่มรอฟัง `PW_OrderCreated` ก็ต่อเมื่อนักช้อปมาถึงขั้นตอนนี้เท่านั้น หากมี **Time Delay** มาก่อนและนักช้อปทำการสั่งซื้อในระหว่างการหน่วงเวลานั้น event การสั่งซื้อจะไม่ถูกตรวจจับ นักช้อปจะย้ายไปที่สาขา **Not triggered** แต่ `PW_OrderCreated` ได้ล้าง `PW_AbandonedCartID` ไปแล้ว บล็อก Products จะไม่พบตะกร้าและข้ามไป นักช้อปจะยังคงได้รับอีเมลตะกร้าสินค้าที่ถูกทิ้งโดยไม่มีสินค้า แม้ว่าพวกเขาจะทำการซื้อเสร็จสิ้นแล้วก็ตาม
</Aside>

3.  กำหนดเส้นทางสาขา **Order placed** ไปยัง [Exit](/th/product/customer-journey/journey-elements/flow-controls/exit/) ผู้ใช้ได้ซื้อไปแล้ว ดังนั้นอย่าเตือนพวกเขา
4.  กำหนดเส้นทางสาขา **Not triggered** ไปยังขั้นตอน [Email](/th/product/customer-journey/journey-elements/channels/email/) บันทึกอีเมลที่คุณสร้างใน [เพิ่มบล็อก Products ในอีเมลของคุณ](#add-a-products-block-to-your-email) เป็น [เนื้อหาอีเมล](/th/product/content/email-content/) จากนั้นเลือกเป็นเนื้อหาของขั้นตอนนี้

<img src="/lifecycle-marketing-campaigns-how-to-set-up-an-abandoned-cart-campaign-3.webp" alt="Customer Journey canvas พร้อม Trigger-based Entry, Wait for Trigger พร้อมสาขา Order placed และ Not triggered, ขั้นตอน Email และ Exit และไม่มี Time Delay"/>

### ทดสอบก่อนเปิดใช้งาน

1.  ส่ง event `PW_AbandonedCart` ทดสอบสำหรับอุปกรณ์ทดสอบ อย่าตั้งค่า Tag `PW_AbandonedCartID` ด้วยตนเอง: บล็อก Products จะโหลดเนื้อหาตะกร้าจากตะกร้าที่จัดเก็บไว้ซึ่ง event สร้างขึ้น ไม่ใช่จากค่า Tag หากไม่มี event จริง บล็อกจะแสดงผลว่างเปล่า
2.  ดูตัวอย่างอีเมลและยืนยันเลย์เอาต์และเนื้อหาสินค้าก่อนส่งให้นักช้อปจริง