Flow Bot-Auto: 8 Keyword Triggers + 1 GenAI Trigger — Zalo OA Di Động Việt

Mindmap chi tiết 46 blocks + 8 Keyword Triggers (~405 keywords) + 1 Sequence + 2 Followups + 1 GenAI Trigger — gửi team Dev SMAX review
biz: di-dong-viet channel: zalo page zl28583850... trigger 69df64a3... 2026-04-26 v2 46 blocks 12 GenAI items 9 Triggers (8 Keyword + 1 GenAI) ~405 keywords

Tổng quan flow

Khi khách hàng nhắn vào Zalo OA Di Động Việt, hệ thống Smax có 8 Keyword Triggers (~405 keywords tổng cộng) để classify intent ngay từ đầu: Hỏi giá, Trả góp, Ưu đãi, Hỗ trợ, Máy cũ, Thu cũ đổi mới, Tư vấn, BHĐT. Mỗi trigger fire vào L1 entry block riêng (set s_campaign) rồi chạy chung qua L2-L8 (46 blocks gồm 26 core + 5 sequence/followup wrappers + 15 reminder blocks). Có 1 Sequence drip campaign + 2 Follow Up triggers chạy song song. Bên cạnh đó, 1 GenAI Trigger luôn lắng nghe inbox — nhưng chỉ kích hoạt khi s_status = chatting (sau khi KH đã cho SĐT). Tổng cộng 12 GenAI items.

46
Total blocks
8
Keyword Triggers
~405
Keywords total
8
Intent branches
4
Lead capture paths
12
GenAI items
1
GenAI Trigger
3
External APIs
1
Sequence drip
2
Follow Ups

Trigger Keywords (Hỏi giá)

Trigger "Hỏi giá" có 50 keywords (47 IN + 3 IS). Để xem đầy đủ 8 triggers + bảng so sánh đụng độ keyword, mở tab "8 Triggers".

Condition 1 — match=IN (chứa) — 47 cụm từ
Condition 2 — match=IS (chính xác) — 3 giá trị

Cấu trúc tổng

LayerMô tảSố block
L1Trigger entry — ghi note + chuyển1
L2IF/ELSE branching theo phone & ERP1
L3aLookup ERP customer info qua n8n1
L4GenAI Intent Router (8 nhánh)1
L58 intent handlers (BHĐT, Trả góp, Hỏi giá, Tư vấn, Thu cũ, Ưu đãi, Hỗ trợ, Máy cũ)8
L6Phone & Time collection + Escalation5
L7Lead capture (4 paths) + Reset6
L8Final layer + CDP terminator3
SEQSequence drip wrapper blocks3
FUFollowup wrapper blocks2
REMRemind content blocks (2 levels × 7 intents)14
REMRemind support: Chưa xác nhận SĐT cũ1

Diagram tổng — flow chính

💡 Tip: Trong tất cả diagram, click vào ô có ID 24-hex để mở thẳng SMAX UI trong tab mới. Hover sẽ đổi viền theo màu: xanh dương = block · cam = trigger · tím = sequence · hồng = follow-up · xanh lá = GenAI item.

Diagram tổng — High-level overview

Toàn bộ 46 blocks theo flow chính + Sequence + Followups.

