Skip to content

LTV Phase 1

Version: 1.2 Date: 21/04/2026 Author: PO/BA Type: New Feature Complexity: M Module: report analytics, customer revenue, source attribution


File này dùng để làm gì: chốt bức tranh business, phạm vi phase 1, decision, FR và formula cho LTV Phase 1. Nên đọc trước: Executive SummaryA0) Feature OverviewZ) Decision LogA5) Functional RequirementsA10) Business Formulas.

Changelog

VersionDateAuthorThay đổi
1.221/04/2026PO/BAKhóa 4 implementation defaults còn mở: report-role, seed raw source v1, confidence model, refresh strategy hybrid
1.121/04/2026PO/BASửa lại SCR mapping, bổ sung lifecycle contract cho mapping/backfill, nâng chất lượng Decision Log và đồng bộ traceability
1.020/04/2026PO/BAInitial từ design đã chốt và canonical files

Hướng dẫn đọc (RACI)

AudienceĐọc sectionsTrách nhiệm
PO/BAA0 → Z → A5 → A10Approve scope, business rule, formula
Sếp / Business leadExecutive Summary → A0 → Z → A3Chốt định hướng và giá trị business
Tech LeadA0 → Z → A5 → A10Chốt hướng triển khai và reuse strategy
FE DevA0 → A5Hiểu report outputs và semantics filter
BE DevZ → A5 → A10Implement metric, snapshot, mapping, backfill
QAA5 → A10Derive test matrix và sanity checks

Executive Summary (TL;DR)

DIVA cần một định nghĩa LTV chuẩn để mọi bài toán về quảng cáo, giữ chân khách, chi nhánh và nhóm dịch vụ cùng nhìn chung một con số.

Phase 1 chốt LTV chuẩn theo hướng payment-based, actual revenue, all-time, toàn hệ thống, đồng thời tạo một lớp Nguồn gốc LTV chuẩn ổn định theo khách để phục vụ CAC/LTV theo nguồn.

Scope phase 1 dừng ở mức metric + bảng phân tích, chưa làm attribution đa chạm và chưa hứa dashboard chiến lược đầy đủ.

Milestones

MilestoneTargetOwnerĐiều kiện
Canonical files lockedT+0PO/BAEVIDENCE_PACK.md + SOURCE_OF_TRUTH.md complete
PRD approvedT+1 ngàyBusiness + TechChốt formula + scope
UI/Dev spec generationT+3 ngàyPO/BA + TLPRD approved
Implementation planT+4 ngàyPO/BA + TLUI/Dev scope locked

Trạng thái Sign-off

DomainNgườiStatus
BusinessPO / SếpPending
TechTech LeadPending
QAQA LeadPending

Pending Decisions

PDQuestionOptions / AssumptionOwnerDeadlineStatusResolution
PD-001Ma trận mapping chi tiết cho toàn bộ raw source hiện hữu sẽ do ai duyệt cuối?Mapping được cấu hình trên hệ thống bởi role Admin/IT theo quyền được phânPO/BA + Admin/IT20/04/2026ClosedChốt: Admin/IT là role thao tác cấu hình mapping trên hệ thống
PD-002Màn report LTV Phase 1 sẽ đặt trong group report nào?Đặt trong nhóm báo cáo customer_cycle_report_groupPO + TL20/04/2026ClosedChốt: customer_cycle_report_group (Chu kỳ khách hàng)
PD-003Report role seed mặc định cho tab LTV Phase 1 là gì?Reuse role set của customer_cycle_report_group hiện cóTL + Admin/IT21/04/2026ClosedChốt: seed bod, hr_leader, it_leader cho v1
PD-004Raw source nào được dùng làm baseline cho mapping version đầu tiên?Freeze toàn bộ master_data(type = customer_source) active tại thời điểm cutoverPO/BA + Admin/IT21/04/2026ClosedChốt: dùng full active catalog và lưu raw_source_name_snapshot
PD-005Confidence high/medium/unknown được chốt thế nào?Rubric explicit trong PRD + Dev SpecTL + PO/BA21/04/2026ClosedChốt: direct evidence gần first_paid = high; 1 raw source rõ, không mâu thuẫn = medium; còn lại = unknown
PD-006Refresh incremental nên dùng cron hay event?Hybrid event-driven + scheduled reconcile + manual rerunTL21/04/2026ClosedChốt: hybrid

Backlog Phase 2 (Out-of-scope)

#Tính năngLý do defer
1Multi-touch attributionChưa phù hợp phase 1
2Last-touch / assisted-touch analysisKhông phải canonical metric
3LTV forecast / predictive scoringCần data nền ổn định trước
4Dashboard chiến lược đầy đủ cho 6 bài toánPhase 1 chỉ làm metric + bảng phân tích
5Extended customer value gồm referral downstreamChưa phải lớp LTV gốc

