Thấy một mã nằm kho lâu, phản xạ đầu tiên thường là giảm giá. Nhưng mã đó có thể đã hết mùa, sắp quá hạn giao, ảnh chụp tệ, đang để nhầm giá cao, hoặc chỉ là phần mềm ghi sai tồn. Giảm giá cho một mã sai giá hay sai số liệu là mất tiền mà không giải quyết gì. Bài này dùng bảng tồn giả lập 12 mã, các công thức tính bằng bảng tính hay Python, và câu lệnh để AI phân loại kèm lý do. Sau đó người giữ kho đi kiểm hàng thật. AI không nhìn thấy kho của bạn.
Bài làm tiếp: so giảm giá, bán kèm và dừng nhập trên cùng một mã.
Hiểu việc: phần nào là công thức, phần nào là AI, phần nào là người
| Phần | Ai hay cái gì làm | Ví dụ |
|---|---|---|
| Số tồn, giá vốn, số bán | Phần mềm quản lý kho, báo cáo của sàn | Báo cáo tồn kho, báo cáo bán hàng theo sản phẩm |
| Tuổi hàng, số ngày bán hết, hạn giao cuối | Công thức (bảng tính hoặc Python), không phải AI | Ngày kiểm trừ ngày nhập |
| Phân loại và ghi lý do bằng lời | AI soạn nháp theo quy tắc bạn đưa | "Hết mùa vì bán 30 ngày gần nhất chỉ bằng 20% ba tháng trước" |
| Xác nhận hàng còn thật, còn nguyên, đúng lô | Người giữ kho | Đếm, xem hạn trên bao bì |
| Quyết giảm giá, bán kèm, dừng nhập | Chủ shop | Bài tiếp theo |
Chuẩn bị dữ liệu
Ví dụ với Sapo, phần mềm quản lý bán hàng nhiều kênh (đối chiếu tài liệu ngày 03/10/2026):
- Báo cáo tồn kho: cần quyền "Báo cáo kho"; có cột mã SKU, giá vốn, tồn kho, giá trị tồn kho (giá vốn nhân tồn kho); xuất được ra Excel.
- Báo cáo bán hàng theo sản phẩm: chọn "30 ngày qua" hoặc khoảng tùy chọn; doanh thu ghi nhận theo ngày giao thành công, nên số bán 30 ngày đến chậm hơn ngày khách đặt vài hôm.
- Sản phẩm quản lý theo lô, hạn sử dụng: tệp xuất đơn nhập hàng có trường mã lô, ngày sản xuất, hạn sử dụng.
- Tồn kho trong Sapo bằng "đang giao dịch" cộng "có thể bán": hàng đã nằm trong đơn chờ đóng gói vẫn tính là tồn.
Phần mềm khác có tên mục khác; cần đúng các cột, không cần đúng phần mềm. Lượt xem trang sản phẩm lấy từ phần số liệu của sàn (tên chỉ số tùy sàn). Không đưa tên khách, số điện thoại vào bảng.
Bước 1. Bảng tồn giả lập 12 mã
Ngày kiểm 03/10/2026. Ban60, Ban90 là số cộng dồn (Ban60 gồm cả Ban30). Mua: "he" là hàng mùa hè, "noel" là hàng mùa Giáng sinh. Mọi dòng là dữ liệu giả lập, có cài sẵn lỗi.
Ma,Ten,Ton,Nhap_lo,NSX,HSD,Ban30,Ban60,Ban90,Gia_von,Gia_san,Gia_chuan,Xem30,Dang_KM,Mua
BGN-500,Binh giu nhiet 500ml,85,2026-08-20,,,96,190,280,78000,159000,159000,2400,khong,
QM-MINI,Quat mini cam tay,140,2026-04-10,,,9,30,74,62000,149000,149000,1500,khong,he
KCN-50,Kem chong nang 50ml,60,2026-05-02,2025-06-01,2027-05-31,12,25,39,95000,219000,219000,900,co,
SRM-100,Sua rua mat 100ml,48,2026-08-01,2026-03-01,2028-03-01,30,58,85,52000,119000,119000,1300,khong,
HC-3N,Hop com thuy tinh 3 ngan,120,2026-06-15,,,8,17,27,88000,189000,189000,3200,co,
TGN-01,Tui giu nhiet,90,2026-07-01,,,6,14,31,41000,129000,99000,700,khong,
KH-TRE,Khay tre,-6,2026-03-12,,,4,9,15,35000,89000,89000,300,khong,
BTT-200,Banh trang tron 200g,70,2026-09-05,2026-08-25,2026-11-25,25,25,25,18000,45000,45000,1100,co,
DL-USB,Den LED USB,75,2026-02-20,,,5,11,16,21000,59000,59000,400,khong,
OC-HG,O cam hen gio,40,2026-08-28,,,26,49,70,96000,199000,199000,1000,khong,
LG-NOEL,Day den trang tri Noel,200,2026-09-20,,,3,3,3,33000,79000,79000,400,khong,noel
GS-CHU,Gang tay silicon,55,2026-07-10,,,14,10,38,15000,39000,39000,600,khong,
Bước 2. Công thức: đặt ra trước, để AI không tự nghĩ
- Tuổi hàng = ngày kiểm trừ ngày nhập lô cũ nhất còn tồn. Phần mềm không theo lô thì chỉ có ngày nhập gần nhất; ghi rõ điều đó.
- Bán từng khoảng 30 ngày: K1 = Ban30; K2 = Ban60 trừ Ban30; K3 = Ban90 trừ Ban60.
- Tốc độ bán mỗi ngày = K1 chia 30. Hàng nhập chưa đủ 30 ngày thì chia cho số ngày thật kể từ ngày nhập.
- Số ngày bán hết ước tính = Tồn chia tốc độ bán. Đây là phép chia, không phải dự báo: nó giả định tháng tới bán như tháng vừa qua.
- Hạn giao cuối (hàng có hạn dùng, bán trên Shopee) = HSD trừ số lớn hơn giữa 30 ngày và 30% thời hạn (HSD trừ NSX). Quy định đăng bán của Shopee (bản 14/8/2024) yêu cầu hàng khi giao còn ít nhất 30% thời hạn và ít nhất 30 ngày. Kênh khác kiểm quy định riêng.
Quy tắc phân loại, theo thứ tự ưu tiên (ngưỡng là ví dụ biên tập, bạn tự chỉnh):
| Thứ tự | Loại | Điều kiện |
|---|---|---|
| 1 | Lỗi số liệu | Tồn âm, hoặc K2, K3 âm (số cộng dồn bị giảm) |
| 2 | Cận hạn | Số ngày bán hết lớn hơn số ngày còn tới hạn giao cuối |
| 3 | Sai giá | Giá đang bán trên sàn khác bảng giá chuẩn |
| 4 | Hết mùa | Hàng mùa hè, K1 không quá 40% của K3 |
| 4 | Chưa tới mùa | Hàng mùa sắp tới (Noel): không xếp chậm, không giảm |
| 5 | Ảnh, nội dung kém | Lượt xem 30 ngày từ 1.000 trở lên mà đơn chia lượt xem dưới 1% |
| 6 | Chậm, chưa rõ lý do | Không thuộc loại nào, số ngày bán hết trên 60 |
| 7 | Bình thường | Còn lại |