flowchart TB
    TR[8 Keyword Triggers - 405 keywords + GenAI Trigger]

    subgraph entry [Entry and Routing L1-L4]
      L1H[L1 Hoi gia 69e49c94]
      L1T[L1 Tra gop 69e49c26]
      L1U[L1 Uu dai 69e49d40]
      L1S[L1 Ho tro 69e49d5f]
      L1M[L1 May cu 69e49d7b]
      L1C[L1 Thu cu 69e49d22]
      L1V[L1 Tu van 69e49cfc]
      L1B[L1 BHDT 69e49d98]
      L2[L2 PhoneValidate 69e4a6ee]
      L3a[L3a Customer Order Lookup 69e4a59e]
      L4[L4 GenAI Intent Router 69e49944]
      L1H --> L2
      L1T --> L2
      L1U --> L2
      L1S --> L2
      L1M --> L2
      L1C --> L2
      L1V --> L2
      L1B --> L2
      L2 -->|IF phone and no ERP| L3a
      L2 -->|ELSE| L4
      L3a --> L4
    end

    subgraph intents [L5 - 8 Intent Handlers]
      L5a[BHDT 69e37d1c]
      L5b[Tra gop 69d8c4f5]
      L5c[Hoi gia 69df51c9]
      L5d[Tu van 69df51e0]
      L5e[Thu cu 69df51f2]
      L5f[Uu dai 69df5202]
      L5g[Ho tro 69df526a]
      L5h[May cu 69df522d]
    end

    subgraph phone_layer [L6 - Phone and Time]
      L6Esc[L6 Tu Van Chat 69df16e5]
      L6Phone[L6 Confirm Phone Old 69d8ca5c]
      L6Time[L6 Confirm Time Call 69d8cb34]
    end

    subgraph lead_layer [L7 - Lead Capture]
      L7Reset[L7 Reset Attrs 69e0e7ae]
      L7NewPh[L7 Xin SDT Moi 69e0c181]
      L7Off[L7 OffHours 69d8ce79]
      L7Now[L7 Goi Ngay 69d8cf20 priority high]
      L7_30m[L7 Sau 30P 69d8cfbd priority medium]
      L7Cust[L7 Khung gio khac 69d8d00c]
    end

    subgraph final_layer [L8 - Final]
      L8OffNew[L8 Off Hours Form 69e5dcbc]
      L8Conf[L8 Confirm Custom Time 69df0451 priority low]
      L8CDP[L8-CDP TERMINATOR 69d8d2f7]
    end

    subgraph triggers [Sequence and Followups - chay song song sau L5x]
      SEQ[Sequence 69d8cc27 Drip 3 steps]
      FU1[Followup 69df128f - Remind cho SDT 2 steps]
      FU2[Followup 69df133d - Remind goi SDT cu DEPRECATED]
    end
    subgraph genaitrigger [GenAI Trigger - chay song song trong inbox]
      GTR[Trigger 69e0a17c GenAI ZaloOA s_status=chatting]
      GAI[GenAI 69b90add Phan loai nhu cau]
      CHK[Block 69e73733 Check is_intent_in_progress]
      DETECT[Block 69e0a2bc GenAI Detect - call GenAI 69b90add lan 2]
      ESC[L6-Escalation 69df16e5]
      NEW1[Block 69e0b90b NEW khach-cho-sdt path]
      NEW2[Block 69e0b93b NEW khach-cho-thoi-gian-goi path]
      NEW3[Block 69e0b79a NEW default fallback]
      GTR --> GAI
      GAI --> CHK
      CHK -->|filter pass| DETECT
      DETECT -->|tu-van-qua-chat or chung-chung or truong-hop-khac| ESC
      DETECT -->|khach-cho-sdt| NEW1
      DETECT -->|khach-cho-thoi-gian-goi| NEW2
      DETECT -->|default fallback| NEW3
    end

    DEAD[Block Rong 69d8cc5d - cards empty - 8 refs]

    TR -->|kw Hoi gia| L1H
    TR -->|kw Tra gop| L1T
    TR -->|kw Uu dai| L1U
    TR -->|kw Ho tro| L1S
    TR -->|kw May cu| L1M
    TR -->|kw Thu cu| L1C
    TR -->|kw Tu van| L1V
    TR -->|kw BHDT| L1B
    L4 --> L5a
    L4 --> L5b
    L4 --> L5c
    L4 --> L5d
    L4 --> L5e
    L4 --> L5f
    L4 --> L5g
    L4 --> L5h
    L5c -.->|davao_intent any| L6Esc
    L6Esc --> L7Reset
    L5c -.->|phone any| L6Phone
    L6Phone -->|btn DongY| L6Time
    L6Phone -->|btn khac| L7NewPh
    L7NewPh --> L6Time
    L5c -.->|phone_campaign any| L6Time
    L6Time -->|outhours| L7Off
    L6Time -->|btn Now| L7Now
    L6Time -->|btn 30P| L7_30m
    L6Time -->|btn Custom| L7Cust
    L7Off --> L8OffNew
    L8OffNew --> L8Conf
    L7Cust --> L8Conf
    L7Now --> L8CDP
    L7_30m --> L8CDP
    L8Conf --> L8CDP
    L8CDP --> L7Reset
    L5c -.->|sequence ADD cuoi block| SEQ
    L5c -.->|follow_up CHANGE| FU1

    classDef router fill:#dbeafe,stroke:#2563eb,stroke-width:2px
    classDef trigger fill:#f3e8ff,stroke:#7c3aed,stroke-width:2px
    classDef warn fill:#fef3c7,stroke:#d97706
    class L4,L2 router
    class SEQ,FU1,FU2 trigger
    class DEAD warn
        

