# การอ้างอิง Point

ทุกๆ [point](/th/developer/api-reference/customer-journey-api/journey-object/#point) จะมีอ็อบเจกต์ `point_data` ที่มี key ซ้อนกันเพียงหนึ่งเดียว ซึ่งตรงกับ `point_type` ของ point นั้น (ดู [การจับคู่ point-type → key](/th/developer/api-reference/customer-journey-api/journey-object/#point-types-and-point_data)) หน้านี้จะอธิบายโครงสร้างภายใต้แต่ละ key

<Aside type="note">
point ประเภท Entry, timing, splitting, action และ conversion ได้รับการอธิบายไว้อย่างครบถ้วนด้านล่างนี้

สำหรับ point ประเภท messaging (`send_*`, `inapp`) หน้านี้จะครอบคลุมเฉพาะฟิลด์โครงสร้างเท่านั้น: การอ้างอิง preset หรือเนื้อหาใด และการส่งผ่านการตั้งค่า channel ใด
เนื้อหาของข้อความจะถูกกำหนดไว้ใน preset และมีเอกสารอธิบายใน [Presets API](/th/developer/api-reference/presets-api/) และเอกสารของแต่ละ channel
บางฟิลด์อ้างอิงถึงอ็อบเจกต์ที่ซ้อนกันซึ่งจำลองการควบคุมใน Customer Journey builder
</Aside>
## Entry points

Journey ต้องการ entry point อย่างน้อยหนึ่งจุด entry point ทั้งหมดมี output `default` เพียงหนึ่งเดียว

### start_by_segment

ให้ผู้ใช้ที่ตรงกับ segment เข้ามา `POINT_TYPE_START_BY_SEGMENT`

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `filter_code` | string | [รหัส Segment/filter](/th/developer/api-reference/api-identifiers/#segment--filter-code) ที่กำหนดกลุ่มเป้าหมาย |
| `repeat` | `SegmentRepeat` | กำหนดการเข้าซ้ำที่เป็นทางเลือก (ดู [SegmentRepeat](#segmentrepeat)) |
| `start_at` | timestamp | ห้ามประมวลผลก่อนเวลานี้ (ISO 8601) |
| `is_deactivated` | bool | ระบุว่า entry point นี้ปิดอยู่หรือไม่ |

### message_bus (event entry)

ให้ผู้ใช้เข้ามาเมื่อพวกเขากระตุ้น event `POINT_TYPE_EVENT`

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `event_name` | string | [ชื่อ Event](/th/developer/api-reference/api-identifiers/#event-name) ที่จะรอฟัง |
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `event_conditions` | `PointEventCondition[]` | เงื่อนไขที่จับคู่กับ attribute ของ event |
| `active_period` | `Period` | ช่วงเวลาที่ trigger ทำงาน |
| `multi_entry` | `MultiEntry` | วิธีที่ผู้ใช้สามารถเข้าได้มากกว่าหนึ่งครั้ง (ดู [MultiEntry](#multientry)) |
| `attribute_entry` | `AttributeEntry` | ลงทะเบียน User ID ที่อยู่ใน attribute ของ event แทนผู้ใช้ที่กระตุ้น event (ดู [AttributeEntry](#attributeentry)) |
| `allow_reenter` | bool | ระบุว่าผู้ใช้สามารถเข้า journey ซ้ำได้หรือไม่ |

##### AttributeEntry

ลงทะเบียน [User IDs](/th/developer/api-reference/api-identifiers/#user-id) ที่อยู่ใน attribute ของ event แทนผู้ใช้ที่กระตุ้น event จำลองมาจาก [Users from an event attribute](/th/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/#users-from-an-event-attribute) ใน Customer Journey builder

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `enabled` | bool | ระบุว่าจะลงทะเบียนผู้ใช้ที่ระบุใน attribute ของ event แทนผู้ใช้ที่กระตุ้น event หรือไม่ |
| `attribute_name` | string | ชื่อของ attribute ของ event ที่เก็บ User ID (หรือรายการของ User ID) ที่จะลงทะเบียน |

### start_by_api

Entry point ที่ป้อนข้อมูลโดยการเรียก [Start by API](/th/developer/api-reference/customer-journey-api/start-by-api/) `POINT_TYPE_START_BY_API`

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `attributes` | string[] | ชื่อของ custom attribute ที่สามารถส่งผ่านใน `attribute_values` ของคำขอ [Start by API](/th/developer/api-reference/customer-journey-api/start-by-api/#request-body) |
| `is_deactivated` | bool | ระบุว่า entry point นี้ปิดอยู่หรือไม่ |

## Timing points

### delay (wait)

หยุดผู้ใช้แต่ละคนชั่วคราวตามช่วงเวลาที่กำหนดหรือคำนวณได้ `POINT_TYPE_WAIT` อ็อบเจกต์ `point_data.delay` จะตั้งค่า key ช่วงเวลาต่อไปนี้เพียงหนึ่งเดียว:

| Interval key | ประเภท | คำอธิบาย |
|---|---|---|
| `sec` | uint64 | รอเป็นจำนวนวินาทีที่กำหนด |
| `exact_time` | [`ExactTime`](#time-objects) | รอจนถึงเวลาของวัน (`hour`, `minute`) |
| `exact_date_time` | [`ExactDateTime`](#time-objects) | รอจนถึงวันที่และเวลาที่แน่นอน |
| `exact_week_days_time` | `ExactWeekDaysTime` | รอจนถึงเวลาที่ระบุในวันของสัปดาห์ที่ระบุ (map ของวัน `0`=จันทร์ … `6`=อาทิตย์ → `ExactTime`) |
| `dynamic_time` | [`DynamicTime`](#dynamictime) | รอโดยอ้างอิงจากค่าจาก tag หรือ event |

`dynamic_time` ที่มี `split_branches: true` จะเพิ่มสาขา `output1` (ดู [output keys](/th/developer/api-reference/customer-journey-api/journey-object/#output-keys))

#### DynamicTime

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `from` | enum `DynamicTimeFrom` | ระบุว่าเวลาพื้นฐานมาจาก tag หรือ event |
| `direction` | enum `DynamicTimeDirection` | การชดเชยเวลาก่อนหรือหลังเวลาพื้นฐาน |
| `duration` | uint64 | ขนาดของการชดเชยเวลา |
| `unit` | enum `DynamicTimeUnit` | หน่วยของ `duration` (นาที, ชั่วโมง, วัน, …) |
| `split_branches` | bool | แยกผู้ใช้ออกเป็นสาขาต่างๆ เมื่อเวลาที่คำนวณได้แตกต่างกัน |
| `tag_name` | string | Tag ที่เก็บเวลาพื้นฐาน (เมื่อ `from` เป็น tag) |
| `event_name` / `event_attribute` / `point_id` | string | แหล่งที่มาของ event ของเวลาพื้นฐาน (เมื่อ `from` เป็น event) |

### wait_event

รอจนกว่าผู้ใช้จะกระตุ้น event (หรือหมดเวลา) `POINT_TYPE_WAIT_EVENT` output `default` คือเส้นทาง **ไม่ถูกกระตุ้น** เส้นทางที่ถูกกระตุ้นคือ `output1` หรือหากมีสคริปต์ จะเป็นหนึ่งสาขาต่อเงื่อนไข

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `events` | `PointWaitEventInfo[]` | Event ที่จะรอ |
| `conditions_script` | string | สคริปต์ทางเลือกสำหรับตรรกะหลาย event ที่ซับซ้อน ชื่อเงื่อนไขที่แยกวิเคราะห์ได้จะกลายเป็น output key |
| `multi_entry` | `MultiEntry` | พฤติกรรมการเข้าซ้ำ |

## Splitting and filtering points

### boolean_splitter

ส่งผู้ใช้ไปยังสาขาต่างๆ ตามเงื่อนไข `POINT_TYPE_BOOLEAN_SPLITTER`

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `split_strategy` | enum | `SPLIT_FILTER` (ตาม segment), `SPLIT_TAGS` (ตามเงื่อนไข tag), หรือ `SPLIT_EVENTS` (ตามเงื่อนไข event) |
| `load_policy` | enum | `ALL` (อุปกรณ์ใดๆ ของผู้ใช้อาจตรงกัน) หรือ `FILTER` (เฉพาะอุปกรณ์ปัจจุบัน) |
| `filter_code` | string | รหัส Segment เมื่อ `split_strategy` คือ `SPLIT_FILTER` |
| `filter_expressions` | `FilterExpression[]` | เงื่อนไข Tag เมื่อ `split_strategy` คือ `SPLIT_TAGS`: เพิ่มสาขา `output` หนึ่งสาขาต่อ expression |
| `event` | `BooleanSplitterEventInfo` | เงื่อนไข Event เมื่อ `split_strategy` คือ `SPLIT_EVENTS`: เพิ่มสาขา `output` หนึ่งสาขาต่อเงื่อนไข |

### ab_splitter

สุ่มแบ่งผู้ใช้ออกเป็นกลุ่มต่างๆ ตามน้ำหนัก `POINT_TYPE_AB_SPLITTER` output key คือ `output0`, `output1`, … (หนึ่งรายการต่อ entry ใน `split` โดยเริ่มจาก 0 ไม่มี `default`)

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `split` | uint32[] | เปอร์เซ็นต์สำหรับแต่ละสาขา ต้องรวมกันได้ 100 ดัชนี `i` จะจับคู่กับ output key `output{i}` |
| `auto_select_winner` | bool | ระบุว่าจะเลือกสาขาที่ชนะโดยอัตโนมัติหรือไม่ |
| `winner_strategy` | enum | `ANY_GOAL` หรือ `SPECIFIC_GOAL` |
| `goal_uuid` | string | Goal ที่ใช้ในการตัดสินผู้ชนะ (กับ `SPECIFIC_GOAL`) |
| `winner_split` | uint32 | หมายเลขสาขาที่ชนะ (เริ่มจาก 1, `0` = ยังไม่มีผู้ชนะ) |

### filter

ให้เฉพาะผู้ใช้ที่ตรงกันไปต่อ (`default`) และส่งผู้ใช้ที่เหลือไปยัง `output1` `POINT_TYPE_FILTER`

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `filter` | enum `Filter` | การตรวจสอบที่กำหนดไว้ล่วงหน้า: `EMAIL_EXISTS`, `PUSH_TOKEN_EXISTS`, `SMS_TOKEN_EXISTS`, `WHATSAPP_TOKEN_EXISTS`, `LINE_TOKEN_EXISTS`, หรือ `CUSTOM` |
| `filter_raw` | string | นิพจน์ filter แบบกำหนดเอง เมื่อ `filter` คือ `CUSTOM` |

## Action points

### set_tags

อัปเดต tag ของผู้ใช้ `POINT_TYPE_SET_TAGS`

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `tags` | [`Tag`](#tag)[] | Tag ที่จะเขียน |

#### Tag

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `name` | string | ชื่อ Tag |
| `type` | enum `TagType` | ประเภทข้อมูลและการดำเนินการ: `TYPE_STRING`, `TYPE_INTEGER`, `TYPE_DATE`, `TYPE_BOOLEAN`, `TYPE_LIST`, `TYPE_LIST_APPEND`, `TYPE_LIST_REMOVE`, `TYPE_DYNAMIC`, … |
| _value_ | oneof | key ค่าหนึ่งเดียวที่ตรงกับ `type`: `str`, `int`, `bool`, `date`, `price`, `version`, `timezone`, `list`, หรือ `dynamic` |

### web_hook

ส่งคำขอ HTTP ขาออก `POINT_TYPE_WEBHOOK` มี output `default` เพียงหนึ่งเดียว

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `method` | string | เมธอด HTTP (`GET`, `POST`, `PUT`, …) |
| `url` | string | URL เป้าหมาย |
| `request_template` | string | เทมเพลตเนื้อหาคำขอ รองรับเทมเพลต [Liquid](/th/developer/api-reference/messaging-api-v2/payload-reference/) |
| `headers` | map&lt;string, string&gt; | ส่วนหัว HTTP |
| `disabled` | bool | อ่านอย่างเดียว `true` เมื่อ Pushwoosh ปิดใช้งาน webhook โดยอัตโนมัติหลังจากเกิดข้อผิดพลาดซ้ำๆ |
| `reactivate` | bool | เขียนอย่างเดียว ตั้งค่าเป็น `true` เพื่อเปิดใช้งาน webhook ที่ถูกปิดใช้งานอีกครั้ง |

## Conversion points

### goal_event

ติดตาม conversion goal `POINT_TYPE_GOAL_EVENT` ไม่มี output

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `event_name` | string | ชื่อ event ของ goal |
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `event_conditions` | `PointEventCondition[]` | เงื่อนไขที่จับคู่กับ attribute ของ goal event |
| `is_throw_out` | bool | ระบุว่าจะลบผู้ใช้ออกจาก journey เมื่อบรรลุ goal หรือไม่ |
| `is_cancel_event` | bool | ระบุว่านี่เป็น goal เชิงลบ (การยกเลิก) หรือไม่ |

## Exit points

### terminator

สิ้นสุด journey สำหรับผู้ใช้ `POINT_TYPE_EXIT` อ็อบเจกต์ว่าง (`{}`) และไม่มี output

```json
{ "point_type": "POINT_TYPE_EXIT", "point_data": { "terminator": {} }, "outputs": [] }
```

## Messaging points

messaging point ทั้งหมดจะส่งผ่าน channel และใช้ envelope ร่วมกัน แต่ละจุดมี output `default` เพียงหนึ่งเดียว เว้นแต่จะเปิดใช้งาน splitter (ดู [output keys](/th/developer/api-reference/customer-journey-api/journey-object/#output-keys))

ฟิลด์ทั่วไป:

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `application_code` | string | [รหัสแอปพลิเคชัน](/th/developer/api-reference/api-identifiers/#application-code) |
| `preset_code` | string | [Preset](/th/developer/api-reference/presets-api/) (เทมเพลต) ที่จะส่ง `inapp` ใช้ `richmedia_code` แทน |
| `content` / `title` | string | เนื้อหาข้อความแบบอินไลน์ เมื่อไม่ได้ใช้ preset (ขึ้นอยู่กับ channel) |
| `campaign_code` | string | [รหัสแคมเปญ](/th/developer/api-reference/api-identifiers/#campaign-code) สำหรับการติดตาม จะถูกสร้างขึ้นโดยอัตโนมัติหากไม่ระบุ |
| `split_params` | [`BehaviorSplitter`](#behaviorsplitter) | เป็นทางเลือก: รอการโต้ตอบและแยกสาขาตามนั้น |
| `message_type` | enum | ประเภทข้อความ [Marketing vs transactional](/th/product/messaging-channels/marketing-vs-transactional/) (ควบคุมการจัดการ control-group) |

ประเภท Point และฟิลด์พิเศษที่น่าสนใจ:

| ประเภท Point | `point_data` key | หมายเหตุ |
|---|---|---|
| `POINT_TYPE_SEND_PUSH` | `send_push` | `split_params` (พฤติกรรม) บวกกับ delivery splitter สามารถสร้าง output ได้สูงสุดสามรายการ `send_by_user_id`, `wait_optimal_time` |
| `POINT_TYPE_SEND_EMAIL` | `send_email` | `liquid_template_params`, `personalise` ดู [Email API](/th/developer/api-reference/email-api/) |
| `POINT_TYPE_SEND_SMS` | `send_sms` | ดู [SMS](/th/developer/api-reference/sms/) |
| `POINT_TYPE_SEND_WHATSAPP` | `send_whatsapp` | preset การตอบกลับด่วนจะเพิ่ม output หนึ่งรายการต่อการตอบกลับ (key = ค่าการตอบกลับ) ดู [WhatsApp](/th/developer/api-reference/whatsapp/) |
| `POINT_TYPE_SEND_TELEGRAM` | `send_telegram` | ช่องทาง Telegram |
| `POINT_TYPE_SEND_KAKAO` | `send_kakao` | ดู [Kakao](/th/developer/api-reference/kakao/) |
| `POINT_TYPE_SEND_LINE` | `send_line` | ดู [LINE API](/th/developer/api-reference/line-api/) |
| `POINT_TYPE_SEND_DATA` | `send_data` | ข้อความข้อมูลแบบเงียบ (ไม่มี UI) |
| `POINT_TYPE_INAPP` | `inapp` | ใช้ `richmedia_code`, `expire_in_days`, `capping` |

## Shared types

### SegmentRepeat

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `enabled` | bool | ระบุว่าการเข้าซ้ำเปิดอยู่หรือไม่ |
| `frequency` | string | `daily`, `weekly`, `monthly`, หรือ `dates` |
| `every` | uint32 | ทำซ้ำทุกๆ N ช่วงเวลา |
| `dates` | string[] | วันที่ที่ระบุ เมื่อ `frequency` คือ `dates` |
| `time` | `SegmentRepeatTime` | การกำหนดค่าเวลาของวัน |

### Time objects

- `ExactTime`: `{ "hour": 0–23, "minute": 0–59 }`
- `ExactDateTime`: `{ "year", "month": 1–12, "day": 1–31, "hour": 0–23, "minute": 0–59 }`

### BehaviorSplitter

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `enabled` | bool | ระบุว่าจะรอการโต้ตอบและแยกสาขาตามนั้นหรือไม่ |
| `interval` | uint64 | จำนวนวินาทีที่จะรอการโต้ตอบ |

### MultiEntry

ควบคุมจำนวน session ที่ใช้งานอยู่ที่ผู้ใช้สามารถมีได้ใน journey ในเวลาเดียวกัน จำลองมาจาก [ควบคุมจำนวน session ที่ผู้ใช้สามารถมีได้ในเวลาเดียวกัน](/th/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/#control-how-many-sessions-a-user-can-have-at-the-same-time) ใน Customer Journey builder ใช้โดย [event entry point](#message_bus-event-entry) และ [wait_event](#wait_event)

| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| `enabled` | bool | ระบุว่าผู้ใช้สามารถมี session ที่ใช้งานอยู่หลายรายการในเวลาเดียวกันได้หรือไม่ `false`: หนึ่ง session ที่ใช้งานอยู่ต่อผู้ใช้ `true`: หลาย session ที่ใช้งานอยู่ต่อผู้ใช้ |
| `attribute_name` | string | เป็นทางเลือก attribute ของ event ที่กำหนดขอบเขตของแต่ละ session เมื่อตั้งค่าแล้ว ผู้ใช้สามารถมี session ที่ใช้งานอยู่หนึ่งรายการต่อค่าที่แตกต่างกันของ attribute นี้ (ตัวอย่างเช่น หนึ่งรายการต่อ `order_id`) event ที่มีค่าเดียวกันจะใช้ session ร่วมกัน ปล่อยว่างไว้เพื่อกำหนดขอบเขตรายการเข้าทั้งหมดของผู้ใช้ไว้ด้วยกัน |

## ที่เกี่ยวข้อง

<CardGrid>
  <LinkCard title="อ็อบเจกต์ Journey" href="/developer/api-reference/customer-journey-api/journey-object/" />
  <LinkCard title="สร้างและอัปเดต" href="/developer/api-reference/customer-journey-api/create-update/" />
  <LinkCard title="Presets API" href="/developer/api-reference/presets-api/" />
</CardGrid>