UC 7.6
Flow 5 - Trustpilot Review Invite: POST /community/trigger-review-invite hẹn lời mời, cron Trustpilot Invitation Queue chạy suppression check rồi gọi Trustpilot Invitation API, webhook ghi nhận review
| Field | Value |
|---|---|
| BA in Charge | Anh Hoang |
| Date Created | 2026-10-12 |
| Version | v1.2 |
| Document References | Zapier Integration V7.pdf (§Flow 5 — Trustpilot · §3.1 bảng Users) · RFQ_ Stack Trading Prop Tech V7.pdf (§3.2 Trigger Review Invite · TrustPilot Review Received · §3.3 Background Workers — Trustpilot Invitation Queue) · QnA from clients — QnA_STAGE5_PAYOUT_WITHDRAWAL.md (A-54→A-58, A-60→A-62, A-116) · Common Rules CR-08, CR-18 |
UC_7.6 — Flow 5: Trustpilot Review Invite
🇻🇳 Section này viết bằng tiếng Việt để BA review. Mọi ID, anchor, tên field/API và text hiển thị cho user giữ nguyên tiếng Anh.
1. Overview
| Field | Content |
|---|---|
| ID | UC_7.6 |
| Use Case | Flow 5: Trustpilot Review Invite |
| Description | UC này mời trader viết đánh giá về Stack Trading trên Trustpilot, sau khi trader vừa nhận tiền thưởng lên level. Lời mời được gửi chậm 1 đến 3 ngày sau khi trả tiền, và hệ thống không mời trader vừa được mời hoặc vừa đánh giá gần đây. Khi trader viết đánh giá qua link mời, hệ thống ghi nhận lại ngày trader đánh giá. |
| Phạm vi | UC này gồm POST /community/trigger-review-invite khi gọi từ Flow 5, cron "Trustpilot Invitation Queue" và webhook POST /webhooks/trustpilot/review-received. Không gồm: Flow 2 gọi cùng endpoint khi trader pass challenge (UC_5.1), hiển thị điểm và review Trustpilot trên marketing site (UC_1.3.3, UC_1.4.2, UC_1.5.3). |
| Zapier Flow | Flow 5 (Payouts — Bonus), bước "Trustpilot". Chạy sau UC_7.3 (Routing & Execution) |
| Zapier Table | Không đọc Table nào |
| API | POST /community/trigger-review-invite · Trustpilot Invitation API · POST /webhooks/trustpilot/review-received (TrustPilot Review Received) |
| Cron Job task | Trustpilot Invitation Queue, chạy liên tục (Schedule: Continuous) |
| 3rd Party | Trustpilot |
2. Trigger
- Lệnh trả tiền Flow 5 thành công (Ref: UC_7.3 BR_7.3.4). Hệ thống hẹn lời mời (§5.1).
- Cron "Trustpilot Invitation Queue" thấy một task trong
Scheduled_Tasksđã đến hạn. Hệ thống gửi lời mời (§5.2). - Trustpilot gọi webhook khi trader viết đánh giá qua link mời. Hệ thống ghi nhận đánh giá (§5.3).
3. Pre-conditions
- Đã có Trustpilot API credential và HMAC secret (khoá bí mật để xác thực chữ ký webhook của Trustpilot) do Stack Trading (Adam Culver) cấp. Chưa có thì tạo ClickUp ticket để yêu cầu.
4. Post-conditions
- Đã gửi: Trustpilot gửi email mời;
Users.trustpilot_invited_atlà thời điểm gửi;BPS_Audit_Logcó thêm 1 dòng. - Bị chặn: task bị bỏ, không gọi Trustpilot, không đổi gì trong
Users(E_7.6.2). - Nhận đánh giá:
Users.trustpilot_reviewed_atlà thời điểm trader gửi đánh giá (BR_7.6.3).
5. Basic Flow
5.1 Hẹn lời mời (Zapier Flow 5)
Stage 1 — Chọn thời gian chờ và hẹn
-
Zapier Flow 5 đọc
Current_Levelcủa trader và chọn thời gian chờ:- Level 1 hoặc 2: không mời, xem E_7.6.1.
- Level 6: chờ 72 giờ (
delay_hours = 72). - Level 3 đến 5, hoặc Level 7 trở lên: chờ 24 giờ (
delay_hours = 24).
-
Zapier gọi
POST /community/trigger-review-invite:Input field Value user_idID của trader vừa được trả tiền delay_hours(int)Theo bước 1 admin_idKhông bắt buộc, Flow 5 không truyền - Chỉ hẹn khi lệnh trả tiền ở UC_7.3 thành công. Lệnh bị timeout hoặc
Failedthì không hẹn, vì trader chưa nhận được tiền thì không được mời. delay_hourstính từ mốc lệnh trả tiền thành công ở UC_7.3, không chờ tiền về ngân hàng của trader. VD: lệnh trả tiền thành công lúc 10:00 ngày 5 cho trader Level 4 thì lời mời đến hạn lúc 10:00 ngày 6.- Không giới hạn số lần mời trong cả quá trình: mọi lần đạt Profit Target từ Level 3 trở lên đều được hẹn, chỉ bị chặn ở bước 5 nếu không đạt suppression check.
- Chỉ hẹn khi lệnh trả tiền ở UC_7.3 thành công. Lệnh bị timeout hoặc
-
Delay Scheduling: Middleware ghi một task vào bảng
Scheduled_Tasks(PostgreSQL) với thời điểm chạy là lúc gọi cộngdelay_hours, rồi trả200 OK. Suppression check không chạy ở bước này mà chạy lúc gửi (bước 5).
5.2 Gửi lời mời (cron Trustpilot Invitation Queue)
Stage 2 — Kiểm tra và gửi
-
Cron "Trustpilot Invitation Queue" (chạy liên tục; đọc bảng
UsersvàScheduled_Tasks) lấy các task đã đến hạn. Task được gửi ngay khi đến hạn, không chờ giờ hành chính của trader. -
Suppression Check: với mỗi task, cron đọc
Usersvà kiểm tra trader có được mời không (BR_7.6.1). Kiểm tra lúc gửi, không phải lúc hẹn, để trader đã đánh giá trong lúc lời mời đang chờ thì không bị mời trùng. Bị chặn thì xem E_7.6.2. -
API Dispatch: đạt thì Middleware gọi Trustpilot Invitation API với
referenceIdlàuser_id.referenceIdlà mã gửi kèm lời mời; khi trader đánh giá qua link mời, webhook ở bước 10 trả lại mã này. Trustpilot tự soạn và gửi email mời. Hệ thống không tạo notification trên Dashboard. Trustpilot báo lỗi thì xem E_7.6.3. -
State Update: Middleware cập nhật
Users.trustpilot_invited_atlà thời điểm hiện tại (BR_7.6.3). -
Audit: Middleware ghi một dòng vào
BPS_Audit_Log, là bảng PostgreSQLbps_audit_logslưu thao tác của admin và của hệ thống, phục vụ compliance và theo dõi vận hành:Field Value idUUID admin_id'SYSTEM'(hoặc NULL). Luồng tự động không có admin thực hiện, nênadmin_idcủaPOST /community/trigger-review-invitelà không bắt buộcuser_iduser_idcủa trader được mờiaction'TRIGGER_REVIEW_INVITE'reason'Automated Milestone Invite'timestampThời điểm hiện tại Dòng log này là bản ghi độc lập, không ảnh hưởng tới flow nào khác. Ghi log lỗi thì xem E_7.6.4.
5.3 Ghi nhận đánh giá (webhook Trustpilot)
Stage 3 — Nhận webhook
- Trustpilot gọi
POST /webhooks/trustpilot/review-received(TrustPilot Review Received) kèm Trustpilot JSON payload. Middleware xác thực chữ ký payload bằng Trustpilot Webhook Secret (HMAC). Chữ ký sai thì xem E_7.6.5. - Middleware lấy
referenceId(chính làuser_id) vàcreated_at(thời điểm trader gửi đánh giá) trong payload, rồi ghiUsers.trustpilot_reviewed_atbằngcreated_atcho trader cóuser_idđó (BR_7.6.3). Đánh giá không qua link mời, hoặc Trustpilot gỡ đánh giá, thì xem E_7.6.6, E_7.6.7. - Middleware trả
200 OKngay để Trustpilot không gửi lại.
6. Exceptional Flows
| Exception ID | Exception | Condition | System Handling / Fallback |
|---|---|---|---|
| E_7.6.1 | Trader Level 1 hoặc 2 | Current_Level từ 2 trở xuống. | Zapier dừng, không gọi POST /community/trigger-review-invite. |
| E_7.6.2 | Bị chặn ở suppression check (Ref: BR_7.6.1) | Trader rơi vào ít nhất 1 trong 4 điều kiện chặn. | Middleware bỏ task một cách im lặng: không gọi Trustpilot, không xếp lại hàng chờ. Lời mời kế tiếp đến từ lần đạt Profit Target sau. VD: trader được mời ngày 1, lên level tiếp ngày 20 thì lời mời ngày 21 bị chặn vì chưa đủ 30 ngày. |
| E_7.6.3 | Trustpilot Invitation API báo lỗi | Gọi Trustpilot không thành công. | Không thử lại, bỏ qua lời mời này. Lời mời kế tiếp đến từ lần đạt Profit Target sau. |
| E_7.6.4 | Ghi bps_audit_logs lỗi | Insert vào bps_audit_logs không thành công. | Middleware bắt lỗi bằng try/catch, ghi lỗi vào server log, trả 200 OK và đi tiếp. Không chặn luồng, không thử ghi lại. VD: Trustpilot đã nhận lời mời cho trader A nhưng ghi bps_audit_logs bị lỗi kết nối database, thì trustpilot_invited_at của trader A vẫn được cập nhật và server log có dòng báo lỗi. |
| E_7.6.5 | Chữ ký webhook sai | Chữ ký HMAC của payload không hợp lệ. | Middleware từ chối, không cập nhật gì. |
| E_7.6.6 | Đánh giá không qua link mời | Trader tự viết đánh giá trên Trustpilot, payload không có referenceId. | Không map được với trader nào. Hệ thống chấp nhận việc này và không dựng cơ chế đối chiếu theo tên hay email. |
| E_7.6.7 | Trustpilot gỡ đánh giá | Đánh giá đã ghi nhận bị Trustpilot gỡ. | Hệ thống không xoá trustpilot_reviewed_at. |
7. Business Rules
8. Open Items
Không còn hạng mục mở. Chi tiết: QnA_init_docs.md.
9. Phân chia trách nhiệm
| Hạng mục | Sotatek build | Stack Trading Ops | Bên thứ 3 |
|---|---|---|---|
Bước Zap Flow 5 "Trustpilot" (điều kiện level, delay_hours) | ✅ | — | Zapier |
POST /community/trigger-review-invite, bảng Scheduled_Tasks, cron Trustpilot Invitation Queue, suppression check, tích hợp Trustpilot Invitation API | ✅ | — | — |
POST /webhooks/trustpilot/review-received (webhook nhận đánh giá, xác thực HMAC) | ✅ | — | — |
| Cấp HMAC secret và credential Trustpilot | — | ✅ (Adam Culver) | — |
| Soạn và gửi email mời, xử lý đánh giá trùng | — | — | Trustpilot |
Ghi bps_audit_logs khi gửi lời mời (try/catch, lỗi chỉ ghi server log) | ✅ | — | — |
Changelog
| Date | Version | Updated item | Before | After | Notes |
|---|---|---|---|---|---|
| 2026-10-12 | v1 | Initial document | — | — | Bản tiếng Việt để BA re-check, viết theo template UC_8.1.1. Câu hỏi còn mở xem QnA_init_docs.md — chưa đưa vào UC. QnA override / bổ sung spec V7: (1) chặn theo trạng thái tài khoản — A-56: "If the account is Failed, Terminated, or Locked, silently drop the task." (2) hai cooldown khác nhau là cố ý — A-54 (tự động 30 ngày, BPS 15 ngày). (3) đếm giờ từ lúc gửi lệnh trả tiền — A-55: "Do not build listeners to wait for external bank clearance." (4) không ghi nhận review tự nhiên, không reset khi Trustpilot gỡ review — A-60, A-61. |
| 2026-10-12 | v1 | Thêm mục "API & Tác vụ nền"; Stage 1–4 | Endpoint chỉ nhắc trong luồng, không có spec Input/Output; cron "Trustpilot Invitation Queue" chỉ một dòng; không nhắc bảng Scheduled_Tasks; endpoint BPS không ghi rõ không có path | Thêm API-1 (POST /community/trigger-review-invite), API-2 (Trustpilot Invitation API), API-3 (POST /webhooks/trustpilot/review-received), API-4 (BPS Trigger Review Invite — path chưa có trong source), JOB-1 (Trustpilot Invitation Queue — Continuous, Users / Scheduled_Tasks), bảng field Users (trustpilot_invited_at, trustpilot_reviewed_at — Timestamp) | Theo yêu cầu BA: UC phải ghi đủ API và tác vụ nền. Nguồn: RFQ V7 §3.2, BPS Endpoints, §3.3; Zapier V7 §3.1 bảng Users. Xử lý khi Trustpilot API lỗi vẫn mở ở QnA N-02. |
| 2026-10-12 | v1 | Basic Flow Stage 1–4 | Nhánh delay_hours = 24 không ghi lại endpoint; Stage 4 chỉ ghi "endpoint BPS" không có path | Mỗi bước gọi API ghi rõ mã + tên + method/path (API-1→API-4); endpoint BPS ghi POST <path chờ chốt> | Theo yêu cầu BA: API phải xuất hiện ngay trong basic flow. |
| 2026-10-13 | v1 | Stage 1, JOB-1, BR_7.6.1 | Chưa nói lệnh trả tiền lỗi thì có hẹn không; Scheduled_Tasks chưa nói lưu ở đâu; chưa nói khung giờ gửi; suppression có 3 điều kiện | Chỉ hẹn khi lệnh trả tiền thành công; Scheduled_Tasks lưu PostgreSQL, không mất khi restart; gửi ngay khi đến hạn; suppression thêm điều kiện 4 (đã tắt email marketing); không lọc theo quốc gia | BA Anh Hoang chốt 2026-10-13: A-114 (không mời), A-59 (không mời), A-99 (lưu DB), A-63 (gửi luôn), A-86 (mời tất cả). N-01 đóng — Flow 2 và Flow 5 là 2 flow riêng, Flow 5 chỉ cần không mời Level 1–2; lặp lời mời đã được chặn bằng cooldown 30 / 15 ngày. |
| 2026-10-13 | v1 | BR_7.6.2 | Chưa nói 2 kênh mời có ghi chung trustpilot_invited_at không | Ghi chung một cột: mời tay cũng chặn lời mời tự động trong 30 ngày | BA Anh Hoang chốt A-75 (2026-10-13): tính chung để tránh gửi quá nhiều; khớp Zapier V7 §3.1 (trustpilot_invited_at — "last automated or manual review invitation"). |
| 2026-10-14 | v1 | Toàn UC — viết lại theo khuôn UC_8.1.x | Có bảng Thuật ngữ; Basic Flow 4 Stage nhưng gọi API theo mã (API-1…API-4, JOB-1) và link xuống mục riêng "API & Tác vụ nền"; mục này liệt kê 4 API (API-1 POST /community/trigger-review-invite, API-2 Trustpilot Invitation API, API-3 POST /webhooks/trustpilot/review-received, API-4 BPS Trigger Review Invite POST <path chờ chốt>) + JOB-1 Trustpilot Invitation Queue + bảng field Users; xử lý lỗi Trustpilot Invitation API (N-02) chỉ ghi trong bảng API-2 | Bỏ bảng Thuật ngữ (giải thích ngay câu dùng lần đầu). Bỏ mục "API & Tác vụ nền": input / output / xử lý của từng API chuyển vào đúng bước Basic Flow (bảng Input field | Value ở Stage 1 và Stage 4). Cron Trustpilot Invitation Queue mô tả trong Trigger + Stage 2, không đánh số. Rẽ nhánh (chữ ký sai, review tự nhiên, gỡ review, 409) viết [If …] → ngay trong bước. Bảng field Users chuyển thành BR_7.6.3. Thêm mục Open Items chứa N-02. Số API giữ 4 API đúng như nguồn: POST /community/trigger-review-invite (Zapier V7 §Flow 5 Trustpilot; RFQ V7 §3.2), Trustpilot Invitation API (RFQ V7 §3.2 Trigger Review Invite bước 3), POST /webhooks/trustpilot/review-received (RFQ V7 §3.2 TrustPilot Review Received), BPS Trigger Review Invite (RFQ V7 BPS Endpoints — không có path, path do BE đặt) | Theo yêu cầu BA: mô tả và thứ tự như UC_8.1.1 / UC_8.1.2. Nội dung nghiệp vụ và BR ID (BR_7.6.1, BR_7.6.2) giữ nguyên. Đối chiếu nguồn: 4 API cũ đều có trong RFQ V7 / Zapier V7 nên không đổi số API; chỉ bỏ JOB-1 khỏi danh sách đánh số (là cron nội bộ, RFQ V7 §3.3). |
| 2026-10-23 | v1 | Stage 2 bước 4–5 | Stage 2 bước 4 chỉ ghi "ghi BPS_Audit_Log"; chưa nói ghi field gì, chưa nói xử lý khi ghi log lỗi | Tách ghi log thành Stage 2 bước 5 (ứng với bước 5 "Audit" của API), ghi ngay trong bước: bảng bps_audit_logs (PostgreSQL) với field id (UUID), admin_id = 'SYSTEM' (hoặc NULL), user_id, action = 'TRIGGER_REVIEW_INVITE', reason = 'Automated Milestone Invite', timestamp = NOW(). Insert bọc try/catch: lỗi thì ghi server log, trả 200 OK, không chặn luồng. Thêm dòng RACI | Khách định nghĩa bổ sung (2026-10-23): "admin_id: Pass 'SYSTEM' (or NULL) if triggered by an automated flow… action: 'TRIGGER_REVIEW_INVITE'… reason: Pass 'Automated Milestone Invite' if triggered by the system… This log is a standalone record and has no impact on other flows… if the insert fails, write the error to the server log and return HTTP 200 OK without blocking execution." |
| 2026-10-23 | v1 | Bỏ Stage 4 (mời tay từ BPS), BR_7.6.2 | Có Stage 4 — BPS Trigger Review Invite (user_id, admin_id, reason, transcript_url; cooldown 15 ngày → 409 Conflict; ghi BPS_Audit_Log); BR_7.6.2 so sánh mời tự động vs mời tay, hai kênh ghi chung trustpilot_invited_at; Trigger, Overview, Scope, Document References, BR_7.6.3, RACI có nhắc mời tay | UC chỉ còn luồng mời tự động (POST /community/trigger-review-invite + cron Trustpilot Invitation Queue) và webhook nhận review. Bỏ Stage 4, BR_7.6.2 và mọi chỗ nhắc mời tay | Theo BA Anh Hoang (2026-10-23): UC_7.6 là luồng tự động sau payout (khớp WBS UC_7.6); endpoint admin thủ công BPS Trigger Review Invite (RFQ V7 BPS Endpoints) không thuộc UC này. |
| 2026-10-23 | v1 | Stage 1–2: tên bước | Bước chỉ đánh số | Gắn tên bước theo logic của POST /community/trigger-review-invite: Delay Scheduling (Stage 1 bước 2), Suppression Check, API Dispatch, State Update, Audit (Stage 2 bước 2–5) | Theo yêu cầu BA: dễ đối chiếu với 5 bước Logic Requirement trong RFQ V7 §3.2. |
| 2026-10-23 | v1 | Stage 1 — Delay Scheduling | Scheduled_Tasks lưu trong PostgreSQL — task không được mất khi hệ thống khởi động lại | Scheduled_Tasks lưu trong PostgreSQL | Theo yêu cầu BA: bỏ vế giải thích thừa; lưu DB thì mặc nhiên không mất khi restart. |
| 2026-10-23 | v1 | Stage 1 — nhánh delay_hours | [Else] → delay_hours = 24; bảng input ghi "ngược lại 24" | Ghi rõ nhánh Else gồm Current_Level từ 3 đến 5 và từ 7 trở lên; bảng input ghi tương tự | Theo yêu cầu BA: ghi cụ thể level thay vì "ngược lại". |
| 2026-10-29 | v1.1 | Toàn UC — cấu trúc lại theo khuôn UC_1.8.7 | Description ghi chi tiết endpoint, bảng Scheduled_Tasks, cron và webhook; nhánh [If …] nằm trong bước; bước đánh số lại từ 1 ở mỗi Stage; BR_7.6.1, BR_7.6.3 dạng bảng riêng | Description chỉ ghi tổng quan. Mục đánh số 1 đến 9; §5 chia 5.1 hẹn lời mời, 5.2 gửi lời mời, 5.3 ghi nhận đánh giá; bước đánh số liên tục 1 đến 11. Thêm bảng §6 Exceptional Flows (E_7.6.1 đến E_7.6.7). 2 BR gom vào bảng §7. Overview thêm dòng API và Cron Job task. Mọi BR đều được refer từ bước hoặc exception liên quan. Giữ nguyên anchor BR_7.6.1, BR_7.6.3, UC_7.6-open-items | BA yêu cầu viết dễ hiểu như UC_1.8.7, không đổi nghiệp vụ |
| 2026-10-30 | v1.2 | E_7.6.3 · §8 Open Items (N-02) | Trustpilot Invitation API báo lỗi: chưa chốt (N-02) | Không thử lại, bỏ qua lời mời; đóng N-02 | Khách xác nhận bản tóm tắt cách xử lý lỗi Flow 5 của BA |