Sequence Diagram — 1 call hoàn chỉnh

Ví dụ: KH nhắn "iphone 15 giá nhiêu" và bấm "Gọi Ngay".

sequenceDiagram
    autonumber
    actor KH as Khach hang
    participant Z as Zalo OA
    participant TE as Trigger Engine
    participant BE as Block Engine
    participant DB as MongoDB
    participant N8N as n8n
    participant GAI as GenAI
    participant CDP as CRM CDP

    KH->>Z: iphone 15 gia nhieu
    Z->>TE: webhook message
    TE->>DB: Lookup triggers
    TE->>TE: Match keyword fire trigger
    Note over BE: L1 Trigger Keyword
    BE->>DB: thread_note Trigger keyword Hoi gia
    BE->>BE: goto L2

    Note over BE: L2 PhoneValidate
    alt co phone va no ERP
        BE->>BE: goto L3a
        BE->>N8N: POST webhook 6c27a870
        N8N-->>BE: customer_type note
        BE->>DB: thread_note erp_customer_note
        BE->>BE: self-call POST partner send
        BE->>BE: goto L4
    end

    Note over BE: L4 GenAI Intent Router
    BE->>GAI: classify input
    GAI-->>BE: intent hoi-gia
    BE->>BE: goto L5c

    Note over BE: L5c Intent Hoi gia
    BE->>BE: sequence REMOVE drip
    BE->>DB: set 7 attrs
    BE->>DB: tags add intent-hoi-gia
    BE->>GAI: generate response
    GAI-->>BE: cau tra loi
    BE->>Z: zalo_message
    Z->>KH: Da model anh quan tam dang co gia rat tot
    BE->>DB: follow_up CHANGE 69df128f
    BE->>DB: sequence ADD 69d8cc27
    BE->>BE: goto L6-PhoneOld

    Note over BE: L6 Phone Old
    BE->>Z: Xac nhan SDT plus 2 buttons
    KH->>Z: Dong Y
    Z->>BE: Click=dongy
    BE->>BE: goto L6-TimeCall

    Note over BE: L6 Time Call
    BE->>BE: checktime
    BE->>Z: Anh chi tien nghe may luc nao plus 3 buttons
    KH->>Z: Goi Ngay
    BE->>BE: goto L7-CallNow

    Note over BE: L7 Call Now
    BE->>BE: idempotency check
    BE->>Z: Cam on DDV se goi ngay
    BE->>DB: ticket_priority high davao leadcdp
    BE->>BE: goto L8-CDP

    Note over BE: L8 CDP TERMINATOR
    BE->>GAI: analyze 20 last msgs
    BE->>N8N: webhook 6c27a870 re-lookup
    BE->>N8N: webhook 85759540 send 23-field lead
    N8N->>CDP: Forward to CRM
    BE->>BE: self-call again
    BE->>BE: goto L7-Reset
    Note over CDP: Lead created
        

Phone & Time Collection sub-flow

L6-L8 — flow xin SĐT, chọn giờ gọi và lưu lead.

flowchart TD
    Start[Den tu Intent block L5x] --> Phone[phone any?]
    Phone -->|Yes| L6Old[L6-PhoneOld - Confirm SDT cu]
    Phone -->|No| Form[zalo_form xin SDT moi 30min]

    Form -->|co phone_campaign| L6Time
    L6Old -->|btn Dong Y| L6Time[L6-TimeCall - Confirm Time Call]
    L6Old -->|btn Goi So Khac| L7New[L7-NewPhone - Xin SDT Moi]
    L7New --> L6Time

    L6Time --> CheckTime[checktime 7h30 to 21h30?]
    CheckTime -->|Out of hours| L7Off[L7-OffHours - 5 of 7 inactive]
    CheckTime -->|In hours| Buttons[3 buttons]

    Buttons -->|Now| L7Now[L7-CallNow - priority high]
    Buttons -->|30m| L7_30m[L7-Delay30m - priority medium]
    Buttons -->|Custom| L7Cust[L7-CustomTime - GenAI parse time]

    L7Off --> L8OffNew[L8-OffHoursForm]
    L8OffNew --> L8Conf[L8-Confirm Custom Time - priority low]
    L7Cust --> L8Conf

    L7Now --> CDP[L8-CDP TERMINATOR]
    L7_30m --> CDP
    L8Conf --> CDP
    CDP --> Reset[Reset Attributes]
        

Intent block pattern (L5x — chung cho 8 intent)