Z) Decision Log

IDCategoryQuyết định đã khóaPhương án đã cân nhắcTrade-off / lý do chọnStatus
DEC-001BusinessLTV chuẩn = actual revenue hợp lệ đã thanh toán, sau khi trừ giao dịch đảo chiềuorder total; cash-in tại thời điểm bán prepaid/top-upBỏ khả năng nhìn cash-in sớm để giữ metric sát câu hỏi business “khách thực mang về bao nhiêu tiền”Locked
DEC-002TechnicalMốc chuẩn dùng invoice.paid_atorder.created_at; order.paid_atinvoice.paid_at bám payment-based semantics và khớp nền code hiện cóLocked
DEC-003BusinessKhông tính top-up/prepaid/gói ở thời điểm nạp hoặc muaTính cash-in ngay khi bán gói; tính top-up như revenueGiảm cảm giác “đẹp số” ngắn hạn để tránh thổi phồng LTV trước khi tiêu dùng vào giao dịch hợp lệLocked
DEC-004BusinessVí chính được tính khi dùng để thanh toán; ví khuyến mãi không tínhTính mọi wallet usage; loại cả ví chínhChấp nhận phức tạp hơn ở rule payment method để giữ đúng actual revenue hợp lệLocked
DEC-005BusinessLTV chuẩn là all-time và toàn hệ thốngRolling 30/90 ngày; theo từng chi nhánh phát sinhHy sinh sự linh hoạt của nhiều góc nhìn để có một canonical metric duy nhất cho quản trịLocked
DEC-006BusinessDoanh thu referral downstream không cộng vào LTV gốc của khách giới thiệuGộp downstream revenue vào khách giới thiệuGiữ định nghĩa sạch, tránh double count; extended value sẽ defer phase sauLocked
DEC-007Business1 khách = 1 LTV = 1 Nguồn gốc LTV chuẩn = 1 Kênh nguồn chi tiếtNhiều nguồn canonical trên 1 khách; weighted attributionĐơn giản hóa phase 1 để CAC/LTV đọc được ngay, chấp nhận chưa cover multi-touchLocked
DEC-008TechnicalTách Nguồn khách gốc khỏi Nhóm nguồn LTV chuẩnDùng raw source hiện tại làm canonical luônThêm một lớp chuẩn hóa để tránh raw source động rewrite lịch sửLocked
DEC-009TechnicalMapping raw source -> normalized source phải có versioningOverwrite trực tiếp 1 bảng mapping hiện hànhTăng ceremony cấu hình để đổi taxonomy mà không làm vỡ lịch sử snapshotLocked
DEC-010BusinessKhách cũ được backfill tối đa theo first paid, nhưng không suy diễn quá mứcChỉ tính khách mới; cố gán 100% từ raw source hiện tạiChấp nhận tỷ lệ Chưa xác định cao hơn để đổi lấy độ tin cậy số liệuLocked
DEC-011QAKhông đủ chắc chắn thì vào Chưa xác địnhBắt buộc map vào một nhóm; hidden khỏi reportGiữ Unknown như output hợp lệ để business thấy chất lượng dữ liệu thậtLocked
DEC-012BusinessBộ lọc thời gian phase 1 áp vào cohort first paidCắt revenue theo kỳ; dùng last paid cohortGiữ đúng nghĩa all-time LTV nhưng vẫn cho phép cohort analysisLocked
DEC-013BusinessLTV theo chi nhánh phase 1 = theo chi nhánh first paidPhân bổ đa chi nhánh; branch gần nhấtChấp nhận mất góc nhìn allocation để tránh tranh cãi và sai nghĩa phase 1Locked
DEC-014BusinessLTV theo nhóm dịch vụ phase 1 = theo nhóm dịch vụ khởi đầuPhân bổ toàn bộ vòng đời theo nhiều nhóm dịch vụDùng 1 anchor đơn giản, đủ đọc cohort quality mà không over-modelLocked
DEC-015ScopePhase 1 chỉ làm metric + bảng phân tíchDashboard chiến lược đầy đủ; attribution đa chạm ngay từ đầuƯu tiên nền metric đúng và khả năng go-live sớm thay vì ôm full strategy suiteLocked
DEC-016GovernanceMa trận mapping raw source được cấu hình trên hệ thống bởi role Admin/ITPO tự chỉnh trực tiếp; giao toàn quyền cho mọi role reportTăng kiểm soát thay đổi, chấp nhận thêm bước phối hợp với Admin/ITLocked
DEC-017UX / IAMàn report LTV Phase 1 đặt trong customer_cycle_report_groupTạo report group mới; đặt trong nhóm doanh thuGiữ discoverability theo mental model Chu kỳ khách hàng, tránh đọc sai như báo cáo doanh thu kỳLocked
DEC-018GovernanceReport role seed v1 của customer_cycle_ltv_report reuse role set hiện có của nhóm: bod, hr_leader, it_leaderSeed role mới rộng hơn; chỉ bod; chờ config tay sau go-liveBám pattern migration hiện tại của customer_cycle_report_group, giảm rủi ro permission mismatch ở phase 1Locked
DEC-019Data governanceVersion mapping đầu tiên freeze toàn bộ master_data(type = customer_source) active tại thời điểm cutover thành rule v1Chỉ map các raw source đang có customer dùng; đọc live master data mỗi lần backfillFreeze toàn bộ catalog active giúp BE/QA/audit cùng nhìn một baseline cố định, tránh “hôm nay thêm raw source mới thì lịch sử đổi nghĩa”Locked
DEC-020Data qualityConfidence model v1 = high, medium, unknown theo rubric explicitChỉ high/unknown; để BE tự suy luận mediumGiữ đủ độ phân biệt cho business đọc và QA test, nhưng vẫn đơn giản hơn scoring chi tiếtLocked
DEC-021TechnicalRefresh strategy phase 1 dùng hybrid: event-driven incremental refresh + scheduled reconcile + manual backfill explicitChỉ cron; chỉ event-drivenDùng event-driven để số liệu gần realtime, cron để tự hàn lệch, manual backfill cho lịch sử và rerun có kiểm soátLocked

