Template Quản Lý Công Nợ & Phải Thu Trên Google Sheets [Miễn Phí 2026]
![Template Quản Lý Công Nợ & Phải Thu Trên Google Sheets [Miễn Phí 2026]](/images/blog/template-quan-ly-cong-no-google-sheets.png)
Tại Sao Quản Lý Công Nợ Là Yếu Tố Sống Còn Của Doanh Nghiệp?
Trong kinh doanh, "Cash is King" - Dòng tiền là vua. Bạn có thể có doanh thu hàng tỷ đồng mỗi tháng, nhưng nếu phần lớn nằm trong khoản phải thu và khách hàng chậm thanh toán, doanh nghiệp vẫn có thể phá sản. Đây không phải lời nói suông - đó là thực tế đau lòng mà hàng nghìn doanh nghiệp Việt Nam đang đối mặt.
Thống kê đáng báo động về công nợ tại Việt Nam
- 30% doanh nghiệp SME phá sản không phải vì lỗ, mà vì mất kiểm soát dòng tiền và công nợ
- 45% doanh nghiệp thương mại cho biết khách hàng thường xuyên thanh toán trễ từ 30-90 ngày
- Trung bình 15-20% khoản phải thu trở thành nợ khó đòi sau 90 ngày
- Chi phí thu hồi nợ quá hạn có thể lên tới 25-50% giá trị khoản nợ
- 68% doanh nghiệp nhỏ vẫn quản lý công nợ bằng sổ tay hoặc file Excel rời rạc
Nếu bạn đang quản lý công nợ bằng sổ tay, ghi chú trên điện thoại, hoặc các file Excel rời rạc thì bạn đang đặt doanh nghiệp vào rủi ro rất lớn. Chỉ cần quên theo dõi một khoản nợ lớn, hoặc không phát hiện kịp thời khách hàng vượt hạn mức tín dụng, hậu quả có thể là mất trắng hàng trăm triệu đồng.
Dấu hiệu bạn cần hệ thống quản lý công nợ ngay
Vấn đề về theo dõi
- - Không biết chính xác tổng công nợ hiện tại
- - Không biết khách nào đang nợ bao nhiêu
- - Phải mất hàng giờ để tổng hợp báo cáo công nợ
- - Thường xuyên bỏ sót khoản nợ quá hạn
Vấn đề về quy trình
- - Không có quy trình nhắc nợ rõ ràng
- - Nhân viên bán hàng tự ý cho nợ vượt hạn mức
- - Khách hàng tranh cãi về số tiền nợ
- - Không có cảnh báo khi nợ quá hạn lâu
Trong bài viết này, mình sẽ chia sẻ template quản lý công nợ & phải thu hoàn chỉnh trên Google Sheets, bao gồm 4 sheet chuyên biệt, công thức tự động tính toán, conditional formatting trực quan, và cả Apps Script gửi email nhắc nợ tự động. Tất cả hoàn toàn miễn phí.
Tổng Quan Template Quản Lý Công Nợ
Template được thiết kế gồm 4 sheet liên kết chặt chẽ với nhau, phù hợp cho doanh nghiệp thương mại, phân phối, dịch vụ có từ 20-200 khách hàng mua nợ thường xuyên.
Cấu trúc 4 Sheet
| Sheet | Chức năng | Cập nhật |
|---|---|---|
| 1. Khách hàng | Danh sách KH, hạn mức tín dụng, công nợ hiện tại | Thêm KH mới khi cần |
| 2. Sổ công nợ | Ghi nhận phát sinh nợ & thu tiền hàng ngày | Cập nhật hàng ngày |
| 3. Aging Report | Phân tích tuổi nợ: 0-30, 31-60, 61-90, >90 ngày | Tự động cập nhật |
| 4. Dashboard | Tổng quan: tổng phải thu, nợ quá hạn, tỷ lệ thu hồi | Tự động cập nhật |
Sheet 1: Danh Sách Khách Hàng
Đây là sheet "master data" - nơi lưu trữ thông tin tất cả khách hàng có quan hệ mua nợ với doanh nghiệp. Mỗi khách hàng được gán một mã KH duy nhất để liên kết với các sheet khác.
Cấu trúc các cột
| Cột | Tên trường | Kiểu dữ liệu | Mô tả | Ví dụ |
|---|---|---|---|---|
| A | Mã KH | Text | Mã khách hàng duy nhất | KH001 |
| B | Tên công ty | Text | Tên đầy đủ công ty/cá nhân | Cty TNHH ABC |
| C | Người liên hệ | Text | Tên người phụ trách | Nguyễn Văn A |
| D | Số điện thoại | Text | SĐT liên hệ chính | 0901234567 |
| E | Text | Email kế toán/thanh toán | ketoan@abc.vn | |
| F | Hạn mức tín dụng | Number | Số tiền nợ tối đa cho phép | 100,000,000 |
| G | Công nợ hiện tại | Formula | Tự động tính từ Sổ công nợ | 75,500,000 |
| H | % Sử dụng HM | Formula | Công nợ / Hạn mức x 100% | 75.5% |
| I | Trạng thái | Formula | Bình thường / Cảnh báo / Vượt HM | Cảnh báo |
Công thức quan trọng trong Sheet Khách hàng
// Cột G - Tính công nợ hiện tại từ Sổ công nợ
=SUMIFS('Sổ công nợ'!F:F, 'Sổ công nợ'!B:B, A2, 'Sổ công nợ'!D:D, "Phát sinh")
- SUMIFS('Sổ công nợ'!F:F, 'Sổ công nợ'!B:B, A2, 'Sổ công nợ'!D:D, "Thu")
// Cột H - Tỷ lệ sử dụng hạn mức
=IF(F2>0, G2/F2, 0)
// Cột I - Trạng thái tín dụng (tự động phân loại)
=IF(H2>=1, "🔴 Vượt HM",
IF(H2>=0.8, "🟠 Cảnh báo",
IF(H2>=0.5, "🟡 Chú ý", "🟢 Bình thường")))
Mẹo: Tại sao cần hạn mức tín dụng?
Hạn mức tín dụng giúp bạn kiểm soát rủi ro. Ví dụ: Khách hàng mới chỉ cho nợ tối đa 20 triệu, khách lâu năm uy tín có thể lên 200 triệu. Khi nhân viên bán hàng tạo đơn mới, họ phải kiểm tra xem khách còn trong hạn mức hay không trước khi cho nợ thêm.
Sheet 2: Sổ Theo Dõi Công Nợ
Đây là sheet quan trọng nhất - nơi ghi nhận mọi giao dịch phát sinh nợ và thu tiền hàng ngày. Mỗi hàng là một bút toán, giống như sổ cái kế toán nhưng đơn giản hơn.
Cấu trúc các cột
| Cột | Tên trường | Kiểu | Mô tả |
|---|---|---|---|
| A | Ngày | Date | Ngày phát sinh giao dịch (DD/MM/YYYY) |
| B | Mã KH | Text | Mã khách hàng (liên kết Sheet 1) |
| C | Số hóa đơn | Text | Số hóa đơn / phiếu thu |
| D | Loại | Dropdown | "Phát sinh" (tăng nợ) hoặc "Thu" (giảm nợ) |
| E | Diễn giải | Text | Nội dung: Bán hàng hóa / Thu tiền CK / Thu tiền mặt |
| F | Số tiền | Number | Giá trị giao dịch (luôn dương) |
| G | Hạn thanh toán | Date | Ngày đến hạn thanh toán (chỉ cho loại "Phát sinh") |
| H | Số ngày quá hạn | Formula | Tự động tính: TODAY() - Hạn thanh toán |
| I | Trạng thái | Formula/Dropdown | Chưa thu / Đã thu / Quá hạn |
| J | Ghi chú | Text | Ghi chú thêm (đã gọi nhắc, hẹn ngày trả...) |
Ví dụ dữ liệu thực tế
| Ngày | Mã KH | Hóa đơn | Loại | Diễn giải | Số tiền | Hạn TT |
|---|---|---|---|---|---|---|
| 01/01/2026 | KH001 | HD-0001 | Phát sinh | Bán 100 thùng sơn | 45,000,000 | 31/01/2026 |
| 05/01/2026 | KH003 | HD-0002 | Phát sinh | Bán vật liệu xây dựng | 120,000,000 | 04/02/2026 |
| 15/01/2026 | KH001 | PT-0001 | Thu | Thu tiền CK - HD0001 | 30,000,000 | - |
| 20/01/2026 | KH002 | HD-0003 | Phát sinh | Bán 50 tấn thép | 250,000,000 | 19/02/2026 |
// Cột H - Số ngày quá hạn (chỉ tính cho khoản Phát sinh chưa thu đủ)
=IF(AND(D2="Phát sinh", I2="Chưa thu"),
MAX(0, TODAY() - G2), "")
// Cột I - Trạng thái tự động
=IF(D2="Thu", "Đã thu",
IF(TODAY() > G2, "Quá hạn", "Chưa thu"))
Sheet 3: Aging Report - Phân Tích Tuổi Nợ
Aging Report (Báo cáo phân tích tuổi nợ) là công cụ quan trọng nhất trong quản lý công nợ. Nó cho biết khoản nợ nào đã quá hạn bao lâu, giúp bạn biết cần ưu tiên thu hồi khoản nào trước.
Ý nghĩa phân loại tuổi nợ
🟢 0 - 30 ngày
Nợ trong hạn. Bình thường, chưa cần hành động đặc biệt. Theo dõi định kỳ.
🟡 31 - 60 ngày
Nợ bắt đầu quá hạn. Cần gọi điện nhắc nhở, gửi email thông báo. Xác suất thu hồi ~85%.
🟠 61 - 90 ngày
Nợ quá hạn nghiêm trọng. Cần gặp trực tiếp, yêu cầu cam kết trả nợ bằng văn bản. Xác suất thu ~65%.
🔴 Trên 90 ngày
Nợ khó đòi. Xem xét chuyển cho bộ phận pháp lý, ngừng cấp nợ. Xác suất thu ~30-40%.
Cấu trúc Aging Report
| Mã KH | Tên công ty | Tổng nợ | 0-30 ngày | 31-60 ngày | 61-90 ngày | >90 ngày |
|---|---|---|---|---|---|---|
| KH001 | Cty TNHH ABC | 75,500,000 | 45,000,000 | 20,500,000 | 10,000,000 | 0 |
| KH002 | Cty CP XYZ | 250,000,000 | 250,000,000 | 0 | 0 | 0 |
| KH003 | DNTN Minh Đức | 185,000,000 | 60,000,000 | 45,000,000 | 30,000,000 | 50,000,000 |
| TỔNG CỘNG | 510,500,000 | 355,000,000 | 65,500,000 | 40,000,000 | 50,000,000 | |
Công thức SUMPRODUCT cho Aging Analysis
Đây là phần phức tạp nhất nhưng cũng mạnh mẽ nhất của template. Chúng ta sử dụng SUMPRODUCT kết hợp TODAY() để tự động phân loại nợ theo tuổi.
// Cột D (0-30 ngày) - Nợ trong hạn hoặc quá hạn dưới 30 ngày
=SUMPRODUCT(
('Sổ công nợ'!B$2:B$1000 = A2) *
('Sổ công nợ'!D$2:D$1000 = "Phát sinh") *
('Sổ công nợ'!I$2:I$1000 = "Chưa thu") *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) <= 30) *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) >= 0) *
('Sổ công nợ'!F$2:F$1000)
)
// Cột E (31-60 ngày) - Nợ quá hạn 31 đến 60 ngày
=SUMPRODUCT(
('Sổ công nợ'!B$2:B$1000 = A2) *
('Sổ công nợ'!D$2:D$1000 = "Phát sinh") *
('Sổ công nợ'!I$2:I$1000 = "Chưa thu") *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) >= 31) *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) <= 60) *
('Sổ công nợ'!F$2:F$1000)
)
// Cột F (61-90 ngày) - Nợ quá hạn 61 đến 90 ngày
=SUMPRODUCT(
('Sổ công nợ'!B$2:B$1000 = A2) *
('Sổ công nợ'!D$2:D$1000 = "Phát sinh") *
('Sổ công nợ'!I$2:I$1000 = "Chưa thu") *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) >= 61) *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) <= 90) *
('Sổ công nợ'!F$2:F$1000)
)
// Cột G (>90 ngày) - Nợ khó đòi, quá hạn trên 90 ngày
=SUMPRODUCT(
('Sổ công nợ'!B$2:B$1000 = A2) *
('Sổ công nợ'!D$2:D$1000 = "Phát sinh") *
('Sổ công nợ'!I$2:I$1000 = "Chưa thu") *
((TODAY() - 'Sổ công nợ'!G$2:G$1000) > 90) *
('Sổ công nợ'!F$2:F$1000)
)
Lưu ý quan trọng về SUMPRODUCT
Công thức SUMPRODUCT rất mạnh nhưng sẽ chạy chậm nếu dải dữ liệu quá lớn. Với template này, giới hạn 1000 hàng là đủ cho hầu hết SME. Nếu bạn có hàng nghìn giao dịch mỗi tháng, nên cân nhắc dùng QUERY hoặc Apps Script thay thế.
Sheet 4: Dashboard Tổng Quan
Dashboard cung cấp cái nhìn toàn cảnh về tình hình công nợ chỉ trong vài giây. Tất cả con số đều tự động cập nhật khi bạn nhập liệu vào Sổ công nợ.
Các chỉ số chính (KPIs)
Tổng phải thu
510,500,000
Cập nhật real-time
Nợ quá hạn
155,500,000
30.5% tổng nợ
Tỷ lệ thu hồi
72.8%
Tháng hiện tại
Nợ khó đòi (>90d)
50,000,000
9.8% tổng nợ
Công thức cho Dashboard
// Tổng phải thu - Tổng phát sinh trừ tổng đã thu
=SUMIFS('Sổ công nợ'!F:F, 'Sổ công nợ'!D:D, "Phát sinh")
- SUMIFS('Sổ công nợ'!F:F, 'Sổ công nợ'!D:D, "Thu")
// Tổng nợ quá hạn - Tổng các khoản phát sinh đã quá hạn thanh toán
=SUMPRODUCT(
('Sổ công nợ'!D$2:D$1000 = "Phát sinh") *
('Sổ công nợ'!I$2:I$1000 = "Chưa thu") *
(TODAY() > 'Sổ công nợ'!G$2:G$1000) *
('Sổ công nợ'!F$2:F$1000)
)
// Tỷ lệ thu hồi tháng hiện tại
=SUMPRODUCT(
('Sổ công nợ'!D$2:D$1000 = "Thu") *
(MONTH('Sổ công nợ'!A$2:A$1000) = MONTH(TODAY())) *
(YEAR('Sổ công nợ'!A$2:A$1000) = YEAR(TODAY())) *
('Sổ công nợ'!F$2:F$1000)
)
/
SUMPRODUCT(
('Sổ công nợ'!D$2:D$1000 = "Phát sinh") *
(MONTH('Sổ công nợ'!A$2:A$1000) = MONTH(TODAY())) *
(YEAR('Sổ công nợ'!A$2:A$1000) = YEAR(TODAY())) *
('Sổ công nợ'!F$2:F$1000)
)
// Top 10 khách hàng nợ nhiều nhất (dùng SORT + UNIQUE)
=SORT(
UNIQUE('Khách hàng'!A2:B51),
BYROW(UNIQUE('Khách hàng'!A2:A51),
LAMBDA(id, SUMIFS('Sổ công nợ'!F:F, 'Sổ công nợ'!B:B, id, 'Sổ công nợ'!D:D, "Phát sinh")
- SUMIFS('Sổ công nợ'!F:F, 'Sổ công nợ'!B:B, id, 'Sổ công nợ'!D:D, "Thu"))),
-1
)
Top 10 Khách Hàng Nợ Nhiều Nhất
Bảng Top 10 giúp bạn nhanh chóng xác định những khách hàng cần ưu tiên thu hồi công nợ. Dùng kết hợp SORT + INDEX + MATCH hoặc LAMBDA function:
| # | Mã KH | Tên công ty | Dư nợ | Nợ quá hạn | Đánh giá |
|---|---|---|---|---|---|
| 1 | KH002 | Cty CP XYZ | 250,000,000 | 0 | Trong hạn |
| 2 | KH003 | DNTN Minh Đức | 185,000,000 | 125,000,000 | Rủi ro cao |
| 3 | KH001 | Cty TNHH ABC | 75,500,000 | 30,500,000 | Cần nhắc nhở |
Conditional Formatting: Trực Quan Hóa Tuổi Nợ Bằng Màu Sắc
Conditional formatting biến bảng tính khô khan thành bảng nhiệt (heatmap) trực quan, giúp bạn nhìn một cái là biết ngay khoản nào đang nguy hiểm. Đây là cách thiết lập:
Quy tắc màu sắc theo tuổi nợ
| Tuổi nợ | Màu nền | Mã màu | Custom formula |
|---|---|---|---|
| 0 - 30 ngày | Xanh lá nhạt | #C6EFCE | =AND($H2>=0, $H2<=30) |
| 31 - 60 ngày | Vàng nhạt | #FFEB9C | =AND($H2>=31, $H2<=60) |
| 61 - 90 ngày | Cam nhạt | #FFC7CE | =AND($H2>=61, $H2<=90) |
| Trên 90 ngày | Đỏ đậm | #FF6B6B | =$H2>90 |
Hướng dẫn tạo Conditional Formatting
Các bước thực hiện:
- Bước 1: Chọn toàn bộ dải dữ liệu trong Sổ công nợ (ví dụ:
A2:J1000) - Bước 2: Vào menu Format > Conditional formatting
- Bước 3: Chọn "Custom formula is"
- Bước 4: Nhập công thức (ví dụ:
=$H2>90) và chọn màu đỏ - Bước 5: Nhấn "Add another rule" để thêm quy tắc tiếp theo
- Bước 6: Lặp lại cho các mức 61-90, 31-60, 0-30 ngày
- Bước 7: Quan trọng: Sắp xếp thứ tự rules từ >90 (trên cùng) đến 0-30 (dưới cùng)
Mẹo: Conditional Formatting cho cột Trạng thái tín dụng
Áp dụng tương tự cho Sheet Khách hàng, cột I (Trạng thái). Dùng =$I2="Vượt HM" tô đỏ, =$I2="Cảnh báo" tô cam, =$I2="Chú ý" tô vàng. Giúp nhân viên bán hàng dễ dàng nhận biết khách nào đã gần hoặc vượt hạn mức trước khi cho nợ thêm.
Apps Script: Tự Động Hóa Nhắc Nợ & Báo Cáo
Quản lý công nợ không chỉ là ghi nhận mà còn phải chủ động nhắc nhở khách hàng thanh toán. Với Google Apps Script, bạn có thể tự động gửi email nhắc nợ và tạo báo cáo aging hàng tuần.
Script 1: Gửi Email Nhắc Nợ Tự Động
// Mở Apps Script: Extensions > Apps Script
function sendDebtReminders() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const debtSheet = ss.getSheetByName("Sổ công nợ");
const customerSheet = ss.getSheetByName("Khách hàng");
const data = debtSheet.getDataRange().getValues();
const customers = customerSheet.getDataRange().getValues();
const today = new Date();
let sentCount = 0;
// Duyệt từng dòng trong Sổ công nợ
for (let i = 1; i < data.length; i++) {
const type = data[i][3]; // Cột D: Loại
const dueDate = data[i][6]; // Cột G: Hạn thanh toán
const status = data[i][8]; // Cột I: Trạng thái
const customerId = data[i][1]; // Cột B: Mã KH
const amount = data[i][5]; // Cột F: Số tiền
const invoice = data[i][2]; // Cột C: Số hóa đơn
// Chỉ nhắc nợ khoản phát sinh, chưa thu, quá hạn
if (type !== "Phát sinh" || status !== "Chưa thu") continue;
if (!(dueDate instanceof Date)) continue;
const daysOverdue = Math.floor(
(today - dueDate) / (1000 * 60 * 60 * 24)
);
// Gửi nhắc nhở ở các mốc: 0 ngày (đến hạn), 7, 15, 30, 60 ngày
const reminderDays = [0, 7, 15, 30, 60];
if (!reminderDays.includes(daysOverdue)) continue;
// Tìm email khách hàng
const customer = customers.find(c => c[0] === customerId);
if (!customer || !customer[4]) continue; // Không có email
const email = customer[4];
const companyName = customer[1];
const contactName = customer[2];
// Nội dung email theo mức độ
let subject, urgency;
if (daysOverdue === 0) {
subject = `[Nhắc nhở] Hóa đơn ${invoice} đến hạn thanh toán hôm nay`;
urgency = "đến hạn thanh toán hôm nay";
} else if (daysOverdue <= 15) {
subject = `[Nhắc nhở] Hóa đơn ${invoice} đã quá hạn ${daysOverdue} ngày`;
urgency = `đã quá hạn thanh toán ${daysOverdue} ngày`;
} else if (daysOverdue <= 30) {
subject = `[QUAN TRỌNG] Hóa đơn ${invoice} quá hạn ${daysOverdue} ngày`;
urgency = `đã quá hạn ${daysOverdue} ngày, vui lòng thanh toán ngay`;
} else {
subject = `[KHẨN CẤP] Hóa đơn ${invoice} quá hạn ${daysOverdue} ngày`;
urgency = `đã quá hạn ${daysOverdue} ngày. Khoản nợ sẽ được chuyển sang xử lý pháp lý nếu không thanh toán trong 7 ngày`;
}
const body = `Kính gửi Anh/Chị ${contactName} - ${companyName},
Chúng tôi xin thông báo hóa đơn ${invoice} với số tiền ${formatCurrency(amount)} ${urgency}.
Chi tiết:
- Số hóa đơn: ${invoice}
- Số tiền: ${formatCurrency(amount)}
- Hạn thanh toán: ${formatDate(dueDate)}
- Số ngày quá hạn: ${daysOverdue} ngày
Vui lòng thanh toán qua tài khoản:
- Ngân hàng: [Tên ngân hàng]
- STK: [Số tài khoản]
- Chủ TK: [Tên công ty]
- Nội dung CK: Thanh toán ${invoice}
Trân trọng,
[Tên công ty của bạn]
Bộ phận Kế toán - ĐT: [Số điện thoại]`;
MailApp.sendEmail(email, subject, body);
sentCount++;
// Log vào sheet
debtSheet.getRange(i + 1, 10).setValue(
`Đã gửi nhắc nợ ${formatDate(today)}`
);
}
// Thông báo kết quả
SpreadsheetApp.getUi().alert(
`Đã gửi ${sentCount} email nhắc nợ thành công!`
);
}
function formatCurrency(amount) {
return new Intl.NumberFormat('vi-VN').format(amount) + ' đ';
}
function formatDate(date) {
return Utilities.formatDate(date, "Asia/Ho_Chi_Minh", "dd/MM/yyyy");
}
Script 2: Báo Cáo Aging Hàng Tuần Qua Email
// Gửi email tổng hợp aging report cho quản lý mỗi thứ 2
function sendWeeklyAgingReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const agingSheet = ss.getSheetByName("Aging Report");
const data = agingSheet.getDataRange().getValues();
// Lấy dữ liệu tổng hợp
let totalDebt = 0, total030 = 0, total3160 = 0;
let total6190 = 0, total90plus = 0;
let overdueCustomers = [];
for (let i = 1; i < data.length; i++) {
if (!data[i][0]) continue; // Bỏ qua hàng trống
const customerId = data[i][0];
const companyName = data[i][1];
const rowTotal = data[i][2] || 0;
const d030 = data[i][3] || 0;
const d3160 = data[i][4] || 0;
const d6190 = data[i][5] || 0;
const d90plus = data[i][6] || 0;
totalDebt += rowTotal;
total030 += d030;
total3160 += d3160;
total6190 += d6190;
total90plus += d90plus;
// Ghi nhận KH có nợ quá hạn >30 ngày
if (d3160 + d6190 + d90plus > 0) {
overdueCustomers.push({
id: customerId,
name: companyName,
total: rowTotal,
overdue: d3160 + d6190 + d90plus
});
}
}
// Sắp xếp theo nợ quá hạn giảm dần
overdueCustomers.sort((a, b) => b.overdue - a.overdue);
// Tạo nội dung HTML email
let html = `
BÁO CÁO TUỔI NỢ TUẦN - ${formatDate(new Date())}
Chỉ số Giá trị Tỷ lệ
Tổng phải thu
${formatCurrency(totalDebt)}
100%
Trong hạn (0-30 ngày)
${formatCurrency(total030)}
${(total030/totalDebt*100).toFixed(1)}%
Quá hạn 31-60 ngày
${formatCurrency(total3160)}
${(total3160/totalDebt*100).toFixed(1)}%
Quá hạn 61-90 ngày
${formatCurrency(total6190)}
${(total6190/totalDebt*100).toFixed(1)}%
Nợ khó đòi (>90 ngày)
${formatCurrency(total90plus)}
${(total90plus/totalDebt*100).toFixed(1)}%
`;
// Thêm danh sách KH nợ quá hạn
if (overdueCustomers.length > 0) {
html += 'Khách hàng cần theo dõi:
';
overdueCustomers.slice(0, 10).forEach(c => {
html += `- ${c.name} (${c.id}) -
Nợ quá hạn: ${formatCurrency(c.overdue)}
/ Tổng: ${formatCurrency(c.total)}
`;
});
html += '
';
}
// Gửi cho quản lý
const managerEmail = "quanly@congty.vn"; // Thay email thực
MailApp.sendEmail({
to: managerEmail,
subject: `[Báo cáo] Aging Report tuần ${formatDate(new Date())}`,
htmlBody: html
});
}
// Thiết lập trigger tự động mỗi thứ 2
function setupWeeklyTrigger() {
ScriptApp.newTrigger('sendWeeklyAgingReport')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.MONDAY)
.atHour(8)
.create();
}
// Thiết lập trigger nhắc nợ hàng ngày lúc 9h sáng
function setupDailyReminderTrigger() {
ScriptApp.newTrigger('sendDebtReminders')
.timeBased()
.everyDays(1)
.atHour(9)
.create();
}
Cách thiết lập Trigger:
- 1. Mở Extensions > Apps Script
- 2. Paste code vào editor, nhấn Save
- 3. Chạy hàm
setupWeeklyTrigger()một lần để đặt lịch báo cáo tuần - 4. Chạy hàm
setupDailyReminderTrigger()một lần để đặt lịch nhắc nợ hàng ngày - 5. Cấp quyền gửi email khi được hỏi
- 6. Kiểm tra tab Triggers để xác nhận đã tạo thành công
Ví Dụ Thực Tế: Công Ty Thương Mại Phát Đạt
Hãy xem công ty Thương Mại Phát Đạt - một doanh nghiệp phân phối vật liệu xây dựng với 50 khách hàng mua nợ thường xuyên - đã áp dụng template này như thế nào.
Bối cảnh trước khi dùng template
Tình trạng cũ:
- - Quản lý công nợ bằng sổ tay + Excel rời
- - Tổng công nợ ~500 triệu nhưng không biết chính xác
- - Phát hiện 3 KH nợ quá 6 tháng khi kiểm kê cuối năm
- - Mất trắng 80 triệu nợ khó đòi năm 2025
- - 2 nhân viên bán hàng cho nợ vượt hạn mức
- - Không có quy trình nhắc nợ rõ ràng
Sau 3 tháng dùng template:
- - Biết chính xác công nợ từng KH real-time
- - Giảm nợ quá hạn >90 ngày từ 15% xuống 3%
- - Tỷ lệ thu hồi tăng từ 65% lên 88%
- - Tiết kiệm 2 giờ/ngày không phải đối chiếu sổ sách
- - Email nhắc nợ tự động giảm 90% cuộc gọi nhắc thủ công
- - Phát hiện sớm KH vượt hạn mức, ngăn rủi ro kịp thời
Quy trình áp dụng template tại Phát Đạt
Timeline triển khai:
| Tuần 1 | Nhập danh sách 50 KH vào Sheet 1, thiết lập hạn mức tín dụng theo lịch sử giao dịch |
| Tuần 2 | Nhập dữ liệu công nợ tồn đọng vào Sổ công nợ. Tổng hợp từ sổ sách cũ, đối chiếu với KH |
| Tuần 3 | Thiết lập Aging Report + Dashboard. Cài đặt conditional formatting. Test thử các công thức |
| Tuần 4 | Cài Apps Script nhắc nợ + báo cáo tuần. Training cho 2 nhân viên kế toán cách sử dụng |
Kết quả chi tiết sau 3 tháng
| Chỉ số | Trước | Sau 3 tháng | Cải thiện |
|---|---|---|---|
| Tổng công nợ | ~500 triệu | 480 triệu | -4% |
| Tỷ lệ thu hồi/tháng | 65% | 88% | +23% |
| Nợ quá hạn >90 ngày | 75 triệu (15%) | 14.4 triệu (3%) | -80% |
| Thời gian đối chiếu CN/ngày | 3 giờ | 30 phút | -83% |
| Nợ xấu phát sinh | 80 triệu/năm | Dự kiến 0 | -100% |
"Trước đây cuối tháng tôi phải ngồi 2 ngày để đối chiếu công nợ với 50 khách hàng. Giờ chỉ cần mở Google Sheets là thấy hết - ai nợ bao nhiêu, nợ bao lâu, ai cần nhắc. Đặc biệt chức năng email tự động nhắc nợ giúp tiết kiệm rất nhiều thời gian."
- Chị Nguyễn Thị Hương, Kế toán trưởng Cty Phát Đạt
Mẹo Nâng Cao: Tối Ưu Template Cho Doanh Nghiệp Lớn
1. Data Validation cho nhập liệu chính xác
// Tạo dropdown Mã KH liên kết từ Sheet Khách hàng
// Chọn cột B trong Sổ công nợ > Data > Data validation
// Criteria: List from a range
// Range: 'Khách hàng'!A2:A1000
// Hiển thị: Show dropdown list in cell
// On invalid: Reject input
// Dropdown cho cột Loại (chỉ cho phép Phát sinh hoặc Thu)
// Chọn cột D > Data > Data validation
// Criteria: List of items
// Items: Phát sinh, Thu
// On invalid: Reject input
2. VLOOKUP tự động điền tên KH
// Thêm cột phụ tự điền Tên KH khi chọn Mã KH
=IFERROR(
VLOOKUP(B2, 'Khách hàng'!A:B, 2, FALSE),
""
)
3. Cảnh báo vượt hạn mức khi nhập đơn mới
// Apps Script: Kiểm tra hạn mức trước khi cho nợ thêm
function onEdit(e) {
const sheet = e.source.getActiveSheet();
if (sheet.getName() !== "Sổ công nợ") return;
const row = e.range.getRow();
const col = e.range.getColumn();
// Khi nhập số tiền (cột F) cho giao dịch Phát sinh
if (col === 6 && row > 1) {
const type = sheet.getRange(row, 4).getValue();
if (type !== "Phát sinh") return;
const customerId = sheet.getRange(row, 2).getValue();
const amount = e.value;
// Lấy hạn mức và nợ hiện tại từ Sheet Khách hàng
const customerSheet = e.source.getSheetByName("Khách hàng");
const customers = customerSheet.getDataRange().getValues();
const customer = customers.find(c => c[0] === customerId);
if (customer) {
const creditLimit = customer[5]; // Cột F: Hạn mức
const currentDebt = customer[6]; // Cột G: Nợ hiện tại
const newTotal = currentDebt + Number(amount);
if (newTotal > creditLimit) {
SpreadsheetApp.getUi().alert(
`CẢNH BÁO VƯỢT HẠN MỨC!\n\n` +
`Khách hàng: ${customer[1]}\n` +
`Hạn mức: ${formatCurrency(creditLimit)}\n` +
`Nợ hiện tại: ${formatCurrency(currentDebt)}\n` +
`Giao dịch mới: ${formatCurrency(Number(amount))}\n` +
`Tổng sau GD: ${formatCurrency(newTotal)}\n` +
`Vượt hạn mức: ${formatCurrency(newTotal - creditLimit)}`
);
}
}
}
}
4. Biểu đồ Aging trực quan
Trong Sheet Dashboard, tạo thêm biểu đồ để trực quan hóa tình hình công nợ:
- Biểu đồ tròn (Pie chart): Phân bổ nợ theo tuổi (0-30d, 31-60d, 61-90d, >90d) - nhìn nhanh tỷ lệ nợ quá hạn
- Biểu đồ cột (Bar chart): Top 10 KH nợ nhiều nhất - so sánh trực quan giữa các KH
- Biểu đồ đường (Line chart): Xu hướng tổng công nợ theo tháng - theo dõi trend tăng/giảm
- Biểu đồ stacked bar: Cơ cấu nợ theo tuổi của từng KH - chi tiết nhất
Câu Hỏi Thường Gặp (FAQ)
Template này phù hợp cho doanh nghiệp quy mô nào?
Template thiết kế cho doanh nghiệp nhỏ và vừa có từ 20 đến 200 khách hàng mua nợ thường xuyên, tổng công nợ từ 100 triệu đến 5 tỷ đồng. Các ngành phù hợp nhất: thương mại, phân phối, vật liệu xây dựng, sản xuất bán buôn, dịch vụ B2B. Với doanh nghiệp lớn hơn (trên 500 KH), nên cân nhắc phần mềm kế toán chuyên dụng hoặc kết hợp template với Google Apps Script nâng cao.
Có thể quản lý cả công nợ phải trả (nợ nhà cung cấp) không?
Hoàn toàn có thể! Bạn chỉ cần duplicate toàn bộ 4 sheet và đổi tên thành "NCC - Khách hàng", "NCC - Sổ công nợ", "NCC - Aging Report", "NCC - Dashboard". Logic công thức giữ nguyên, chỉ thay "Phát sinh" thành khoản bạn phải trả, "Thu" thành khoản bạn đã thanh toán. Như vậy bạn có cả 2 chiều: phải thu (AR) và phải trả (AP) trong cùng một file.
Công thức SUMPRODUCT chạy chậm khi có nhiều dữ liệu, phải làm sao?
Có 3 cách tối ưu hiệu năng: (1) Giới hạn dải dữ liệu thay vì dùng toàn cột (VD: F2:F500 thay vì F:F). (2) Dùng hàm QUERY thay thế SUMPRODUCT - QUERY xử lý nhanh hơn đáng kể với tập dữ liệu lớn. (3) Tách dữ liệu theo năm/quý vào các tab riêng, chỉ giữ dữ liệu năm hiện tại trong sheet chính. Với dưới 2000 giao dịch, SUMPRODUCT vẫn chạy mượt.
Làm thế nào để nhiều người cùng nhập liệu mà không bị xung đột?
Google Sheets hỗ trợ cộng tác thời gian thực - nhiều người có thể nhập liệu cùng lúc. Tuy nhiên, để tránh nhầm lẫn, nên áp dụng: (1) Phân quyền qua Google Sheets sharing - kế toán có quyền Edit, nhân viên bán hàng chỉ View hoặc Comment. (2) Dùng Protected ranges để khóa Sheet Khách hàng, Aging Report, Dashboard - chỉ cho phép nhập vào Sổ công nợ. (3) Tạo Google Form liên kết với Sổ công nợ để nhân viên bán hàng nhập phát sinh qua form thay vì trực tiếp vào sheet.
Tổng Kết: 5 Bước Bắt Đầu Ngay Hôm Nay
- Bước 1: Copy template về Google Drive của bạn (File > Make a copy)
- Bước 2: Nhập danh sách khách hàng vào Sheet 1, thiết lập hạn mức tín dụng phù hợp cho từng KH
- Bước 3: Nhập dữ liệu công nợ tồn đọng hiện tại vào Sổ công nợ - đối chiếu kỹ với sổ sách
- Bước 4: Kiểm tra Aging Report và Dashboard - đảm bảo các công thức tính đúng
- Bước 5: Cài đặt Apps Script nhắc nợ tự động và báo cáo tuần - bắt đầu với trigger 1 lần/tuần, sau tăng dần
Quản lý công nợ không phải công việc phức tạp - nó chỉ đòi hỏi hệ thống rõ ràng và kỷ luật thực hiện. Với template này, bạn đã có công cụ, chỉ cần bắt đầu nhập liệu và duy trì đều đặn. Sau 1 tháng, bạn sẽ thấy sự khác biệt rõ rệt trong dòng tiền doanh nghiệp.
Muốn tự động hóa toàn bộ quy trình quản lý công nợ?
Khám phá SheetStore - Phần mềm quản lý bán hàng tích hợp Google Sheets với module công nợ chuyên nghiệp: tự động ghi nhận, aging report real-time, cảnh báo vượt hạn mức, và email nhắc nợ tự động.
Truy cập sheet.com.vn để tìm hiểu thêm và dùng thử miễn phí.
Chia sẻ bài viết:
Tuân Hoang
Đội ngũ SheetStore
Bạn thấy bài viết hữu ích?
Đăng ký nhận thông báo khi có bài viết mới.