Mỗi intent block có ~18 cards theo cùng pattern. Đặc biệt: ADD vào Sequence + Set Followup ở cuối.

flowchart TD
    Entry[Vao tu L4 GenAI Router] --> Seq1[sequence REMOVE drip 69d8cc27]
    Seq1 --> CheckRepeat[davao_intent any? - da co intent tu truoc]
    CheckRepeat -->|Yes| Esc[L6 Tu Van Chat - escalation CSKH]
    CheckRepeat -->|No| NoteCard[thread_note Intent X]

    NoteCard --> Attrs[set 7 attrs - intent X davao_intent X s_campaign keyword X is_intent_in_progress true]
    Attrs --> Tags[tags add intent X bot active - remove leadchat lead]
    Tags --> GAI[GenAI - prompt rieng cho intent]
    GAI --> Delay[delay 0.2s]
    Delay --> Send[zalo_message]

    Send --> CheckPhone[phone any? tuvanquachat null?]
    CheckPhone -->|Yes| GoPhone[goto L6-PhoneOld]
    CheckPhone -->|No| AskPhone[zalo_form xin SDT 30min]

    AskPhone --> CheckCampaign[phone_campaign any?]
    CheckCampaign -->|Yes| GoTime[goto L6-TimeCall]
    CheckCampaign -->|No| ChattingState

    GoPhone --> ChattingState[s_status chatting]
    GoTime --> ChattingState

    ChattingState --> Followup[follow_up CHANGE 69df128f - L5h dung KEEP - inconsistent]
    Followup --> Seq2[sequence ADD drip 69d8cc27]
    Seq2 --> Cleanup[Reset is_intent_in_progress null]
        

Intent → GenAI prompt mapping

IntentBlockSố chủ đề
bhdt69e37d1c7
tra-gop69d8c4f5(prompt rỗng)
hoi-gia69df51c96
tu-van69df51e08
thu-cu69df51f26
uu-dai69df52026
ho-tro69df526a11
may-cu69df522d8

L8-CDP TERMINATOR — Send To CDP

Block cuối cùng — gửi lead lên CDP. 13 cards và nhiều integration.

flowchart TD
    Entry[Den tu L7 lead blocks] --> Sync1[phone_campaign equals phone_ai - IF phone_campaign null AND phone_ai any AND phone null]
    Sync1 --> Sync2[phone_campaign equals phone - IF phone_campaign null AND phone_ai null AND phone any]
    Sync2 --> CheckPhone[phone_campaign null?]
    CheckPhone -->|Yes| Dead[Block Rong - early exit]
    CheckPhone -->|No| Mark[davao leadcdp - flow_end_time NOW - s_status finished]

    Mark --> GAI[GenAI analyze 20 last msgs - set 3 attrs san-pham-quan-tam nhu_cau_tu_van san_pham_hien_tai]
    GAI --> Delay1[delay 1s]
    Delay1 --> ERP[POST webhook 6c27a870 - get customer_type and erp_customer_note]
    ERP --> Delay2[delay 0.5s]
    Delay2 --> NoteCard[thread_note INTERNAL_CHAT - erp_customer_note]
    NoteCard --> Lead[POST webhook 85759540 - 23 field lead payload - send to CRM and CDP]
    Lead --> SelfCall[self-call POST partner send - thread_note USER_PROFILE]
    SelfCall --> RemoveBot[tags remove bot active]
    RemoveBot --> Reset[goto L7-Reset]
        

23 fields gửi lên CRM/CDP (webhook 85759540)

customer_name, phone, id_conversation, thread_tid, thread_url
lead_status, intent
san_pham_quan_tam, nhom_san_pham_quan_tam
nhu_cau_khach_hang, event_source
pid, psid
ticket_type, ticket_priority
campaign_name, flow_start_time, flow_end_time
cta_main, call_time_selection
channel = "Zalo OA"
customer_type, note

Triggers song song — Sequence, Follow Ups, GenAI

Flow Hỏi giá có 3 loại trigger chạy song song với main flow: Sequence drip (kích hoạt sau intent block, remind theo lịch), Follow Up (kích hoạt theo điều kiện idle), và GenAI Trigger (lắng nghe inbox liên tục, gated bởi s_status=chatting).

1. GenAI Trigger — ZaloOA classifier (always-on, gated)

