Skip to content

SOURCE OF TRUTH — LTV Phase 1

Version: 1.2
Date: 21/04/2026
Author: PO/BA
Purpose: Canonical truth trước khi sinh PRD/UI/Dev/QA


File này dùng để làm gì: khóa canonical truth trước khi sinh PRD/UI/Dev/QA, tránh mỗi file tự phát minh rule riêng. Nên đọc trước: Current-Code FactsSolution Lock SnapshotDay-1 Simplifications.

Changelog

VersionDateAuthorThay đổi
1.221/04/2026PO/BAKhóa implementation defaults cho report-role, seed raw source v1, confidence model và refresh strategy hybrid
1.121/04/2026PO/BAĐồng bộ lại canonical decision IDs với PRD, khóa lifecycle cho mapping/backfill, bổ sung fact về customer_cycle_report_group
1.020/04/2026PO/BAInitial từ design đã chốt

1) Canonical Decisions

IDDecisionCertaintySourceNotes
DEC-001LTV chuẩn = actual revenue hợp lệ đã thanh toán, sau khi trừ giao dịch đảo chiềuConfirmedStakeholder + design docKhông dùng order total / cash-in gross
DEC-002Mốc chuẩn dùng invoice.paid_atConfirmedStakeholder + codeKhông dùng order.created_at
DEC-003Không tính top-up / prepaid / mua gói ở thời điểm nạpConfirmedStakeholderChỉ tính khi đi vào payment hợp lệ
DEC-004Ví chính được tính khi thực trả cho invoice hợp lệ; ví khuyến mãi không tínhConfirmedStakeholder + code reviewKhóa rule wallet semantics
DEC-005LTV chuẩn là all-time và toàn hệ thốngConfirmedStakeholderKhông khóa theo kỳ hay một chi nhánh
DEC-006Doanh thu referral downstream không cộng vào LTV gốc của khách giới thiệuConfirmedStakeholderTránh double count
DEC-0071 khách = 1 LTV = 1 Nguồn gốc LTV chuẩn = 1 Kênh nguồn chi tiếtConfirmedStakeholderKhông có nhiều canonical attribution
DEC-008Tách Nguồn khách gốc khỏi Nhóm nguồn LTV chuẩnConfirmedStakeholder + design docRaw source vẫn động, normalized source là lớp quản trị
DEC-009Mapping raw source -> normalized source phải có versioningConfirmedDesign docKhông overwrite lịch sử
DEC-010Khách cũ được backfill tối đa theo first paid, nhưng không suy diễn quá mứcConfirmedStakeholder + design docƯu tiên evidence lịch sử / khó sửa
DEC-011Không đủ chắc chắn thì vào Chưa xác địnhConfirmedStakeholder + design docUnknown là output hợp lệ
DEC-012Bộ lọc thời gian phase 1 áp vào cohort first paidConfirmedDesign doc reviewKhông cắt revenue all-time
DEC-013LTV theo chi nhánh phase 1 = theo chi nhánh first paidConfirmedDesign doc reviewKhông phân bổ đa chi nhánh
DEC-014LTV theo nhóm dịch vụ phase 1 = theo nhóm dịch vụ khởi đầuConfirmedDesign doc reviewKhông phân bổ đa nhóm dịch vụ
DEC-015Phase 1 chỉ làm metric + bảng phân tíchConfirmedStakeholderScope guard
DEC-016Ma trận mapping raw source được cấu hình trên hệ thống bởi role Admin/ITConfirmedStakeholder + design docRole thao tác hệ thống
DEC-017Màn report LTV Phase 1 đặt trong customer_cycle_report_groupConfirmedStakeholder + codebase reviewNhóm báo cáo Chu kỳ khách hàng
DEC-018Report role seed v1 của customer_cycle_ltv_report reuse đúng role set đang có của nhóm customer_cycle_report_group: bod, hr_leader, it_leaderConfirmedCodebase reviewMở rộng role khác là phase sau / config sau UAT
DEC-019Mapping version đầu tiên phải freeze toàn bộ master_data(type = customer_source) đang active tại thời điểm cutover vào snapshot rule v1ConfirmedFE master data query + DB patternKhông đọc live master data trực tiếp để suy luận lịch sử
DEC-020Confidence model v1 chốt 3 mức: high, medium, unknown theo rubric explicitConfirmedStakeholder + design doc + implementation needKhông để BE/QA tự đoán
DEC-021Refresh strategy phase 1 dùng hybrid: event-driven incremental refresh cho case phát sinh mới + scheduled reconcile định kỳ + manual backfill explicitConfirmedCodebase reviewKhông chọn chỉ cron hoặc chỉ event-driven

