Hy An là doanh nghiệp bán lẻ nhỏ — dưới 10 người — bán hàng trên Facebook, TikTok Shop và Shopee, quản lý qua Pancake POS. Giống hầu hết công ty ở quy mô này, họ không có kế toán riêng hay đội tài chính. Chủ doanh nghiệp tự theo dõi mọi thứ, song song với việc điều hành.
Một thời gian, bảng tính Excel hoạt động ổn. Ba cột song song mỗi tháng — mỗi cột cho một tài khoản — và mọi khoản tiền vào được tính thành doanh thu. Cách làm này hợp lý khi công ty còn nhỏ và cần di chuyển nhanh. Nhưng khi kinh doanh mở rộng sang nhiều kênh hơn, chuyển khoản nội bộ giữa các tài khoản cũng bị tính thành thu nhập. Bảng tính không phân biệt được tiền từ khách hàng và tiền chuyển giữa các tài khoản công ty.
Đến Q1 2026, doanh thu trên báo cáo bị phồng lên đáng kể. Hơn 90% phần đếm trùng đến từ chuyển nội bộ, phần còn lại từ các khoản vốn. Báo cáo lãi lỗ trông có vẻ tốt trên giấy, nhưng con số thật lại kể câu chuyện khác.
Ba tầng, một hệ thống
Tôi xây hệ thống 3 tầng: script chuyển đổi dữ liệu cũ, Google Sheets làm trung tâm vận hành, và n8n cho tự động hoá hàng ngày.
Chuyển đổi dữ liệu — phân loại hàng trăm giao dịch
File Excel cũ có ba cột mỗi tháng, mỗi tài khoản. Không có hệ thống phân loại — điều này dễ hiểu khi một người phải lo hết mọi thứ. Nhưng nó có nghĩa là không cách nào biết tiền vào là bán hàng thật hay chỉ là chuyển khoản nội bộ giữa các tài khoản.
Tôi viết script Python chuyển file XLSX cũ thành định dạng phẳng, có phân loại. Mỗi giao dịch được gắn thẻ:
| Thẻ | Ý nghĩa | Tính vào P&L? |
|---|---|---|
| Khách hàng | Giao dịch thật với bên ngoài | Có |
| Nội bộ | Chuyển giữa các tài khoản công ty | Không |
| Vốn chủ | Chủ rút/nạp vốn | Không |
| Hoàn trả | Hoàn tiền/đổi trả | Có (âm) |
Bộ phân loại dùng regex trên nội dung giao dịch tiếng Việt để phát hiện chuyển nội bộ, vốn chủ sở hữu, và chuyển tiền quảng cáo.
Kết quả: 98% giao dịch được phân loại tự động. Chỉ một vài giao dịch cần xem lại thủ công.
Google Sheets — trung tâm vận hành
Bảng tính được tạo tự động qua Google Sheets API với 5 tab. Toàn bộ báo cáo chạy bằng công thức — không tính toán thủ công.
Tab 1: Sổ giao dịch
Bảng phẳng với mọi giao dịch: ngày, tài khoản, nội dung, thu/chi, phân loại, loại doanh thu, loại chi phí, ghi chú, chứng từ. Dropdown đảm bảo nhập liệu nhất quán. Dòng thiếu phân loại được tô vàng.
Toàn bộ giao dịch lịch sử được nhập sẵn từ bước chuyển đổi.
Tab 2: Số dư đầu kỳ
Số dư đầu mỗi tháng của từng tài khoản, trích từ file XLSX cũ. Tab Báo cáo tham chiếu để tính toán số dư.
Tab 3: Báo cáo lãi lỗ tháng
Đây là trung tâm của hệ thống. Chọn tháng, toàn bộ báo cáo tự tính lại:
- Số dư tài khoản — theo từng ngân hàng, đối chiếu với số dư đầu kỳ
- Doanh thu thật — chia theo bán lẻ và bán buôn, lọc theo phân loại = “Khách hàng”
- Chi phí theo nhóm — giá vốn, vận hành, marketing, logistics
- Lãi/Lỗ — kết quả thực tế
- Giao dịch nội bộ — hiển thị để tham khảo, tự động loại khỏi P&L
- Đối chiếu Pancake — so sánh doanh thu Pancake (từ đơn hàng) với doanh thu ngân hàng (từ nhập thủ công)
Thiết kế quan trọng: Tất cả giá trị đều là công thức SUMPRODUCT lọc theo cột phân loại. Giao dịch nội bộ vẫn có trong dữ liệu nhưng tự động ẩn khỏi báo cáo. Không ai cần nhớ phải loại trừ chúng.
Tab 4: Tổng hợp năm
Ma trận 12 tháng: doanh thu, giá vốn, lãi gộp, các nhóm chi phí, lãi ròng. Thêm dòng doanh thu Pancake để đối chiếu chéo.
Tab 5: Đơn hàng Pancake
Dữ liệu đơn hàng thô từ Pancake POS — mã đơn, ngày, kênh, trạng thái, khách hàng, sản phẩm, số lượng, giá, tiền COD, tỉnh thành. Mỗi dòng là một sản phẩm trong đơn. Được cập nhật hàng ngày bởi n8n.
Workflow n8n — tự động hoá hàng ngày
Workflow 4 node chạy trên n8n tự host:
Lịch kích hoạt chạy lúc 6h sáng giờ Việt Nam. Workflow xoá dữ liệu Pancake cũ để tránh trùng, sau đó lấy toàn bộ đơn hàng từ Pancake API.
Bước lấy dữ liệu phân trang qua API, map trạng thái đơn (mới, xác nhận, đóng gói, đã gửi, hoàn thành, đã huỷ), phát hiện kênh bán từ tiền tố page ID (tts_ = TikTok, shopee_ = Shopee, còn lại là Facebook), và trải phẳng thành một dòng mỗi sản phẩm.
Toàn bộ dữ liệu được ghi vào Google Sheets qua service account.
Độ bền: Tự retry 3 lần, cách nhau 5 phút. Email cảnh báo cho tôi khi lỗi.
Tại sao kiến trúc này
Google Sheets làm trung tâm, không phải database. Đội ngũ khách hàng đã quen dùng Sheets. Không cần học công cụ mới. Công thức xử lý toàn bộ logic báo cáo.
P&L dựa trên phân loại. Thay vì cố sửa layout 3 cột cũ, tôi trải phẳng mọi thứ và thêm cột phân loại. Công thức P&L chỉ lọc “Khách hàng”. Giao dịch nội bộ vẫn có trong dữ liệu nhưng tự động ẩn khỏi báo cáo.
Đồng bộ toàn bộ, không phải tăng dần. Workflow n8n xoá và nhập lại toàn bộ đơn Pancake mỗi ngày. Đơn giản hơn việc theo dõi thay đổi, và lượng dữ liệu (vài trăm đơn) đủ nhỏ để chạy nhanh.
Đối chiếu Pancake tích hợp sẵn. Tab P&L so sánh doanh thu Pancake (từ đơn hàng) với doanh thu ngân hàng (từ nhập thủ công). Chênh lệch = tiền đang trên đường — tiền từ đơn hoàn thành chưa nhập tài khoản.
Hệ thống chạy trên gì
| Thành phần | Công cụ | Chi phí |
|---|---|---|
| Chuyển dữ liệu | Python + openpyxl | Một lần |
| Tạo bảng tính | Python + Google Sheets API | Miễn phí |
| Vận hành | Google Sheets | Miễn phí |
| Đồng bộ ngày | n8n (tự host) | ~$5/tháng VPS |
| Dữ liệu đơn hàng | Pancake POS API | Có sẵn trong gói |
| Xác thực | Google Service Account | Miễn phí |
Tác động
- Doanh thu ảo loại bỏ — chuyển nội bộ và vốn chủ sở hữu không còn làm phồng báo cáo lãi lỗ
- Dữ liệu đơn hàng Pancake tự đồng bộ hàng ngày — không cần copy thủ công
- Đối chiếu doanh thu (Pancake vs ngân hàng) cho thấy dòng tiền thực tế
- Báo cáo lãi lỗ tháng cập nhật chỉ bằng một ô thay đổi
- Phân tích kênh bán (TikTok / Shopee / Facebook) có sẵn tự động
Chủ doanh nghiệp vẫn tự quản lý tài chính — chỉ là không còn phải vật lộn với bảng tính nữa. Hệ thống lo phần nặng, còn chị ấy tập trung vào phát triển kinh doanh.