Trigger này LUÔN lắng nghe mọi tin nhắn KH gửi vào inbox Zalo OA, nhưng engine SMAX gating bằng attribute s_status="chatting". Nghĩa là chỉ khi KH đã đi qua flow chính và set s_status=chatting tại các block GoPhone (L6/L7) thì GenAI trigger mới fire.

Trigger 69e0a17c0d19b0411a121652 ZaloOA_Trigger GenAI type=GENAI · platform=zalo · active=true
Page zl2858385037676592618
Gate s_status == "chatting" (engine-level — không trong payload, thông tin từ user)
GenAI 69b90addcc8e2d3ad435be08 · "GenAI phân loại nhu cầu" model=smax-4.1-mini · type_message_history=session · session_length=1

Sequence diagram — GenAI Trigger fire

sequenceDiagram
    autonumber
    participant U as Customer
    participant ZL as Zalo OA
    participant TE as SMAX Trigger Engine
    participant DB as Customer attrs
    participant GA as GenAI 69b90add
    participant BE as Block Engine
    U->>ZL: Send any message after KH gave SDT
    ZL->>TE: Inbox webhook
    TE->>DB: Check s_status
    alt s_status equals chatting
      TE->>GA: Classify message - history session length 1
      GA-->>TE: 1 of 5 intents OR other catch-all
      TE->>BE: send_block 69e73733
      BE->>DB: Filter is_intent_in_progress IS_NOT true AND pid IS_NOT zl806xxx
      alt Filter pass
        BE->>BE: go_to_block 69e0a2bc downstream
      else Filter fail
        BE->>BE: STOP - skip to avoid concurrent intent
      end
    else s_status not chatting
      TE-->>ZL: STOP - GenAI trigger does not fire
    end
        

6 intentions của Trigger → 1 block target chung

#Intention IDIntent name (GenAI item)Active (item)actionblock_id target
129cdcc81…quan-tam-iphone-17-promaxsend_block69e73733
2f23fbe35…khach-cho-sdtsend_block69e73733
346c14a13…tu-van-qua-chatsend_block69e73733
4d8f6899a…khach-cho-thoi-gian-goisend_block69e73733
5b271bd6d…truong-hop-khacsend_block69e73733
6other(catch-all — không có trong intents của GenAI item)send_block69e73733

Block 69e73733 — gating + redirect

Block 69e73733e399c90c1ea469eb — "ZaloOA_Check is_intent_in_progress"
  Card 1 (go_to_block):
    target = 69e0a2bcc8470a7971e15296
    filter (AND):
      • is_intent_in_progress  IS_NOT  "true"
      • pid                    IS_NOT  "zl8060357869761932150"

Block 69e0a2bc — "ZaloOA_GenAI Detect" (10 cards)

Block downstream từ filter gate. Đây là nơi GenAI Trigger thực sự xử lý: gọi LẠI cùng GenAI item 69b90add nhưng với prompt khác + intent set khác, kết quả lưu vào attribute genai_detect, sau đó branch theo value.

Block 69e0a2bcc8470a7971e15296 — "ZaloOA_GenAI Detect"
  Card 1 (go_to_block, GUARD): IF s_source \!= Smax AND campaign_source \!= Smax
                               AND s_status \!= chatting
                               AND s_campaign \!= [keyword_tragop, hoigia, tuvan, thucu,
                                                  uudai, hotro, maycu, bhdt]
                               THEN goto 69d8cc5d (Block_Rỗng — exit)
                               ⚠ Filter có thể là DEAD CODE: GenAI Trigger đã gate s_status=chatting
                                  → điều kiện thứ 3 không bao giờ pass → toàn bộ AND fail.
  Card 2 (thread_note): "GenAI detect - Kích hoạt" (INTERNAL_CHAT)
  Card 3 (genai):       gen_ai_id=69b90add  ← CÙNG GenAI item như ở Trigger
                        prompt: "Dựa trên {{last_content_by_user}}, xác định nhu cầu KH..."
                        intent set: [chung-chung, khach-cho-sdt, khach-cho-thoi-gian-goi,
                                     tu-van-qua-chat, truong-hop-khac]
                        mapping_attr: answer → genai_detect
                        intentions: []  (KHÔNG dùng intentions branching, dùng attribute)
  Card 4 (delay):       0.2s
  Card 5 (go_to_block): IF genai_detect IS "tu-van-qua-chat"        → 69df16e5 (L6-Escalation)
  Card 6 (go_to_block): IF genai_detect IS "khach-cho-sdt"          → 69e0b90b (NEW)
  Card 7 (go_to_block): IF genai_detect IS "khach-cho-thoi-gian-goi" → 69e0b93b (NEW)
  Card 8 (go_to_block): IF genai_detect IS "chung-chung"            → 69df16e5 (L6-Escalation)
  Card 9 (go_to_block): IF genai_detect IS "truong-hop-khac"        → 69df16e5 (L6-Escalation)
  Card 10 (go_to_block): NO filter (default fallback)               → 69e0b79a (NEW)