Bước 3. Câu lệnh cho AI phân loại kèm lý do
Dán bảng ở Bước 1, công thức và bảng quy tắc ở Bước 2, rồi dán:
Đây là bảng tồn kho GIẢ LẬP của shop, ngày kiểm 03/10/2026, cùng công thức và quy tắc phân loại ở trên. 1. Kiểm dữ liệu trước: liệt kê ô trống, tồn âm, số cộng dồn bị giảm, hạn dùng sớm hơn ngày sản xuất. Mã có lỗi số liệu thì KHÔNG tính tiếp, chỉ ghi "lỗi số liệu" và lỗi gì. 2. Với các mã còn lại, tính và ghi phép tính: tuổi hàng, K1, K2, K3, tốc độ bán mỗi ngày, số ngày bán hết, hạn giao cuối (nếu có HSD), tỷ lệ đơn trên lượt xem. 3. Xếp mỗi mã vào MỘT loại theo đúng thứ tự ưu tiên; nếu thỏa nhiều điều kiện, ghi thêm "lý do phụ". 4. Mỗi mã viết một câu lý do dẫn đúng con số đã tính. 5. Với mỗi mã chậm, ghi một việc người giữ kho cần kiểm tại kho (đếm, xem hạn trên bao bì, xem tình trạng hộp). Không dự báo doanh số, không đề xuất mức giảm giá, không quyết nhập hay hủy. Không tự sửa số liệu. Chỗ thiếu dữ kiện ghi "thiếu".
Bước 4. Đáp án tính bằng chương trình độc lập
Kết quả của AI phải khớp bảng này. Nếu muốn tự chạy, dùng đoạn Python ở cuối bước.
| Mã | Tồn | Tuổi (ngày) | K1/K2/K3 | Bán mỗi ngày | Ngày bán hết | Loại | Lý do |
|---|---|---|---|---|---|---|---|
| BGN-500 | 85 | 44 | 96/94/90 | 3,20 | 27 | Bình thường | |
| QM-MINI | 140 | 176 | 9/21/44 | 0,30 | 467 | Hết mùa | K1 bằng 20% K3; phụ: 0,6% lượt xem ra đơn |
| KCN-50 | 60 | 154 | 12/13/14 | 0,40 | 150 | Cận hạn | Hạn giao cuối 24/10/2026, còn 21 ngày |
| SRM-100 | 48 | 63 | 30/28/27 | 1,00 | 48 | Bình thường | Hạn giao cuối 25/07/2027 |
| HC-3N | 120 | 110 | 8/9/10 | 0,27 | 450 | Ảnh, nội dung kém | 3.200 lượt xem, 0,25% ra đơn, đang khuyến mãi vẫn chậm |
| TGN-01 | 90 | 94 | 6/8/17 | 0,20 | 450 | Sai giá | Giá sàn 129.000 khác giá chuẩn 99.000 |
| KH-TRE | âm 6 | không tính | Lỗi số liệu | Tồn âm | |||
| BTT-200 | 70 | 28 | 25/0/0 | 0,89 | 78 | Cận hạn | Hàng mới nhập; hạn giao cuối 26/10/2026, còn 23 ngày |
| DL-USB | 75 | 225 | 5/6/5 | 0,17 | 450 | Chậm, chưa rõ | Không thuộc loại nào |
| OC-HG | 40 | 36 | 26/23/21 | 0,87 | 46 | Bình thường | |
| LG-NOEL | 200 | 13 | 3/0/0 | 0,23 | 867 | Chưa tới mùa | Hàng Noel nhập 20/09; không giảm |
| GS-CHU | 55 | 85 | 14/âm 4/28 | không tính | Lỗi số liệu | Ban60 (10) nhỏ hơn Ban30 (14) |
Đọc bảng:
- KCN-50: 21 ngày tới hạn giao cuối, với tốc độ hiện tại chỉ bán khoảng 8 hộp, còn khoảng 52. Nếu quyết giảm giá vì sắp hết hạn, quy định đăng bán của Shopee yêu cầu nêu rõ ngày hết hạn trong mô tả.
- BTT-200: K2, K3 bằng 0 vì hàng mới nhập 28 ngày, không phải vì bán chậm dần. Nó vào loại cận hạn vì thời hạn ngắn (92 ngày).
- HC-3N: đang khuyến mãi mà vẫn chậm, nhiều người xem nhưng ít người mua: giảm thêm khó giúp; cần xem ảnh, mô tả, đánh giá.
- TGN-01: sửa giá về bảng chuẩn trước, chờ một kỳ rồi mới xét lại.
- LG-NOEL: bán ít vì chưa vào mùa. Một AI chỉ nhìn số ngày bán hết sẽ đòi giảm giá; đó là quyết định sai.
- Giá trị tồn của các mã chậm (giá vốn nhân tồn): QM-MINI 8.680.000đ, HC-3N 10.560.000đ, KCN-50 5.700.000đ, TGN-01 3.690.000đ, DL-USB 1.575.000đ, BTT-200 1.260.000đ.
import csv, io, math
from datetime import date, timedelta
NGAY_KIEM = date(2026, 10, 3)
DU_LIEU = """[dán nguyên khối dữ liệu ở Bước 1, kể cả dòng tiêu đề]"""
for r in csv.DictReader(io.StringIO(DU_LIEU.strip())):
ton = int(r["Ton"]); b30, b60, b90 = int(r["Ban30"]), int(r["Ban60"]), int(r["Ban90"])
tuoi = (NGAY_KIEM - date.fromisoformat(r["Nhap_lo"])).days
k1, k2, k3 = b30, b60 - b30, b90 - b60
toc = k1 / min(30, tuoi)
ngay_het = ton / toc if toc > 0 else math.inf
loai, ghi = [], ""
if ton < 0 or k2 < 0 or k3 < 0: loai.append("loi so lieu")
if r["HSD"]:
hsd, nsx = date.fromisoformat(r["HSD"]), date.fromisoformat(r["NSX"])
han = hsd - timedelta(days=max(30, math.ceil(0.3 * (hsd - nsx).days)))
con = (han - NGAY_KIEM).days; ghi = f"han giao cuoi {han:%d/%m/%Y}, con {con} ngay"
if ton > 0 and ngay_het > con: loai.append("can han")
if r["Gia_san"] != r["Gia_chuan"]: loai.append("sai gia")
if r["Mua"] == "he" and k3 > 0 and k1 <= 0.4 * k3: loai.append("het mua")
if r["Mua"] == "noel": loai.append("chua toi mua")
if int(r["Xem30"]) >= 1000 and k1 / int(r["Xem30"]) < 0.01: loai.append("anh/noi dung kem")
if not loai: loai.append("cham, chua ro" if ngay_het > 60 else "binh thuong")
print(r["Ma"], ton, tuoi, f"{toc:.2f}", round(ngay_het) if ngay_het != math.inf else "-", loai, ghi)
Chương trình in mọi loại mà mã thỏa; loại đầu tiên theo thứ tự ưu tiên là loại chính. Với mã lỗi số liệu (KH-TRE, GS-CHU), bỏ qua các con số chương trình vẫn in ra.
Bước 5. Người giữ kho kiểm hàng thật
AI và công thức chỉ đọc số trong phần mềm. Trước khi chủ shop quyết, người giữ kho kiểm:
| Mã | Kiểm gì tại kho |
|---|---|
| KH-TRE, GS-CHU | Đếm lại, xem phiếu nhập, đơn hủy, đơn trả gần nhất; sửa số liệu bằng phiếu kiểm kho (Sapo có ứng dụng kiểm kho) rồi mới phân loại lại |
| KCN-50, BTT-200 | Xem hạn in trên bao bì từng lô; hạn ghi kiểu "tháng/năm" thì theo cách hiểu trong quy định của Shopee |
| QM-MINI, DL-USB, HC-3N | Hộp còn nguyên không, hàng có lỗi không, có lô nào hỏng phải tách ra |
| Mọi mã chậm | Có đơn đặt nhập đang chờ về không (Sapo gọi là "hàng đang về") |
Thêm một lưu ý: nếu shop chạy chiến dịch quảng cáo tự chọn sản phẩm của Shopee, tài liệu Shopee Ads ghi hệ thống tự đưa mọi sản phẩm chưa có chiến dịch hiển thị nào vào chiến dịch. Mã đang lỗi số liệu hay sắp quá hạn giao có thể bị quảng cáo; rà danh sách sản phẩm trong chiến dịch.
Ca thử
| Ca | Thay đổi | Đầu ra đúng |
|---|---|---|
| Đúng | Bảng như trên | 12 mã đúng loại như bảng đáp án |
| Thiếu dữ kiện | Xóa ô NSX của KCN-50 | AI ghi "thiếu NSX, không tính được hạn giao cuối", không tự đoán thời hạn 3 năm |
| Sai dữ kiện | Ghi HSD của BTT-200 là 2026-08-15 (trước NSX 2026-08-25) | Xếp lỗi số liệu, yêu cầu người giữ kho xem bao bì |
| Dấu hiệu sai | Cách kiểm | Câu lệnh sửa |
|---|---|---|
| LG-NOEL bị đề xuất giảm giá | Xem cột Mua | "Hàng mùa sắp tới xếp chưa tới mùa, không đề xuất giảm." |
| BTT-200 tính tốc độ 25 chia 30 | So số ngày từ ngày nhập | "Hàng nhập chưa đủ 30 ngày, chia cho số ngày thật." |
| GS-CHU được phân loại bình thường | Tính K2 | "Ban60 nhỏ hơn Ban30 là lỗi số liệu, dừng tính mã này." |
| AI viết "dự kiến bán hết trong 5 tháng" | Đọc lý do | "Số ngày bán hết là phép chia giả định tốc độ không đổi, ghi đúng như vậy." |
| Hạn giao cuối KCN-50 khác 24/10/2026 | Tính tay: thời hạn 729 ngày, 30% là 219 ngày | "Dùng số lớn hơn giữa 30 ngày và 30% thời hạn." |
Bàn giao
| Việc | Ai làm | Ai nhận | Ai duyệt |
|---|---|---|---|
| Xuất báo cáo tồn, bán, lô từ phần mềm | Người giữ kho | Kế toán, đối soát | Kế toán, đối soát kiểm đủ cột, đúng kỳ |
| Chạy công thức, so với kết quả AI | Kế toán, đối soát | Chủ shop | Chủ shop |
| Kiểm hàng thật theo danh sách | Người giữ kho | Chủ shop | Chủ shop |
| Sửa giá TGN-01 theo bảng chuẩn | Người nội dung, danh mục | Kế toán, đối soát | Chủ shop |
| Xem lại ảnh, mô tả HC-3N | Người nội dung, danh mục | Chủ shop | Người duyệt |
| Hỏi nhà cung cấp về đơn đang về, khả năng nhận trả | Chủ shop | Nhà cung cấp | Chủ shop |
| Quyết phương án cho mã chậm | Chủ shop | Mọi người | Chủ shop |
Kiểm trước khi quyết giảm giá
- Mã đó không phải lỗi số liệu, đã đếm lại tại kho?
- Giá đang bán đúng bảng giá chuẩn?
- Hàng có hạn dùng: đã tính hạn giao cuối theo quy định của kênh bán?
- Hàng mùa: đang hết mùa hay sắp vào mùa?
- Nhiều lượt xem mà ít đơn: đã xem ảnh, mô tả, đánh giá trước khi đụng tới giá?
- Đã biết còn đơn đặt nhập nào đang về chưa?
Áp dụng cho shop của bạn
- Giữ: cột dữ liệu, công thức, thứ tự ưu tiên, bước kiểm kho.
- Thay: ngưỡng 60 ngày, 1%, 40% theo nhịp bán của shop; thêm loại mùa của ngành hàng bạn (đồ Tết, đồ đi học).
- Bỏ trước khi dán vào AI: tên nhà cung cấp, giá nhập theo hợp đồng nếu không muốn chia sẻ (có thể đổi giá vốn thành số tương đối), mọi dữ liệu khách.
- Bảng tóm tắt tuần từ ba file bán hàng, chi phí, tồn kho có ở bài ba file bán hàng, chi phí, tồn kho.
Giới hạn của bài này
- Bảng 12 mã và ngưỡng là giả lập, ví dụ biên tập; câu lệnh chưa chạy trên công cụ.
- Số ngày bán hết không phải dự báo; tháng sau có thể khác hẳn.
- Quy định hạn dùng dẫn theo Shopee; TikTok Shop và kênh khác cần kiểm riêng. Bài không tư vấn pháp lý.
Nguồn & lưu ý
- Sapo: Xem báo cáo tồn kho; Sapo: Xem báo cáo bán hàng theo sản phẩm; Sapo: Xuất file danh sách đơn nhập hàng sản phẩm lô, hạn sử dụng; Sapo: Chỉ số kho và tồn kho sản phẩm; Sapo: Tổng quan các tính năng quản lý kho hàng trên Sapo OmniAI.
- Shopee: Quy định về đăng bán sản phẩm trên Shopee (bản cập nhật 14/8/2024, mục hạn sử dụng).
- Shopee Ads: Chiến dịch Tự Động Chọn Sản phẩm.
- Đối chiếu ngày 03/10/2026. Sapo được dùng làm ví dụ phần mềm; không có quan hệ thương mại với Sapo hay Shopee.