A) PRD

A0) Feature Overview

Ý tưởng cốt lõi

LTV Phase 1 tạo ra một chỉ số gốc duy nhất để DIVA biết mỗi khách hàng thực sự đáng giá bao nhiêu tiền, đồng thời gắn chỉ số này với một nguồn gốc chuẩn đủ ổn định để dùng cho CAC/LTV, retention và phân tích chi nhánh.

Feature không cố giải hết mọi bài toán nâng cao ngay trong lần đầu. Mục tiêu của phase 1 là dựng đúng nền metric, dựng đúng lớp attribution chuẩn, và dựng đủ các bảng để business đọc được số mà không cần suy diễn bằng tay.

Kiến trúc tổng thể

text
Business view
  ├─ LTV chuẩn theo khách
  ├─ Nguồn gốc LTV chuẩn
  ├─ Kênh nguồn chi tiết
  └─ Các bảng phân tích phase 1

Data layer
  ├─ customer_revenue / customer_revenue_stats (existing)
  ├─ nguồn khách gốc / master data (existing raw source)
  ├─ mapping raw source -> normalized source (new, versioned)
  ├─ snapshot nguồn gốc LTV theo khách (new)
  └─ backfill + confidence model (new)

Report layer
  ├─ Bảng khách hàng
  ├─ Bảng tổng hợp theo nguồn
  ├─ Bảng tổng hợp theo chi nhánh first paid
  ├─ Bảng tổng hợp theo nhóm dịch vụ khởi đầu
  └─ Bảng kiểm soát chất lượng dữ liệu

Mapping sang tài liệu chi tiết:

KhốiPRD (FR)UI Spec (SCR)Dev Spec (Section)
Metric nền LTVFR-001SCR-01C3, C4
Snapshot nguồn gốcFR-002SCR-01, SCR-03C4, C5
Mapping versionFR-003SCR-02C4, C5
Backfill lịch sửFR-004SCR-01C6, C7
Report phase 1FR-005, FR-006, FR-007SCR-01C5, C6
Manual override + auditFR-008SCR-03C5, C8

Quyết định chính (tóm tắt theo nhóm)

NhómQuyết địnhRef
LTV corePayment-based, actual revenue, all-time, system-wideDEC-001 → DEC-005
AttributionTách raw source khỏi normalized source, 1 khách chỉ có 1 canonical sourceDEC-007 → DEC-009
Data historyBackfill tối đa nhưng không suy diễn quá mứcDEC-010, DEC-011
View semanticsTime = cohort first paid, branch = first paid branch, service = initial service groupDEC-012 → DEC-014
Delivery scopePhase 1 chỉ làm metric + bảng phân tíchDEC-015
Governance & placementMapping do Admin/IT cấu hình; report đặt ở customer_cycle_report_groupDEC-016, DEC-017
Access & rolloutReport role seed v1 reuse bod, hr_leader, it_leaderDEC-018
Data baselineFreeze toàn bộ active customer_source vào version v1; confidence rubric 3 mứcDEC-019, DEC-020
Refresh strategyEvent-driven cho increment + cron reconcile + manual backfill explicitDEC-021

Logic kế toán / nghiệp vụ đặc biệt