🔴 CRITICAL FINDING — Conflict giữa system_content và block_prompt
GenAI item 69b90addsystem_content liệt kê 5 intents: quan-tam-iphone-17-promax, khach-cho-sdt, tu-van-qua-chat, khach-cho-thoi-gian-goi, truong-hop-khac. Nhưng prompt ở Card 3 yêu cầu output 5 intents khác: chung-chung, khach-cho-sdt, khach-cho-thoi-gian-goi, tu-van-qua-chat, truong-hop-khac. → LLM nhận 2 set intent xung đột (system_content vs user prompt). Output có thể không deterministic. Đề xuất: đồng bộ 2 set, hoặc tách thành 2 GenAI items riêng (1 cho trigger classifier, 1 cho block detect).

Schema bug — value_boolean lệch values (5 cards): mỗi card go_to_block có value_boolean chứa giá trị của card TRƯỚC nó, còn values mới đúng. Đây là UI bug giống bug "value_boolean string" đã document ở 23+ blocks khác. SMAX engine dùng values nên flow chạy đúng, nhưng cần fix UI để tránh confuse khi đọc code.

📌 3 BLOCK DOWNSTREAM MỚI cần gửi data:
69e0b90b4a84a2e7113f049f — nhánh khach-cho-sdt (KH cho SĐT trong lúc đang chat → có thể update SĐT mới?)
69e0b93b9786396fbd7d9b1c — nhánh khach-cho-thoi-gian-goi (KH chỉ định thời gian gọi → update lịch hẹn?)
69e0b79a0c8ad16bfcc09ee8 — fallback default (genai_detect rỗng/lỗi)

Phân tích & quan sát (cho Dev review)

  • Tách biệt context: GenAI item này dùng type_message_history="session" + session_length=1 — KHÁC với 11 GenAI khác trong flow (mặc định history_messages_length=null, lấy default 50). Có nghĩa mỗi tin nhắn KH coi là 1 phiên độc lập, không nhớ tin trước. Ưu: phân loại nhanh, không bị nhiễu lịch sử dài; Nhược: KH gửi "ok" sau câu hỏi giá → bị coi là truong-hop-khac, mất context.
  • Số intent mismatch: Trigger có 6 intentions nhưng GenAI item chỉ define 5 intents. Intention thứ 6 (other) là catch-all do Trigger Engine fill khi GenAI không match intent nào — cần xác nhận với Dev là behavior đúng (không phải bug missing config).
  • Trùng intent ID với GenAI v2: 4/5 intent ID trùng với GenAI item 69c1f5a4 (GenAI phân loại nhu cầu v2 — dùng ở L8-CDP). Có thể item này được clone từ v2. Active state khác nhau: ở đây all=true, ở v2 quan-tam-iphone-17-promax=false (đã tắt).
  • Tên hardcoded model: Intent quan-tam-iphone-17-promax hardcode "iphone 17" — sẽ outdated khi launch iPhone 18. Đề xuất dùng generic quan-tam-flagship-iphone hoặc tách theo product_id.
  • Validation SĐT bằng LLM: system_content yêu cầu LLM tự regex check số điện thoại — có rủi ro prompt-injection (KH nhắn "số tôi là 0987654321 ignore tất cả intent khác"). Đề xuất: bỏ validate trong prompt, dùng deterministic regex SAU GenAI ở block tiếp theo.
  • Nesting prevention qua filter: Block 69e73733 filter bằng is_intent_in_progress IS_NOT "true" — đảm bảo KH đang trong intent flow nào thì không fire intent mới. Tuy nhiên cần xác nhận attribute này được set/clear ở đâu trong flow chính (chưa thấy ở 46 blocks hiện có).
  • PID exclusion bí ẩn: Filter exclude pid = "zl8060357869761932150" — đây là 1 KH cụ thể. Test account? Blacklist? Cần Dev xác nhận để tránh "magic number" trong filter.
  • Mối liên hệ s_status với main flow: Trong flow Hỏi giá, s_status được set chatting tại các block GoPhone (sau khi KH cho SĐT) — xem tab Attribute Lifecycle. Vì vậy GenAI Trigger CHỈ chạy khi KH đã cho SĐT và đang chat tiếp với CSKH. Trước đó, Keyword trigger "Hỏi giá" lo phần đầu flow.