2) Business Truths

TopicCanonical truthCertaintyConfirmed byNotes
Core questionBusiness cần biết 1 khách hàng đáng giá bao nhiêu tiền cho DIVAConfirmedStakeholderNền cho CAC/LTV, retention, branch quality
Accounting meaningLTV ở phase 1 phản ánh giá trị thương mại đã thu, không phản ánh tiêu dùng đã sử dụng hếtConfirmedStakeholderKhác với consumption accounting
ReferralDoanh thu của người được giới thiệu không cộng vào LTV gốc của khách giới thiệuConfirmedStakeholderCó thể là chỉ số mở rộng phase sau
Unknown attributionChưa xác định là kết quả hợp lệ, không phải lỗiConfirmedStakeholder + design docKPI chất lượng dữ liệu
Scope guardPhase 1 không hứa attribution đa chạm hay ROI causal theo campaignConfirmedStakeholderTránh overpromise

3) Current-Code Facts

AreaCurrent behaviorFile / code refKeep / Replace / Migrate
Revenue storagecustomer_revenue theo customer và action type payment/refunddiva-backend/pkg/store/customer_revenue.goKeep + Extend
Revenue aggregateCó materialized view customer_revenue_stats theo customer_id1706669141375_customer_revenue_stats/up.sqlKeep + Extend
First paidCó helper dựa trên invoice.paid_atdiva-backend/pkg/store/kpi_metric.goKeep
Raw source storagecustomer_source nằm trên ecommerce_user, dạng mảngdiva-backend/pkg/store/ecommerce_user.goKeep as raw
Source dashboardReport nguồn hiện đọc raw source hiện tại1695093908449_run_sql_migration/up.sqlKeep for ops only
Source historyChưa có bằng chứng có lịch sử source theo thời gianDiscoveryMust respect as gap
Report routeFE route group hiện dùng customer_cycle_report_groupdiva-admin/src/modules/report/types.tsKeep
Report seedMigration mới nhất seed group_id = customer_cycle_report_group; migration cũ dùng customer_cycle_report1752227264000_add_report_table/up.sql, 1750736860000_create_function/up.sqlFollow newer normalized pattern
Report role patternNhóm customer_cycle_report_group hiện seed role bod, hr_leader, it_leader1752227264000_add_report_table/up.sqlReuse for v1
Raw source master dataFE đang load danh sách nguồn khách từ master_data(where: {type = customer_source})useMasterDataCustomer.tsUse as v1 seed source
Invoice/event infrastructureinvoice đã có Hasura event trigger insert/update; hệ thống cũng có cron schedulers qua /schedulerspublic_invoice.yaml, cron_triggers.yamlSupports hybrid refresh
Revenue trigger patternCó bằng chứng DB trigger customer_revenue_after_insert được dùng trong data maintenance/testscustomer_revenue_test.goSupports event-driven incremental update

4) Solution Lock Snapshot

Business askExisting code / screen / DB factLocked approachReuse strategy
Chuẩn hóa LTVĐã có nền customer revenueTạo lớp LTV chuẩn dựa trên actual revenue hợp lệ + reverse adjustments🔧 Extend
Gắn nguồn gốc cho LTVRaw source đang động và không đủ tin để làm canonicalTạo snapshot Nguồn gốc LTV chuẩn theo khách tại first paid🆕 Build mới
Giữ lịch sử ổn định khi mapping thay đổiChưa có versioningTạo mapping version + effective date + snapshot lưu version🆕 Build mới
Lifecycle cho mapping versionChưa có flow cấu hình chuyên biệtKhóa lifecycle draft -> published -> archived; version published là read-only, chỉnh sửa tiếp theo phải clone sang draft mới🆕 Build mới
Phân tích business ở phase 1Chưa có màn/report LTV riêngTạo report theo customer-level metric + bảng tổng hợp quản trị trong customer_cycle_report_group🔧 Extend
Backfill khách cũChưa có source history rõ ràngBackfill tối đa theo bằng chứng tốt nhất; không đủ chắc chắn thì Chưa xác định🔧 Extend
Vận hành backfillChưa có backfill job flow riêng cho LTVDùng job explicit có trạng thái queued -> running -> done/failed; publish version mới không auto rerun lịch sử🆕 Build mới
Seed raw source v1Raw source hiện đang là master data độngFreeze snapshot toàn bộ customer_source active tại thời điểm cutover thành version v1; rule mới về sau đi qua draft mới🔧 Extend
Confidence modelChưa có rubric thống nhất cho source inferenceChốt rubric high/medium/unknown ở mức implementation contract để BE/QA dùng chung🆕 Build mới
Refresh runtimeĐã có event + scheduler infraDùng hybrid: event-driven cho payment/refund/override và cron reconcile để tự hàn lệch🔧 Extend