Khái niệmCó tính vào LTV không?Ghi chú
Thanh toán dịch vụ/sản phẩm hợp lệBase revenue event
Ví chính dùng để thanh toánChỉ khi thực sự tiêu vào giao dịch hợp lệ
Ví khuyến mãiKhôngKhông phản ánh actual revenue hợp lệ
Nạp ví / top-upKhôngKhông tính ở thời điểm nạp
Mua thẻ trả trước / prepaid / góiKhông tính ở thời điểm muaChỉ tính khi được tiêu vào giao dịch hợp lệ nếu future flow hỗ trợ
Refund / hoàn ví / partial refundTrừLà giao dịch đảo chiều

Bảng FR tóm tắt

FRMô tảPriorityPhase
FR-001Chuẩn hóa LTV chuẩn ở cấp customerMust1
FR-002Snapshot Nguồn gốc LTV chuẩn theo kháchMust1
FR-003Quản lý mapping raw source -> normalized source có versioningMust1
FR-004Backfill tối đa khách cũ theo first paid + confidenceMust1
FR-005Bảng khách hàng LTVMust1
FR-006Bảng tổng hợp quản trịMust1
FR-007Bảng kiểm soát chất lượng dữ liệuMust1
FR-008Chỉnh tay nguồn gốc LTV chuẩn có kiểm soátShould1
FR-009Khóa semantics cho time/branch/service viewsMust1
FR-010Scope guard phase 1Must1

Data Model tóm tắt

Table / ArtifactLoạiMục đích
customer_revenueExistingNền giao dịch doanh thu theo khách
customer_revenue_statsExistingAggregate hiện tại theo khách
ltv_customer_snapshotNewLưu LTV chuẩn và metadata nền theo khách
ltv_source_mapping_versionNewVersion của rule map raw source
ltv_source_mapping_ruleNewChi tiết raw source -> normalized source
ltv_customer_source_snapshotNewSnapshot nguồn gốc LTV theo khách
ltv_customer_source_auditNewAudit log cho manual override

Impact lên code hiện tại

  • BE: reuse và extend customer_revenue, customer_revenue_stats, invoice.paid_at logic
  • DB: thêm bảng mapping version, source snapshot, audit
  • FE: thêm report phase 1 trong group customer_cycle_report_group của module report analytics
  • Ops: cần quy trình review ma trận mapping raw source hiện hữu

Timeline

PhaseNội dungTarget
Phase 1ACanonical docs + mapping matrix lockT+1 tuần
Phase 1BMetric nền + snapshot + backfillT+1 sprint
Phase 1CReport tables + QA sanity checkT+1 sprint

A1) Blueprint

FieldValue
FeatureLTV Phase 1
TypeNew Feature
PlatformWeb Admin (diva-admin)
Module ảnh hưởngReport analytics, customer revenue, source attribution

A2) Context

As-Is

  • DIVA đã có doanh thu theo khách và một số report về khách mới/khách cũ/khách quay lại.
  • Nguồn khách gốc hiện là danh mục động và có thể bị thay đổi trên hồ sơ khách.
  • Chưa có một chỉ số LTV canonical để mọi bài toán business cùng dùng.
  • Chưa có một lớp Nguồn gốc LTV chuẩn đủ ổn định để dùng cho CAC/LTV.

To-Be

  • DIVA có một định nghĩa LTV chuẩn duy nhất ở cấp customer.
  • Mỗi khách có Nguồn gốc LTV chuẩnKênh nguồn chi tiết được snapshot cố định.
  • Khách cũ được backfill tối đa nhưng không suy diễn quá mức.
  • Business có thể xem các bảng theo khách, theo nguồn, theo chi nhánh first paid, theo nhóm dịch vụ khởi đầu.

Non-goals / Explicit Out-of-scope

#ItemLý do không thuộc scope
1Multi-touch attributionChưa phù hợp phase 1
2LTV phát sinh trong kỳDễ mâu thuẫn với canonical all-time LTV
3Phân bổ LTV theo nhiều chi nhánhChưa đủ dữ liệu và chưa cần cho phase 1
4Phân bổ LTV theo toàn bộ nhóm dịch vụ khách đã muaChưa phù hợp customer-level metric phase 1
5Dashboard chiến lược đầy đủ cho 6 bài toánScope quá lớn cho phase 1

A3) Goals & Success Metrics

GoalMetricTarget
Có 1 định nghĩa LTV duy nhất trong hệ thốngKhông còn 2 cách hiểu khác nhau giữa marketing/ops/report100%
Có lớp source chuẩn cho CAC/LTVMỗi khách có Nguồn gốc LTV chuẩn hoặc Chưa xác định100%
Hạn chế suy diễn lịch sửTỷ lệ case backfill “không đủ chắc chắn” được tách riêng100% case ambiguous
Business tự đọc được dữ liệuCó report bảng khách hàng + bảng tổng hợp + bảng data quality100% scope phase 1