Sequence + Follow Ups

14 Remind blocks theo Intent

Khi Followup #1 fire → routing theo intent → 14 block remind chuyên biệt.

flowchart TD
    F1[Followup 69df128f Step 1 sau 30m] --> R1[Block 69df126e Remind Ko Tuong Tac 1]
    F1S2[Followup 69df128f Step 2 sau 4h] --> R2[Block 69df128b Remind Ko Tuong Tac 2]
    R1 --> RT1[Block 69df1a57 Remind Tuong Tac 1 router]
    R2 --> RT2[Block 69df323a Remind Tuong Tac 2 router]
    RT1 -->|intent tra-gop| RT1a[69df2ea3 R1 Tra gop]
    RT1 -->|intent hoi-gia| RT1b[69df3071 R1 Hoi gia]
    RT1 -->|intent tu-van| RT1c[69df30e0 R1 Tu van]
    RT1 -->|intent thu-cu| RT1d[69df312e R1 Thu cu]
    RT1 -->|intent uu-dai| RT1e[69df3181 R1 Uu dai]
    RT1 -->|intent ho-tro| RT1f[69df31ca R1 Ho tro]
    RT1 -->|intent may-cu| RT1g[69df34ed R1 May cu]
    RT2 -->|intent tra-gop| RT2a[69df3263 R2 Tra gop]
    RT2 -->|intent hoi-gia| RT2b[69df327c R2 Hoi gia]
    RT2 -->|intent tu-van| RT2c[69df3297 R2 Tu van]
    RT2 -->|intent thu-cu| RT2d[69df32b0 R2 Thu cu]
    RT2 -->|intent uu-dai| RT2e[69df32c9 R2 Uu dai]
    RT2 -->|intent ho-tro| RT2f[69df32e5 R2 Ho tro]
    RT2 -->|intent may-cu| RT2g[69df354c R2 May cu]
        

Remind blocks - timeout form (1h hoặc 30m)

IntentR1 (sau 30m)R1 timeoutR2 (sau 4h)R2 timeout

Block Chưa xác nhận SĐT cũ (Remind Phone Old content)

Block này nhận redirect từ Sequence 69d8cc27 step 1 + step 2 (cùng wrapper 69df12e2 / 12ee). Là content message với 2 buttons.

Block 69df15c8 - "Chưa xác nhận SĐT cũ"
  Card 1: go_to Block_Rong nếu (Click IS dongy/goisokhac AND tuvanquachat IS yes) - idempotency
  Card 2: zalo_message
    Text: "Dạ, khi nào Anh/Chị tiện nghe máy hoặc em có thể hỗ trợ chat tư vấn tại đây ạ."
    Buttons:
      [Gọi Ngay] -> 69d8cf20 (L7-CallNow)
      [Nhắn Tin] -> 69df16e5 (L6-Escalation)

Attribute Lifecycle

SET RESET (null/empty) READ (filter) + TAG - TAG

Matrix: Block × Attribute (set/reset/read)

Cuộn ngang để xem hết các attributes.

Timeline per Attribute (các attr quan trọng)

Lifecycle chi tiết của từng attribute trong flow:

Customer Attributes Tree

Tất cả các customer attributes được set/đọc trong flow, phân loại theo nhóm.

mindmap
  root((Customer Attrs))
    Identity
      pid
      page_pid
      phone
      phone_ai
      phone_campaign
      zalo_name
    Intent
      intent
      davao_intent
      intent_repeat_flag
      is_intent_in_progress
      davao_remind
    Campaign
      s_campaign
      campaign_source
      s_source
      s_status
      flow_start_time
      flow_end_time
    UI_Click
      Click
      davao
      cta_goingay
      cta_goisau30p
      cta_khunggiokhac
      call_time_selection
      confirm_time_call
      tuvanquachat
    Lead_Quality
      ticket_type
      ticket_priority
      lead_status
      cta_main
    GenAI_Output
      genai
      thoi_gian_mong_muon
      san_pham_quan_tam
      nhom_san_pham_quan_tam
      nhu_cau_tu_van
      san_pham_hien_tai
    ERP
      erp_customer_note
      customer_type
        

Bảng tổng 46 blocks

