Challenge
Bạn là Pricing Analyst trong team Finance & Strategy của chuỗi cà phê TungTen, vừa khai trương chi nhánh mới ở Quận 7. Nhiệm vụ đầu tiên của bạn là tính toán Break-even volume (BE volume) để biết cần bán bao nhiêu ly/ngày thì chi nhánh mới có thể hòa vốn.
Cửa hàng đang bán 5 loại cà phê và 1 loại bánh ngọt, mỗi sản phẩm có giá bán, biến phí, contribution margin (CM) khác nhau. Menu mix cũng khác nhau, ảnh hưởng đến BE volume.
- Break-even volume (BE Volumn) là số lượng sản phẩm cần bán ra để tổng contribution margin (CM) đủ để trả chi phí cố định, tức là không lỗ cũng không lời. Nếu bán ít hơn BE volume thì sẽ lỗ, bán nhiều hơn BE volume thì sẽ lời.
- Menu mix là tỉ lệ % đơn hàng của từng sản phẩm trên tổng đơn hàng. Ví dụ, nếu 30% đơn hàng là Latte, thì Latte có mix 30%. Menu mix quyết định Weighted CM, từ đó ảnh hưởng đến BE volume.
- Contribution margin (CM) là số tiền mỗi sản phẩm đóng góp vào việc trả chi phí cố định, tính bằng giá bán trừ đi biến phí. SP có CM cao sẽ giúp chi nhánh dễ hòa vốn hơn.
Dữ Liệu Đầu Vào
| SP | Giá (p) | Biến phí (cv) | CM/đơn vị | Sales mix % |
|---|---|---|---|---|
| Americano | 55,000 | 18,000 | 37,000 | 25% |
| Latte | 65,000 | 22,000 | 43,000 | 30% |
| Cappuccino | 60,000 | 20,000 | 40,000 | 15% |
| Cold Brew | 70,000 | 24,000 | 46,000 | 15% |
| Espresso | 45,000 | 15,000 | 30,000 | 10% |
| Bánh ngọt | 35,000 | 12,000 | 23,000 | 5% |
- Giá (p): Giá bán lẻ mỗi SP.
- Biến phí (cv): Chi phí nguyên vật liệu trực tiếp cho mỗi SP
- CM/đơn vị: Contribution Margin = Giá – Biến phí, số tiền mỗi SP đóng góp vào việc trả tiền cố định.
- Fixed cost: Chi phí cố định hàng tháng của chi nhánh Q7, bao gồm tiền mặt bằng, lương nhân viên, điện nước, marketing, v.v. Đây là chi phí phải trả dù bán được 0 đơn nào. (92,500,000 VNĐ/tháng = 50tr mặt bằng + 30tr lương + 7.5tr điện nước + 5tr marketing)
Time Window phân tích (Chi nhánh Q7 mới khai trương)
- Tuần 1-2 sau khai trương : chưa report
- Tuần 3-4 (14 ngày track) : mix baseline → BE đầu tiên (Challenge này lấy mốc 14 ngày sau khai trương để phân tích tìm baseline)
- T2-T6 (5 ngày): khách văn phòng
- T7-CN (2 ngày): khách gia đình
- 7 ngày = 1 tuần → mix bias một chiều (có khi gặp tuần lễ đặc biệt)
- 14 ngày = 2 tuần → bao phủ đủ 2 chu kỳ
- Tháng 2-3 : mix monthly (rolling 30d)
- Sau 3 tháng : rolling 90d, BE stable
Solution
Bước 1: Tính Weighted Contribution Margin (CM trung bình có trọng số)
Weighted CM (CM trung bình có trọng số) là số tiền trung bình mỗi đơn hàng đóng góp vào việc trả tiền cố định, tính theo menu mix hiện tại → Dễ hiểu: nếu bán 1 đơn hàng bất kỳ theo tỉ lệ menu hiện tại, trung bình sẽ đóng góp bao nhiêu vào tiền cố định?
| SP | CM/đơn vị | × Mix % | Contribution có trọng số |
|---|---|---|---|
| Americano | 37,000 | 25% | 9,250 |
| Latte | 43,000 | 30% | 12,900 |
| Cappuccino | 40,000 | 15% | 6,000 |
| Cold Brew | 46,000 | 15% | 6,900 |
| Espresso | 30,000 | 10% | 3,000 |
| Bánh ngọt | 23,000 | 5% | 1,150 |
| 100% | = 39,200 VNĐ |
Với menu mix hiện tại, trung bình mỗi đơn hàng đóng góp 39200 vào việc trả tiền cố định.
CM ≠ Profit
- CM Latte = 43k ≠ bán 1 ly lời 43k. CM mới chỉ là số đóng góp, chưa trừ fixed cost. (fixed cost = định phí = chi phí cố định = chi phí phải trả dù bán được 0 đơn nào)
Volume Tổng CM Fixed cost Profit
──────────────────────────────────────────────────
1 đơn 39,200 92,500,000 -92,460,800 LỖ
1,000 đơn 39,200,000 92,500,000 -53,300,000 vẫn LỖ
2,360 đơn 92,512,000 92,500,000 ~0 BE
3,000 đơn 117,600,000 92,500,000 +25,100,000 LỜI
CM > 0 chưa chắc Profit > 0
Profit > 0 ⇔ Tổng CM > Fixed cost
Profit = 0 ⇔ Tổng CM = Fixed cost (đây là điểm BE)
Tại sao dùng % mix mà không phải số tuyệt đối?
% mix có tính bất biến với quy mô
VD: Sample nhỏ — 100 đơn:
25 Americano × 37k = 925k
30 Latte × 43k = 1290k
15 Cappuccino× 40k = 600k
15 Cold Brew × 46k = 690k
10 Espresso × 30k = 300k
5 Bánh ngọt × 23k = 115k
──────────────────────────
Tổng CM = 3920k
VD: Sample lớn — 1000 đơn (cùng mix):
250 Americano × 37k = 9,250k
300 Latte × 43k = 12,900k
...
Tổng CM = 39,200k
→ CM_weighted chỉ phụ thuộc tỉ lệ %, không phụ thuộc quy mô. Vì vậy khi dữ liệu chỉ có 14 ngày, bạn vẫn estimate được Weighted CM cho cả tháng/năm tiếp theo (miễn là mix giữ ổn định).
Bước 2: Tính Multi-product Break-even Volume
Break-even volume (BE volume) là sản lượng cần bán để tổng CM = Fixed cost → Profit = 0 → Dễ hiểu: bán bao nhiêu đơn hàng thì chi nhánh Q7 không lỗ?
vBE = 92,500,000 / 39,200 ≈ 2,360 đơn/tháng → Sếp/CFO quan tâm cấp THÁNG
2,360 đơn/tháng / 30 ngày (mở cả tháng) = 78.7 ≈ 79 đơn/ngày → Store manager quan tâm cấp NGÀY (KPI daily)
79 đơn/ngày / 12 giờ (7:00-19:00) ≈ 7 đơn/giờ
Cùng 1 con số, 3 cấp người dùng — pricing analyst phải trả 3 ngôn ngữ khác nhau.
Bước 3: Break down BE Volume Theo Từng SP
BE volume tổng là 2,360 đơn/tháng, nhưng mỗi SP có giá và CM khác nhau, nên cần break down BE volume theo menu mix để biết mỗi SP cần bán bao nhiêu đơn để đạt BE → Dễ hiểu: trong 79 đơn/ngày, cần bán bao nhiêu ly Americano, bao nhiêu ly Latte, … để đạt BE?
BE volume từng SP = v_BE_total × mix %
| SP | Mix % | BE/tháng | BE/ngày |
|---|---|---|---|
| Americano | 25% | 590 | 20 |
| Latte | 30% | 708 | 24 |
| Cappuccino | 15% | 354 | 12 |
| Cold Brew | 15% | 354 | 12 |
| Espresso | 10% | 236 | 8 |
| Bánh ngọt | 5% | 118 | 4 |
| Tổng | 100% | 2,360 | 80 |
Target tối thiểu tính theo Time Window 14 ngày:
Americano ████████████████████ 20 ly
Latte ████████████████████████ 24 ly ◄── high-priority
Cappuccino ████████████ 12 ly
Cold Brew ████████████ 12 ly
Espresso ████████ 8 ly
Bánh ngọt ████ 4 cái
────────────────────────
Tổng: 80 đơn/ngày
Sensitivity Analysis là phân tích độ nhạy, giúp bạn hiểu được BE volume sẽ thay đổi thế nào nếu menu mix thay đổi. Điều này rất quan trọng vì menu mix có thể biến động theo thời gian, và việc đẩy mạnh SP CM cao có thể giúp giảm BE volume mà không cần tăng giá → Dễ hiểu: nếu khách hàng thích uống Cold Brew hơn và cửa hàng push nó lên 20% mix, BE volume sẽ giảm xuống bao nhiêu? Ngược lại, nếu khách hàng thích uống Espresso hơn và nó lên 15% mix, BE volume sẽ tăng lên bao nhiêu?
Mix tốt (đẩy SP CM cao: Latte 30%→35%, Cold Brew 15%→20%; giảm SP CM thấp):
Americano 20%, Latte 35%, Cappuccino 15%, Cold Brew 20%, Espresso 7%, Bánh ngọt 3%
CM_weighted = 20%×37k + 35%×43k + 15%×40k + 20%×46k + 7%×30k + 3%×23k
= 7,400 + 15,050 + 6,000 + 9,200 + 2,100 + 690
= 40,440 VNĐ
vBE = 92,500,000 / 40,440 = 2,287 đơn/tháng = 76 đơn/ngày → TỐT HƠN
Mix base (theo data POS 14 ngày đầu):
vBE = 79 đơn/ngày
Mix xấu (Espresso + Bánh ngọt CM thấp tăng tỉ trọng):
Americano 25%, Latte 25%, Cappuccino 15%, Cold Brew 10%, Espresso 15%, Bánh ngọt 10%
CM_weighted = 25%×37k + 25%×43k + 15%×40k + 10%×46k + 15%×30k + 10%×23k
= 9,250 + 10,750 + 6,000 + 4,600 + 4,500 + 2,300
= 37,400 VNĐ
v_BE = 92,500,000 / 37,400 = 2,473 đơn/tháng = 82 đơn/ngày → XẤU HƠN
Menu mix sensitivity:
- Đẩy Cold Brew 15%→20% & Latte 30%→35% → BE: 79 → 76 đơn/ngày (-3, dễ hơn 4%)
- Đẩy Espresso 10%→15% & Bánh ngọt 5%→10% → BE: 79 → 82 đơn/ngày (+3, khó hơn 4%)
Spread tổng: 82 − 76 = 6 đơn/ngày (≈7.6% range)
→ Đây là “đòn bẩy” quan trọng nhất để chi nhánh Q7 thoát lỗ nhanh hơn mà không cần tăng giá.
Actionable insight:
- Push SP CM cao (Cold Brew, Latte) → giảm BE volume → dễ thoát lỗ hơn.
- Combo pricing: Cold Brew + Bánh ngọt = 90k (so với 70k + 35k = 105k bán lẻ → khách thấy lợi 15k)
- Loyalty push: thẻ tích điểm Cold Brew × 2 (so với SP khác × 1)
- Menu engineering: đặt Cold Brew ở vị trí top, font chữ lớn, kèm icon “BEST SELLER” hoặc “CHEF’S PICK”
- Nếu mix xấu (Espresso, Bánh ngọt tăng) → BE volume tăng → cần marketing educate khách upsell sang SP CM cao.
Bước 5: Data Driven Insight
- Mục tiêu hòa vốn: 2,360 đơn/tháng (79 đơn/ngày) -> Tính theo menu mix hiện tại trong 14 ngày đầu. Đây là baseline để theo dõi tiến độ đạt BE trong tháng tiếp theo
- Hiện trạng 14 ngày đầu: ~65 đơn/ngày → Đang lỗ ~17% so với BE → Đề xuất: combo sáng + push Cold Brew để tăng mix Cold Brew từ 15% → 20% → giảm BE còn 76 đơn/ngày (dễ break-even hơn 4%)
- Rủi ro: nếu Espresso mix tăng > 15% → BE bật lên 82 đơn/ngày → Marketing phải educate khách upsell sang Latte/Cold Brew để giữ mix ổn định
- Phân bổ KPI từng SP/ngày: Latte 24 ly (ưu tiên cao nhất vì CM cao + mix lớn), Americano 20 ly, Cappuccino 12 ly, Cold Brew 12 ly (push để tăng CM weighted), Espresso 8 ly, Bánh ngọt 4 cái (kèm combo)
- Theo dõi hàng tháng: cập nhật menu mix hàng tháng để tính lại BE volume → điều chỉnh KPI từng SP/ngày → báo cáo lên sếp + CFO để đánh giá tiến độ đạt BE và điều chỉnh chiến lược marketing/upsell nếu cần.
- Đây là báo cáo quan trọng nhất của pricing analyst trong 3 tháng đầu, vì nó xác định lộ trình thoát lỗ cho chi nhánh Q7. Sau khi đạt BE, focus sẽ chuyển sang tối ưu profit margin thay vì chỉ tập trung vào volume.
- Báo cáo này cũng sẽ là cơ sở để đánh giá hiệu quả của các chiến dịch marketing (ví dụ: nếu push Cold Brew lên 20% mix, có thực sự giúp đạt BE nhanh hơn không?) và điều chỉnh chiến lược giá nếu cần (ví dụ: nếu biến phí tăng, cần tăng giá hoặc đổi mix để giữ BE ổn định).
/* =====================================================================
STEP 0 — Khai báo tham số
===================================================================== */
DECLARE @store_id INT = 3; -- CN Q7
DECLARE @period_start DATE = '2026-01-01';
DECLARE @period_end DATE = '2026-01-15'; -- Exclusive (< 15 = đến hết ngày 14)
DECLARE @days_in_month INT = 30;
DECLARE @hours_open INT = 12;
/* =====================================================================
STEP 1 — Build menu mix từ POS data thực tế
---------------------------------------------------------------------
Output: mỗi SP có line_count, mix_pct, CM/đơn vị.
Performance:
- Filter date dạng SARGable (col >= ... AND col < ...)
- JOIN order: fact (lớn nhất) ← product (nhỏ, lookup)
- Index IX_fact_txn_store_date được dùng cho seek
===================================================================== */
-- Materialize vào temp table để tránh tính lại nhiều lần
IF OBJECT_ID('tempdb..#menu_mix') IS NOT NULL DROP TABLE #menu_mix;
SELECT
p.product_id,
p.product_name,
p.list_price,
p.variable_cost,
p.contribution_margin, -- PERSISTED column, không cần tính lại
SUM(l.quantity) AS units_sold,
CAST(1.0 * SUM(l.quantity)
/ SUM(SUM(l.quantity)) OVER ()
AS DECIMAL(8,4)) AS mix_pct
INTO #menu_mix
FROM dbo.fact_transaction t
JOIN dbo.fact_txn_line l ON l.transaction_id = t.transaction_id
JOIN dbo.dim_product p ON p.product_id = l.product_id
WHERE t.store_id = @store_id
AND t.txn_datetime >= @period_start
AND t.txn_datetime < @period_end -- SARGable
GROUP BY p.product_id, p.product_name, p.list_price, p.variable_cost, p.contribution_margin;
/* =====================================================================
STEP 2 — Tính Weighted Contribution Margin
===================================================================== */
DECLARE @cm_weighted DECIMAL(14,4);
SELECT @cm_weighted = SUM(mix_pct * contribution_margin)
FROM #menu_mix;
/* =====================================================================
STEP 3 — Tính Fixed Cost (sum theo store + tháng)
===================================================================== */
DECLARE @fixed_cost DECIMAL(14,2);
SELECT @fixed_cost = SUM(amount)
FROM dbo.dim_fixed_cost
WHERE store_id = @store_id
AND cost_month = '2026-01-01';
/* =====================================================================
STEP 4 — Tính Break-even Volume
===================================================================== */
DECLARE @be_volume_month DECIMAL(14,2) = @fixed_cost / @cm_weighted;
DECLARE @be_volume_day DECIMAL(14,2) = @be_volume_month / @days_in_month;
DECLARE @be_volume_hour DECIMAL(14,2) = @be_volume_day / @hours_open;
SELECT
@cm_weighted AS cm_weighted,
@fixed_cost AS fixed_cost,
CEILING(@be_volume_month) AS be_volume_month, -- Làm tròn lên
CEILING(@be_volume_day) AS be_volume_day,
CEILING(@be_volume_hour) AS be_volume_hour;
/* =====================================================================
STEP 5 — Break down BE Volume theo từng SP
===================================================================== */
SELECT
product_name,
CAST(mix_pct * 100 AS DECIMAL(5,2)) AS mix_pct,
contribution_margin AS cm_per_unit,
CEILING(mix_pct * @be_volume_month) AS be_units_month,
CEILING(mix_pct * @be_volume_day) AS be_units_day,
-- KPI store: dùng để gán target dashboard
CONCAT(CEILING(mix_pct * @be_volume_day), ' ly/ngày') AS daily_kpi
FROM #menu_mix
ORDER BY mix_pct DESC;
/* =====================================================================
Report tổng hợp dạng dashboard-ready
---------------------------------------------------------------------
Format JSON để dễ feed sang BI tool / API.
===================================================================== */
SELECT
'BeanWise Q7' AS store,
@period_start AS period_start,
DATEADD(DAY, -1, @period_end) AS period_end,
@cm_weighted AS cm_weighted,
@fixed_cost AS fixed_cost_monthly,
CEILING(@be_volume_month) AS be_volume_month,
CEILING(@be_volume_day) AS be_volume_day,
-- Current state
(SELECT COUNT(*) FROM dbo.fact_transaction
WHERE store_id = @store_id
AND txn_datetime >= @period_start
AND txn_datetime < @period_end)
/ DATEDIFF(DAY, @period_start, @period_end) AS current_avg_daily_txn,
-- Gap to BE
CEILING(@be_volume_day) -
(SELECT COUNT(*) FROM dbo.fact_transaction
WHERE store_id = @store_id
AND txn_datetime >= @period_start
AND txn_datetime < @period_end)
/ DATEDIFF(DAY, @period_start, @period_end) AS gap_to_be
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
GO
DROP TABLE IF EXISTS #menu_mix;
GO

Leave a Comment