A4) Personas

PersonaVai tròJTBDFrequency
Marketing ManagerQuản lý acquisitionBiết nguồn nào đem về khách có giá trị vòng đời tốt hơnHàng tuần
CRM / CSKH LeadQuản lý retentionĐánh giá nhóm khách nào nên ưu tiên giữ chânHàng tuần
Regional / Branch DirectorQuản lý chi nhánhBiết cohort first paid của chi nhánh mình có chất lượng tốt khôngHàng tháng
PO/BAĐiều phối chiến lượcCó nền số liệu thống nhất cho các quyết định sau nàyLiên tục

A5) Functional Requirements

FR-001 — Chuẩn hóa LTV chuẩn ở cấp customer

Ref: DEC-001, DEC-002, DEC-003, DEC-004, DEC-005 | Priority: Must | SCR: SCR-01

AC:

  • [ ] Hệ thống tính được LTV chuẩn cho từng khách ở cấp customer.
  • [ ] LTV chuẩn dùng invoice.paid_at làm mốc thời gian chuẩn.
  • [ ] LTV chuẩn cộng dần theo từng lần thanh toán hợp lệ.
  • [ ] LTV chuẩn trừ đúng các giao dịch đảo chiều như refund/hoàn ví/partial refund.
  • [ ] Nạp ví, prepaid, top-up, ví khuyến mãi không được cộng sai vào LTV chuẩn.
  • [ ] LTV chuẩn là all-time và toàn hệ thống.

FR-002 — Snapshot Nguồn gốc LTV chuẩn theo khách

Ref: DEC-007, DEC-008 | Priority: Must | SCR: SCR-01, SCR-03

AC:

  • [ ] Mỗi khách có đúng 1 Nguồn gốc LTV chuẩn.
  • [ ] Mỗi khách có đúng 1 Kênh nguồn chi tiết.
  • [ ] Snapshot được chốt tại thời điểm first paid.
  • [ ] Snapshot lưu được thời điểm chốt, cách chốt và bằng chứng chốt.
  • [ ] Raw source thay đổi sau này không làm rewrite snapshot đã chốt.

FR-003 — Mapping raw source -> normalized source có versioning

Ref: DEC-009 | Priority: Must | SCR: SCR-02

AC:

  • [ ] Hệ thống quản lý được mapping_version.
  • [ ] Mỗi version có effective_from, effective_to, status.
  • [ ] Snapshot nguồn gốc của khách phải lưu mapping_version đã dùng.
  • [ ] Khi business thay đổi taxonomy/rule map thì tạo version mới, không overwrite version cũ.
  • [ ] Rerun backfill tương lai không được tự remap lịch sử theo version mới.

FR-004 — Backfill tối đa khách cũ theo first paid + confidence

Ref: DEC-010, DEC-011 | Priority: Must | SCR: SCR-01

AC:

  • [ ] Backfill dùng lần thanh toán hợp lệ đầu tiên làm mốc chuẩn.
  • [ ] Hệ thống ưu tiên bằng chứng lịch sử/khó sửa trước raw source hiện tại.
  • [ ] Raw source hiện tại chỉ được dùng khi đủ điều kiện an toàn để suy ra.
  • [ ] Nếu không đủ chắc chắn thì khách vào Chưa xác định.
  • [ ] Kết quả backfill lưu được mức độ tin cậy: Cao, Trung bình, Chưa xác định.

FR-005 — Bảng khách hàng LTV

Ref: DEC-015 | Priority: Must | SCR: SCR-01

AC:

  • [ ] Có danh sách khách hàng kèm LTV chuẩn, first paid, last paid, Nguồn gốc LTV chuẩn, Kênh nguồn chi tiết, trạng thái xác định nguồn.
  • [ ] Có filter theo cohort first paid.
  • [ ] Có filter theo chi nhánh first paid.
  • [ ] Có filter theo Nhóm nguồn LTV chuẩn, Kênh nguồn chi tiết.
  • [ ] Có filter theo nhóm dịch vụ khởi đầu.
  • [ ] Có filter theo trạng thái xác định nguồn.

FR-006 — Bảng tổng hợp quản trị

Ref: DEC-012, DEC-013, DEC-014, DEC-015 | Priority: Must | SCR: SCR-01

AC:

  • [ ] Có bảng/tổng hợp LTV trung bình theo Nhóm nguồn LTV chuẩn.
  • [ ] Có bảng/tổng hợp LTV trung bình theo Kênh nguồn chi tiết.
  • [ ] Có bảng/tổng hợp LTV trung bình theo chi nhánh first paid.
  • [ ] Có bảng/tổng hợp LTV trung bình theo nhóm dịch vụ khởi đầu.
  • [ ] Không được gắn nhãn mơ hồ kiểu LTV theo chi nhánh nếu thực chất là revenue phát sinh trong kỳ hoặc multi-branch allocation.