Cards count là approximate.

LayerBlock IDTênCardsActive path

8 Keyword Triggers — Bot-Auto Zalo OA Di Động Việt

Tất cả 8 trigger keyword đều fire vào L1 entry block riêng → set s_campaign → merge vào L2 PhoneValidate → chạy chung từ L2 đến L8. Tổng ~405 keywords trên 8 trigger. Theo card 1 GUARD ở block 69e0a2bc, 8 giá trị s_campaign được hardcode trong filter: keyword_tragop, keyword_hoigia, keyword_tuvan, keyword_thucu, keyword_uudai, keyword_hotro, keyword_maycu, keyword_bhdt.

Tổng quan 8 trigger

#Trigger nameTrigger IDL1 entry blocks_campaignKeywordsMatchOperator
1Hỏi giá69df64a360491403e2c9edbf69e49c94keyword_hoigia50IN + ISAND
2Trả góp69d8c48940711e1e787b0b2b69e49c26keyword_tragop21INAND
3Ưu đãi69df5e15f5f074cb7eba832169e49d40keyword_uudai26INAND
4Hỗ trợ69df675e0c8ad16bfcbeca2969e49d5fkeyword_hotro115IN + ISAND
5Máy cũ69df6adfacb0cfe2bf9e030769e49d7bkeyword_maycu65INOR
6Thu cũ69df5d1829de5bfb5058102969e49d22keyword_thucu31ISAND
7Tư vấn69df68ba0d19b0411a1065ab69e49cfckeyword_tuvan42INAND
8BHĐT69e36edeb6860bc3d3d9dce769e49d98keyword_bhdt54INOR

Đụng độ keyword giữa các trigger

🔴 8 keyword xuất hiện ở >1 trigger — KH gõ keyword này thì SMAX sẽ fire trigger nào? Theo weight? First-match? Cần Dev xác nhận luật ưu tiên. Một số keyword có thể bị classify sai intent (vd: "đổi máy" trigger Hỗ trợ thay vì Tư vấn).

KeywordTrigger fireSố trigger

Chi tiết từng trigger

Click ▶ để mở rộng từng trigger và xem đầy đủ keyword list.

Quan sát cho Dev review

  • Operator inconsistent: 6/8 trigger dùng AND, 2/8 dùng OR (Máy cũ + BHĐT). Vì cả 2 trigger này chỉ có 1 condition nên operator không tạo khác biệt — nhưng nếu sau này thêm condition thứ 2 (vd condition IS) thì behavior sẽ khác. Đề xuất: thống nhất AND.
  • Match type mix: Thu cũ dùng IS (exact) cho TẤT CẢ 31 keyword — nghĩa là "thu cũ máy iPhone" sẽ KHÔNG fire (vì match=IS). Trong khi Hỗ trợ và Hỏi giá dùng cả IN + IS. Cần xác nhận chủ ý này.
  • Keyword count chênh lệch lớn: Trả góp 21 vs Hỗ trợ 115 → recall (true positive rate) khác nhau. Hỗ trợ overfitting? Trả góp underfitting?
  • Typo "ưu đã" trong trigger Ưu đãi (thiếu dấu ngã). Có thể intentional (KH gõ thiếu) hoặc bug. Tương tự "đuợc" trong Trả góp.
  • Whitespace prefix trong nhiều keyword (vd " góp 0%", " cấn móp", " loa", " bảo hành") — match=IN có lẽ trim, nhưng vẫn nên cleanup để consistent.
  • Tổng 8 keyword đụng độ (xem bảng trên) — đặc biệt "đổi máy" (Hỗ trợ + Tư vấn), "thay pin" (Hỗ trợ + Thu cũ), "trầy xước" + "cấn móp" (Máy cũ + Thu cũ). Cần test ưu tiên fire để KH đi đúng intent.
  • L1 block của 7 trigger còn lại chưa có data — giả định identical structure với L1 Hỏi giá (chỉ khác s_campaign value). Cần Dev xác nhận để loại trừ logic riêng (vd Hỗ trợ có thể bypass GenAI Router?).

GenAI Configuration (11 items)

Mỗi card GenAI trong block có 2 lớp prompt: Block-level prompt (instruction tại runtime trong card genai của block) và GenAI item config (system_content, sample_responses, knowledge texts). Cuộn xuống để xem chi tiết từng GenAI.

Tổng quan 11 GenAI items

#GenAI IDTênDùng ởTypeModelHistory

Chi tiết từng GenAI