5) Master Data / Config Fit Check

ClassificationExisting patternLocked storage / admin patternImpacted business screens
master data raw sourcecustomer_source trên ecommerce_user + master dataGiữ nguyên cho vận hànhCustomer profile, CRM, report/filter hiện tại
normalized mappingChưa cóBảng mapping riêng có versioningReport LTV, backfill job, manual override flow
business entity snapshotChưa cóBảng snapshot nguồn gốc LTV theo kháchCustomer-level LTV analytics
seed source catalogmaster_data(type = customer_source) đang là nguồn options hiện hànhFreeze tại cutover thành version v1, lưu raw_source_id + raw_source_name_snapshotMapping drawer, audit compare, backfill explainability

6) Day-1 Simplifications

ItemTemporary Day-1 simplificationWhyPhase sau
AttributionChỉ first-touch canonical, không làm last-touch/multi-touchGiảm tranh cãi và complexityPhase 2+
Time semanticsChỉ hỗ trợ filter theo cohort first paidGiữ đúng nghĩa all-time LTVPhase 2+ có thể thêm LTV phát sinh trong kỳ
Branch semanticsChỉ dùng chi nhánh first paidTránh phân bổ đa chi nhánh ngay từ đầuPhase 2+
Service semanticsChỉ dùng nhóm dịch vụ khởi đầuTránh phân bổ đa nhóm dịch vụPhase 2+
Backfill confidenceKhông cố gán đủ 100% khách cũDữ liệu lịch sử nguồn không đủ chắcPhase 2+ nếu có thêm evidence
Role rolloutV1 chỉ seed report role theo pattern nhóm hiện có (bod, hr_leader, it_leader)Giảm ceremony và bám pattern code hiện tạiSau UAT có thể mở rộng thêm role bằng config

7) Explicit Non-Goals / Deferred

ItemStatusWhy
Multi-touch attributionDeferredKhông phù hợp phase 1
Last-touch canonical sourceDeferredKhông phải lớp quản trị chuẩn
LTV forecast / predictive modelDeferredCần nền data ổn định trước
Dashboard chiến lược trọn 6 bài toánDeferredPhase 1 chỉ làm metric + bảng phân tích
Extended customer value gồm referral downstreamDeferredChưa phải canonical LTV gốc

8) Open Questions

QuestionBlocking?Temporary default
Không còn open question blocking ở phase 1NoCanonical decisions đã khóa trong PRD v1.2

9) Propagation Notes

If this changesMust update
Định nghĩa LTV chuẩnPRD, UI Spec, Dev Spec, QA, HTML brief
Semantics time/branch/servicePRD, UI Spec, Dev Spec, QA
Mapping version strategyPRD, UI Spec, Dev Spec, backfill logic, QA
Mapping lifecycle / publish safetyPRD lifecycle, UI SCR-02, Dev state transitions, QA TC
Report role seed / rolloutSOURCE_OF_TRUTH, PRD, UI permission matrix, Dev Spec RBAC, handoff
Raw source v1 seed strategySOURCE_OF_TRUTH, PRD, Dev Spec migration, QA seed data, handoff
Confidence rubricPRD, Dev Spec resolver logic, QA test cases, handoff
Backfill confidence modelPRD, Dev Spec, QA, handoff
Backfill job states / rerun rulePRD lifecycle, UI SCR-01 data quality, Dev state transitions, QA TC, handoff
Refresh strategy hybridPRD, Dev Spec scheduler/event, QA, handoff
Report placement / Admin actionsHTML brief, UI Spec, Dev Spec, handoff