FR-007 — Bảng kiểm soát chất lượng dữ liệu

Ref: DEC-011, DEC-015 | Priority: Must | SCR: SCR-01

AC:

  • [ ] Có chỉ số số khách đã chốt nguồn.
  • [ ] Có chỉ số số khách backfill được.
  • [ ] Có chỉ số số khách Chưa xác định.
  • [ ] Có chỉ số số case chỉnh tay.
  • [ ] Có danh sách/top raw source chưa map được.

FR-008 — Chỉnh tay Nguồn gốc LTV chuẩn có kiểm soát

Ref: DEC-008, DEC-016 | Priority: Should | SCR: SCR-03

AC:

  • [ ] Chỉ role được phân quyền mới được chỉnh tay.
  • [ ] Phase 1 cho phép role Admin/IT thao tác cấu hình mapping và chỉnh tay các case đặc biệt trên hệ thống.
  • [ ] Bắt buộc nhập lý do chỉnh.
  • [ ] Lưu được audit log: ai sửa, sửa lúc nào, từ gì sang gì, lý do gì.
  • [ ] Khi chỉnh tay xong, hệ thống phân biệt được source đó là Chỉnh tay.

FR-009 — Khóa semantics cho các view phase 1

Ref: DEC-012, DEC-013, DEC-014 | Priority: Must | SCR: SCR-01

AC:

  • [ ] Bộ lọc thời gian được diễn giải là cohort theo ngày thanh toán hợp lệ đầu tiên.
  • [ ] LTV theo chi nhánh được diễn giải là chi nhánh first paid.
  • [ ] LTV theo nhóm dịch vụ được diễn giải là nhóm dịch vụ khởi đầu.
  • [ ] UI/help text/tooltip/report label không được dùng wording gây hiểu nhầm với LTV phát sinh trong kỳ hoặc LTV phân bổ đa chiều.

FR-010 — Scope guard phase 1

Ref: DEC-015 | Priority: Must | SCR: N/A

AC:

  • [ ] Phase 1 không bao gồm multi-touch attribution.
  • [ ] Phase 1 không bao gồm forecast/predictive LTV.
  • [ ] Phase 1 không bao gồm dashboard chiến lược đầy đủ cho 6 bài toán.
  • [ ] Phase 1 không bao gồm extended customer value tính downstream referral revenue.

A5.1) Lifecycle Contracts

LIFECYCLE-001 — Mapping Version

text
Tạo version mới


[draft] --Publish version--> [published] --Archive--> [archived]
   │                              │
   └------Clone from published----┘

Ghi chú:
- `published` là read-only
- chỉnh sửa tiếp theo phải tạo draft mới
- publish version mới không tự rewrite snapshot cũ

State definitions

StateÝ nghĩa businessUser thấy gì
draftVersion đang soạn, chưa ảnh hưởng runtimeCó thể sửa rule, effective date, notes; có CTA Lưu nháp, Publish version
publishedVersion đang hiệu lực cho khách mới / snapshot mớiRead-only, hiển thị badge Published, chỉ cho Clone thành draft, Archive nếu được phép
archivedVersion lịch sử để tra cứu, không dùng cho publish mớiRead-only, chỉ phục vụ audit / compare

Transition summary

FromEventGuardToSide effect
noneTạo version mớiRole Admin/ITdraftClone rule từ version cũ hoặc tạo draft rỗng
draftPublish versioneffective_from, version code hợp lệ, các rule bắt buộc đã đủpublishedKhoá version hiện tại, version đang publish trước đó được đóng hiệu lực theo config
publishedClone thành draftRole Admin/ITdraft (record mới)Copy rule sang version mới để tiếp tục chỉnh
publishedArchiveKhông còn là version active duy nhất cho luồng cần dùngarchivedChỉ đổi trạng thái version nguồn, không đổi snapshot lịch sử

LIFECYCLE-002 — Backfill Job

text
Tạo job explicit


[queued] --> [running] --> [done]

                 └--------> [failed]

Ghi chú:
- Publish mapping version mới không tự tạo backfill job
- Mọi lần rerun phải do `Admin/IT` kích hoạt explicit

State definitions

StateÝ nghĩa businessUser thấy gì
queuedJob đã được tạo, chờ worker nhậnBadge Đang chờ xử lý, chưa đổi số liệu report
runningJob đang tính snapshot / data qualityBadge Đang xử lý, hiện job progress/summary gần nhất
doneJob chạy xong và đã ghi summary_payloadHiển thị kết quả mới, unknown count và totals
failedJob lỗi, chưa tạo được kết quả cuốiError banner + CTA Chạy lại

Transition summary

