Thứ Ba tuần đầu tiên của Sprint, founder gửi tin nhắn Zalo lúc 11 giờ đêm: "Anh ơi score 47 có ổn không? Hơi lo."
Thường thì score dưới 60 là dấu hiệu cần làm Data Cleanup Sprint trước - 14 ngày dọn dẹp data trước khi bắt đầu xây dashboard. Nhưng 47 không phải 35. Và quan trọng hơn: sau khi review cụ thể, phần data xấu không nằm ở các nguồn cốt lõi - nó nằm ở Excel tracking thủ công mà đội dự định bỏ sau Sprint anyway.
Chúng tôi nói thẳng: tiếp tục được, với điều kiện không dùng Excel kia làm nguồn cho bất kỳ KPI nào trong dashboard. Founder đồng ý.
Đây là ghi chép từ 7 ngày đầu của Sprint đó. Tất cả thông tin nhận dạng đã được ẩn, số liệu đã được điều chỉnh ±15%, nhưng cấu trúc vấn đề và 3 quick win là thật.
Profile khách (đã ẩn danh)
Quy mô: Retailer ngành đồ gia dụng và nội thất nhỏ, doanh thu 78 tỷ/năm (làm tròn 80 tỷ trong bài).
Kênh bán hàng:
- Shopee: 45% doanh thu (SKU cao cấp, margin tốt hơn)
- Offline: 2 cửa hàng tại TP.HCM - 38% doanh thu
- TikTok Shop: 17% doanh thu (mới 8 tháng)
Hệ thống hiện có:
- POS: KiotViet (cả 2 cửa hàng)
- Kế toán: MISA SME
- Ads: Meta Ads + TikTok Ads Manager
- Tracking nội bộ: Master sheet Google Sheets, do 1 nhân viên update thủ công mỗi sáng thứ Hai
Vấn đề phát biểu: "Mỗi họp thứ Hai, anh quản lý Shopee và anh quản lý offline tranh luận xem kênh nào lãi hơn. Không ai có số để kết luận. Mất 2 tiếng rồi ra về không quyết được gì."
Kỳ vọng từ Sprint: Dashboard P&L theo kênh thật, cảnh báo stockout, và AI memo để họp ngắn lại.
Data Readiness Score 47/100 - cụ thể là gì
Data Readiness Score (DRS) là một checklist 40 điểm chia thành 4 nhóm, mỗi nhóm tối đa 25 điểm:
| Nhóm | Điểm tối đa | Điểm thực | Ghi chú |
|---|---|---|---|
| Độ đầy đủ (data có tồn tại không) | 25 | 18 | POS và MISA đủ, ads data có nhưng phân tán |
| Độ sạch (format nhất quán, không lỗi) | 25 | 12 | Master sheet có 3 cột không nhất quán, Shopee export có lỗi encoding |
| Độ kết nối (có thể join các nguồn không) | 25 | 10 | Không có order_id chung giữa KiotViet và MISA |
| Độ đúng giờ (update theo nhịp cần) | 25 | 7 | Shopee export thủ công, Master sheet delay 2-3 ngày |
| Tổng | 100 | 47 |
Hai nhóm thấp nhất - độ kết nối và độ đúng giờ - đều có giải pháp kỹ thuật trong Sprint (API connect + tự động hóa export). Vấn đề không phải là data không có, mà là data chưa được nối và chưa được update tự động.
Nhóm "độ sạch" thấp chủ yếu do master sheet thủ công - cái mà đội sẽ bỏ sau Sprint. Nên thực tế, con số DRS có ý nghĩa thực là khoảng 55-58/100 nếu loại master sheet ra.
Đó là lý do chúng tôi quyết định tiếp tục.
Ngày 1 - Phỏng vấn và lập bản đồ dữ liệu
9h sáng, Zoom 2 tiếng với founder + quản lý Shopee + quản lý offline
Câu hỏi đầu tiên không phải về data. Là: "Mỗi thứ Hai anh chị cần biết điều gì để ra quyết định được?"
Ba câu trả lời:
- Founder: "Kênh nào đang lãi thật. Không phải doanh thu, mà lãi sau tất cả chi phí."
- Quản lý Shopee: "SKU nào sắp hết hàng - tôi không muốn bị khách complain nữa."
- Quản lý offline: "Cửa hàng nào đang kéo cái kia xuống. Anh ấy luôn nói Shopee tốt hơn nhưng tôi không có số để phản bác."
Ba câu trả lời đó trở thành 3 KPI cốt lõi của dashboard: Channel P&L, Stockout Risk, Location Comparison.
Chiều: Lập bản đồ các nguồn dữ liệu
Vẽ ra tất cả nguồn, format, tần suất update, người responsible:
KiotViet POS → Export CSV thủ công → Google Sheets (cập nhật: mỗi sáng Thứ Hai)
MISA SME → Export Excel thủ công → file lưu local (cập nhật: cuối tháng)
Shopee Seller Center → Export CSV thủ công → gửi email → nhân viên paste vào Master Sheet
TikTok Ads Manager → Dashboard online → không export, nhìn trực tiếp
Meta Ads Manager → Dashboard online → không export
Master Sheet → Google Sheets → 12 tab, 47 cột, format không nhất quán
Nhìn vào đây, ngay ngày 1 đã thấy vấn đề cốt lõi: không nguồn nào kết nối với nguồn nào. P&L thật không tồn tại - không phải vì không có data, mà vì không có cơ chế join chúng lại.
Ngày 2 - Kết nối KiotViet và MISA
Mục tiêu: Pull dữ liệu bán hàng từ KiotViet và đối chiếu với MISA để có doanh thu + cost thật.
KiotViet có API (cần đăng ký KiotViet API Partner). MISA SME không có API public - cần export Excel và xử lý.
Vấn đề ngày 2: KiotViet và MISA dùng hai hệ thống mã sản phẩm khác nhau. KiotViet dùng barcode. MISA dùng mã kế toán nội bộ. Không có mapping table.
Giải pháp: Export toàn bộ danh mục từ cả hai hệ thống → dùng tên sản phẩm để fuzzy match → tạo mapping table 847 SKU. 73% match tự động, 27% cần review thủ công (2 tiếng với quản lý kho).
Sau khi có mapping table, có thể join KiotViet (doanh thu, số lượng bán) với MISA (giá vốn, chi phí nhập) → tính được gross margin thật theo SKU lần đầu tiên.
Ngày 3 - Shopee data và phát hiện đầu tiên
Mục tiêu: Pull dữ liệu đơn hàng Shopee và nối với chi phí ads.
Shopee không có API public cho seller thông thường. Cần export từ Seller Center theo tháng. Với 3 năm lịch sử, đây là 36 lần export thủ công - mất 1.5 tiếng.
Sau khi load vào BigQuery và chạy query đầu tiên:
SELECT
product_category,
SUM(item_price) as gross_revenue,
SUM(shopee_commission) as commission,
SUM(return_amount) as returns,
SUM(item_price - shopee_commission - return_amount) as net_revenue,
COUNT(DISTINCT order_id) as order_count
FROM shopee_orders
WHERE order_date >= '2026-01-01'
GROUP BY product_category
ORDER BY net_revenue DESC
Kết quả làm mọi người im lặng 30 giây:
| Nhóm hàng | Doanh thu gross | Net sau fee + hoàn hàng | Chênh lệch |
|---|---|---|---|
| Nhà bếp cao cấp | 8,2 tỷ | 7,1 tỷ | -13% |
| Phòng khách | 5,8 tỷ | 4,6 tỷ | -21% |
| Phụ kiện nhỏ | 3,4 tỷ | 2,1 tỷ | -38% |
| Đèn & điện | 2,9 tỷ | 2,5 tỷ | -14% |
Nhóm Phụ kiện nhỏ - cái mà quản lý Shopee hay báo cáo là "bán chạy nhất theo số đơn" - có tỷ lệ hoàn hàng 28% và commission 9.5% (do giá thấp, Shopee tính theo tier). Sau tất cả, doanh thu thực chỉ bằng 62% doanh thu báo.
Đây là phát hiện đầu tiên ngày 3. Chưa phải quick win - chỉ là vấn đề cần phân tích tiếp.
Ngày 4 - Dead SKU và 1,8 tỷ đang nằm chờ
Mục tiêu: Phân tích tồn kho so với tốc độ bán.
Pull từ KiotViet: danh sách tất cả SKU còn tồn, số lượng, ngày nhập gần nhất, số lần bán trong 90 ngày gần nhất.
SELECT
sku_code,
product_name,
quantity_on_hand,
unit_cost,
quantity_on_hand * unit_cost as inventory_value,
COALESCE(sold_last_90d, 0) as sold_last_90d,
last_received_date,
DATE_DIFF(CURRENT_DATE, last_sale_date, DAY) as days_since_last_sale
FROM inventory i
LEFT JOIN sales_summary s USING (sku_code)
ORDER BY days_since_last_sale DESC
Kết quả:
| Nhóm | Số SKU | Giá trị tồn kho |
|---|---|---|
| Bán tốt (sold trong 30 ngày) | 312 SKU | 4,2 tỷ |
| Bán chậm (sold trong 90 ngày, không trong 30) | 187 SKU | 2,1 tỷ |
| Dead SKU (không bán trong 90+ ngày) | 143 SKU | 1,8 tỷ |
| Tổng tồn kho | 642 SKU | 8,1 tỷ |
1,8 tỷ đang nằm trong kho, không bán được trong 90+ ngày. Chi phí lưu kho ước tính 15-20 triệu/tháng (diện tích mặt bằng 2 cửa hàng).
143 dead SKU chia thành:
- 67 SKU: đã hết trend (kiểu dáng cũ, đã ra version mới)
- 41 SKU: tồn kho do lỗi dự báo (nhập nhiều quá mùa cao điểm 2024)
- 35 SKU: vẫn có khách hỏi nhưng không được đưa lên Shopee (không ai biết)
35 SKU cuối cùng - quick win đầu tiên ngày 4: đưa lên Shopee ngay. Không cần giảm giá, không cần campaign. Chỉ cần listing.
Ngày 5 - Ad waste và AR aging
Sáng: TikTok Ads + Meta Ads
Pull data từ TikTok Ads Manager API và Meta Ads API. Nối với đơn hàng Shopee theo UTM source.
Phát hiện: Campaign "Phụ kiện nhỏ - Broad" trên TikTok Ads đã chạy 38 ngày, ROAS 1,4 lần (chưa tính commission và hoàn hàng). Sau khi tính:
ROAS thực = Revenue × (1 - commission 9.5% - return 28%) / Ad Spend
= Revenue × 0.625 / Ad Spend
= 1,4 lần × 0.625 = 0,875 lần
Campaign đang lỗ 12.5% trên mỗi đồng ads chi ra. Đã chạy 38 ngày, spend 82 triệu.
Chiều: AR aging (B2B)
Retailer này có một mảng B2B nhỏ - bán cho văn phòng và khách sạn, 8% doanh thu. Pull từ MISA:
| Nhóm AR | Số khách | Giá trị |
|---|---|---|
| Dưới 30 ngày | 12 khách | 240 triệu |
| 30-60 ngày | 8 khách | 180 triệu |
| 60-90 ngày | 5 khách | 320 triệu |
| Trên 90 ngày | 3 khách | 420 triệu |
420 triệu đang ở "trên 90 ngày" - tức là tiền đã cung cấp hàng hóa nhưng chưa thu về. Và từ export MISA, thấy rằng 3 khách này đã được gửi invoice nhưng chưa có bất kỳ follow-up nào trong 2 tháng gần nhất.
Founder chưa biết về khoản này.
Ngày 6 - Đóng gói 3 quick win
Sau 5 ngày phân tích, có đủ dữ liệu để đóng gói 3 quick win cụ thể bằng số:
Quick Win 1: Đưa 35 dead SKU lên Shopee
Hành động: Tạo listing cho 35 SKU còn hàng, còn có khách hỏi nhưng chưa được bán online.
Ước tính doanh thu: 35 SKU × average 2 đơn/tuần × average order value 450 nghìn × 4 tuần = 126 triệu/tháng tăng thêm (conservative, dựa trên tốc độ bán của SKU tương tự đang có listing).
Rủi ro: Thấp. Hàng đã có, không cần nhập thêm. Chỉ cần viết description + chụp ảnh.
Quick Win 2: Tạm pause campaign TikTok "Phụ kiện nhỏ - Broad"
Hành động: Pause 1 campaign cụ thể. Chuyển 82 triệu budget còn lại trong tháng sang campaign Nhà Bếp đang có ROAS 4,2 lần thực.
Tiết kiệm trực tiếp: 82 triệu không chi thêm cho campaign đang lỗ.
Tăng thêm từ reallocate: 82 triệu × ROAS 4,2 lần = 344 triệu doanh thu tiềm năng thêm - không phải quick win chắc chắn, nhưng có cơ sở.
Quick Win 3: Gọi thu nợ 3 khách AR >90 ngày
Hành động: Founder gọi điện trực tiếp (không phải email, không phải nhân viên) cho 3 khách. Cung cấp cho founder số cụ thể: khách A 180 triệu (95 ngày), khách B 140 triệu (112 ngày), khách C 100 triệu (138 ngày).
Kỳ vọng thu hồi: Ít nhất 50% trong 14 ngày, tức 210 triệu. (Thực tế ngày 14: thu 265 triệu - vượt kỳ vọng vì founder gọi trực tiếp và 2/3 khách chỉ cần được nhắc.)
Tổng 3 quick win (conservative):
| Quick Win | Giá trị đo được |
|---|---|
| 35 SKU mới lên Shopee | +126 triệu/tháng doanh thu |
| Pause campaign lỗ | -82 triệu waste (1 tháng) |
| Thu hồi AR >90 ngày | +210 triệu tiền mặt |
| Tổng | 418 triệu trong 14 ngày |
Ngày 7 - Memo Day 1-7 gửi cho founder
Format memo 8 trang:
- Executive Summary - 3 quick win, tổng giá trị, action cần làm ngay hôm nay (1 trang)
- Data Readiness Audit - DRS 47/100, chi tiết từng nhóm, cái nào fix trong Sprint (1 trang)
- Channel P&L thật - So sánh gross revenue vs net revenue theo kênh, bảng theo nhóm hàng (2 trang)
- Inventory Analysis - 143 dead SKU, giá trị, phân loại, đề xuất hành động (1.5 trang)
- Ad Waste Analysis - Các campaign lỗ, ROAS thực sau fee và hoàn hàng (1 trang)
- AR Aging - 3 khách >90 ngày, số liệu cụ thể, script gợi ý cho cuộc gọi (0.5 trang)
- Plan Sprint tuần 2-4 - Timeline, deliverables, người phụ trách nội bộ (1 trang)
Memo gửi 8h sáng thứ Tư. Founder đọc trên xe đi làm. 9h30 gọi lại: "Nhìn cái AR aging tôi giật mình. Tôi gọi 3 ông đó ngay hôm nay."
Cuộc trò chuyện ngày 14 - refund hay tiếp tục
Ngày 14 là mốc quyết định của cam kết refund. Chúng tôi chủ động gửi Zalo trước: "Anh muốn đánh giá 14 ngày đầu theo cam kết không?"
Founder: "Cảm ơn anh nhắc. Thành thật mà nói, tôi đang phân vân."
Phân vân vì: dashboard chưa done (đang tuần 2), và anh vừa mất 1 ngày họp nội bộ về việc đưa SKU mới lên Shopee (không ai có thời gian chụp ảnh).
Chúng tôi chia sẻ lại số:
- Quick Win 3 (AR): Thu được 265 triệu từ 3 khách - 100% từ cuộc gọi ngày 7 mà chúng tôi trigger, dựa trên AR aging data từ ngày 5.
- Quick Win 2 (Campaign): Đã pause - chưa đo được tác động rõ vì campaign mới trên Nhà Bếp cần 2 tuần để optimize.
- Quick Win 1 (35 SKU): Chưa implement - founder xác nhận đây là do nội bộ chưa sắp xếp được người chụp ảnh.
Tổng giá trị đo được sau 14 ngày: 265 triệu tiền mặt thật thu về, trực tiếp từ output của 5 ngày đầu audit.
Chúng tôi nói thẳng: "Nếu anh muốn refund, chúng tôi hoàn tiền 100% theo cam kết, không hỏi lý do. Nhưng 265 triệu thu về đó là thật, và tuần 2-4 là phần chúng tôi build hạ tầng - phần mà giá trị dài hạn nằm ở đó."
Founder: "Không, tiếp tục. Tôi chỉ cần anh giúp tôi nói chuyện với team về ảnh sản phẩm."
Triển khai tiếp tục. Dashboard live ngày 28. Sau buổi tổng kết ngày 30: chọn gói Đồng hành tiêu chuẩn.
Điều chúng tôi học từ client này
DRS 47 không phải câu trả lời cuối cùng. Cần đọc detail để hiểu vấn đề nằm ở đâu - 47 do master sheet thủ công khác với 47 do database bị mất.
Quick win đầu tiên phải là tiền thật, không phải tiềm năng. 265 triệu thu về là tiền thật. 126 triệu từ 35 SKU mới là tiềm năng. Cả hai đều quan trọng, nhưng cần ít nhất 1 quick win là tiền thật để ngày 14 không thành ngày khó.
Cuộc trò chuyện ngày 14 phải do chúng tôi chủ động mở trước. Nếu đợi client hỏi, thường là họ đã có câu trả lời rồi. Chủ động mở ra trước với số thật là cách duy nhất để cuộc trò chuyện đó là thảo luận, không phải thông báo.
Nếu bạn đang tự hỏi liệu dữ liệu của mình có đủ điều kiện để bắt đầu Triển khai không, câu trả lời cần một buổi 30 phút chia sẻ màn hình, không phải một câu trả lời chung chung. Đặt lịch rà soát và chúng tôi sẽ ước tính điểm sẵn sàng dữ liệu ngay trong buổi gặp.
Đọc tiếp
Ngày 14 Triển khai: cảnh báo đỏ một campaign Meta đã chảy máu 5 tuần
Lúc wire xong cảnh báo ROAS cho Meta Ads, hệ thống đỏ lên ngay một campaign nằm trong group 'Brand Awareness', chạy 5 tuần liên tục, không ai check vì campaign này không gắn KPI doanh thu. ROAS 0,4 lần. Pause hôm đó. Khôi phục 80 triệu ngân sách.
Đọc bài5 công cụ dữ liệu. 0 cầu nối. Quen không?
Founder VN đa kênh trung bình có 5 hệ thống: Sapo, Shopee Seller, TikTok Shop, MISA, Excel master sheet. Mỗi hệ thống một số. Cuối tuần, một bạn nhân viên ngồi 6 tiếng gộp tay. Đây là vấn đề kiến trúc dữ liệu, không phải vấn đề công cụ, và mua thêm công cụ thứ 6 chỉ làm nó tệ hơn.
Đọc bàiPhân tích sâu lần đầu mất 80 giờ. Lần thứ 10 còn 24 giờ. Đây là vì sao.
Hành trình productize gói Phân tích sâu từ 80 giờ xuống 24 giờ qua 10 engagement. Không phải vì làm nhanh hơn, vì thư viện KPI tích lũy + thư viện prompt AI tích lũy + 18 câu hỏi đã tinh chỉnh. Đây là khác biệt giữa dịch vụ tư vấn và dịch vụ đóng gói.
Đọc bài