FromEventGuardToSide effect
noneChạy backfillRole Admin/IT, chọn scope + mapping versionqueuedTạo ltv_backfill_job mới
queuedWorker nhận jobLock thành côngrunningGhi started_at
runningHoàn tấtKhông có lỗi blockingdoneUpsert snapshot + ghi summary_payload, finished_at
runningException / validation failCó lỗi runtimefailedGiữ snapshot hợp lệ gần nhất, ghi lỗi để retry
failedChạy lạiRole Admin/IT xác nhận rerunqueued (job mới)Không reuse row failed; tạo job mới để audit rõ

A6) Assumptions

IDAssumptionOwner xác nhận
ASM-001customer_revenuecustomer_revenue_stats đủ tin để làm nền phase 1Tech Lead
ASM-002Business chấp nhận có nhóm Chưa xác định thay vì cố gán đủ 100%PO / Sếp
ASM-003Nhóm nguồn chuẩn phase 1 đủ để quản trị ở mức source group, kênh chi tiết dùng cho drill-downPO / Marketing
ASM-004Role Admin/IT là role phù hợp để thao tác cấu hình mapping trên hệ thống trong phase 1PO / Tech Lead

A6.1) Locked Implementation Defaults

TopicDefault chốt cho phase 1Ref
Report role seedcustomer_cycle_ltv_report seed bod, hr_leader, it_leader giống pattern hiện có của customer_cycle_report_groupDEC-018
Raw source baseline v1Freeze toàn bộ master_data(type = customer_source) active tại thời điểm cutover vào mapping_version đầu tiênDEC-019
Confidence modelhigh = direct evidence gần first_paid; medium = đúng 1 raw source hiện tại, không mâu thuẫn; unknown = còn lạiDEC-020
Refresh strategyEvent-driven incremental refresh cho payment/refund/override; cron reconcile định kỳ; backfill lịch sử/rerun vẫn là explicit jobDEC-021

A7) Risks

IDRiskImpactProbabilityMitigation
RSK-001Raw source hiện tại bị sửa nhiều lần, không phản ánh đúng lịch sử khách cũCaoCaoKhông dùng raw source hiện tại như lịch sử chuẩn; áp dụng confidence model
RSK-002Business hiểu nhầm LTV theo chi nhánh thành revenue phát sinh tại chi nhánhCaoTrung bìnhKhóa semantics, label rõ chi nhánh first paid
RSK-003Mapping rule đổi theo thời gian làm số liệu lịch sử bị méoCaoTrung bìnhÁp dụng mapping_version + snapshot lưu version
RSK-004Tỷ lệ Chưa xác định cao hơn kỳ vọngTrung bìnhCaoXem đây là KPI data quality và truyền thông rõ với business
RSK-005Nhóm report đặt sai IA làm business hiểu LTV như báo cáo doanh thu kỳTrung bìnhTrung bìnhĐặt màn tại customer_cycle_report_group và ghi rõ semantics trên label/help text

A8) Metrics (Post-launch)

MetricCách đoTargetKhi nào đo
Tỷ lệ khách có Nguồn gốc LTV chuẩn hoặc Chưa xác địnhKhách có snapshot / tổng khách trong scope100%Sau backfill
Tỷ lệ khách Chưa xác địnhUnknown / totalTheo dõi xu hướng giảm dầnTuần 1, tháng 1
Tỷ lệ case chỉnh taymanual overrides / total snapshotsCàng thấp càng tốtHàng tháng
Mức độ dùng report của businessSố lần truy cập / export / filter useTheo dõi adoptionSau go-live

A9) Glossary

Thuật ngữ (VI)Thuật ngữ (EN)Định nghĩaPhân biệt với
LTV chuẩnBase LTVTổng actual revenue hợp lệ khách đã thanh toán cho DIVA, sau đảo chiều≠ doanh thu phát sinh trong kỳ
Nguồn khách gốcRaw customer sourceNguồn đang lưu động trên hồ sơ khách≠ Nguồn gốc LTV chuẩn
Nhóm nguồn LTV chuẩnNormalized LTV source groupNhóm nguồn cố định dùng cho CAC/LTV≠ raw source động
Kênh nguồn chi tiếtDetailed source channelLớp chi tiết trong mỗi nhóm nguồn chuẩn≠ multi-touch
Chi nhánh first paidFirst paid branchChi nhánh phát sinh lần thanh toán hợp lệ đầu tiên≠ mọi chi nhánh khách từng giao dịch
Nhóm dịch vụ khởi đầuInitial service groupNhóm dịch vụ của giao dịch first paid≠ toàn bộ nhóm dịch vụ trong vòng đời
Chưa xác địnhUnknownKhông đủ chắc chắn để gán nguồn gốc LTV chuẩn≠ lỗi dữ liệu hệ thống

RACI

DeliverablePOTLAdmin/ITFE DevBE DevQA
PRD (file này)ACIIII
Mapping matrix raw sourceCIAIII
UI SpecCCIRII
Dev SpecIAICRI
QA Test PlanCIIIIR

R = Responsible, A = Accountable, C = Consulted, I = Informed


A10) Business Formulas

FORMULA-001: Base LTV

  • Mô tả: Tổng actual revenue hợp lệ mà một khách đã thanh toán cho DIVA từ first paid đến hiện tại, sau khi trừ giao dịch đảo chiều.
  • Công thức: ltv = sum(valid_payment_amount) - sum(reverse_amount)
  • Biến số:
    • valid_payment_amount: giá trị thanh toán hợp lệ của khách trên từng invoice/payment event
    • reverse_amount: refund, hoàn ví, partial refund hoặc adjustment làm mất hiệu lực doanh thu đã ghi nhận
  • Đơn vị: VND
  • Ví dụ: Khách đã thanh toán 5.000.000 + 3.000.000 + 10.000.000, sau đó refund 2.000.000 → LTV = 18.000.000 - 2.000.000 = 16.000.000
  • Edge cases:
    • top-up / nạp ví / mua prepaid nhưng chưa tiêu vào giao dịch hợp lệ → không cộng
    • ví khuyến mãi → không cộng
    • thanh toán nhiều lần cho cùng một đơn → cộng dần theo từng lần thanh toán hợp lệ

FORMULA-002: First Paid Date

  • Mô tả: Ngày thanh toán hợp lệ đầu tiên của khách, dùng làm mốc cohort và snapshot attribution.
  • Công thức: first_paid_at = min(valid_invoice.paid_at)
  • Biến số:
    • valid_invoice.paid_at: thời điểm thanh toán hợp lệ đầu tiên theo rule của phase 1
  • Đơn vị: Datetime
  • Ví dụ: Khách có các lần thanh toán hợp lệ vào 05/03/2025, 19/03/2025, 04/04/2025 → first_paid_at = 05/03/2025
  • Edge cases:
    • invoice tạo trước nhưng thanh toán sau → dùng paid_at, không dùng created_at
    • nếu không có payment hợp lệ → khách ngoài scope phase 1

FORMULA-003: Average LTV By Source Group

  • Mô tả: LTV trung bình của nhóm khách thuộc cùng Nhóm nguồn LTV chuẩn.
  • Công thức: avg_ltv_by_source = sum(customer_ltv) / count(customers_in_group)
  • Biến số:
    • customer_ltv: FORMULA-001
    • customers_in_group: tập khách có cùng Nhóm nguồn LTV chuẩn
  • Đơn vị: VND / khách
  • Ví dụ: Nhóm Quảng cáo trả phí có 3 khách với LTV 8.000.000, 12.000.000, 10.000.000 → avg = 30.000.000 / 3 = 10.000.000
  • Edge cases:
    • nếu nhóm không có khách → hiển thị
    • Chưa xác định vẫn là một nhóm hợp lệ và phải được tính riêng

FORMULA-004: Cohort Filter Semantics

  • Mô tả: Bộ lọc thời gian của phase 1 áp vào cohort khách theo first_paid_at, không cắt phần doanh thu all-time của LTV.
  • Công thức: cohort_match = first_paid_at in selected_period
  • Biến số:
    • first_paid_at: FORMULA-002
    • selected_period: khoảng thời gian user chọn
  • Đơn vị: Boolean filter
  • Ví dụ: User chọn tháng 03/2025. Khách A first paid ngày 10/03/2025 và hiện có LTV all-time 18.000.000 → khách A thuộc cohort tháng 03/2025 và report vẫn hiển thị đủ 18.000.000, không chỉ doanh thu trong tháng 03/2025.
  • Edge cases:
    • khách first paid ngoài kỳ lọc nhưng có phát sinh doanh thu trong kỳ → không nằm trong cohort phase 1
    • semantics này phải được thể hiện rõ trên UI/report labels

A11) Traceability

Decision / TruthCovered by
Payment-based canonical LTVFR-001, FORMULA-001, FORMULA-002
1 khách = 1 canonical sourceFR-002, FR-003
Backfill tối đa nhưng không suy diễn quá mứcFR-004
Mapping lifecycle / publish safetyFR-003, LIFECYCLE-001
Backfill orchestration / rerun explicitFR-004, LIFECYCLE-002
Report role seed / rolloutDEC-018, A6.1
Raw source seed baseline + confidence rubricDEC-019, DEC-020, A6.1
Hybrid refresh strategyDEC-021, A6.1
Phase 1 chỉ là metric + bảng phân tíchFR-005, FR-006, FR-007, FR-010
Time/branch/service semanticsFR-006, FR-009, FORMULA-004