Template Quản Lý Dự Án Freelancer Google Sheets [Theo Dõi Giờ + Invoice 2026]
![Ảnh minh họa bài viết: Template Quản Lý Dự Án Freelancer Google Sheets [Theo Dõi Giờ + Invoice 2026]](/og-image.jpg)
Vấn Đề Mà Mọi Freelancer Đều Gặp
Bạn hoàn thành một dự án, nhưng không nhớ mình đã làm bao nhiêu giờ. Cuối tháng nhìn lại tài khoản ngân hàng và tự hỏi: dự án đó có thực sự lãi không? Invoice gửi muộn vì không biết tổng tiền là bao nhiêu. Khách hàng chưa thanh toán mà mình cũng quên mất.
Đây không phải vấn đề của riêng bạn — đây là pain-point phổ biến nhất trong cộng đồng freelancer. Và giải pháp không nhất thiết phải là phần mềm đắt tiền như FreshBooks hay HoneyBook. Một file Google Sheets được thiết kế đúng có thể làm được tất cả.
Template này gồm 6 sheet liên kết với nhau, từ quản lý khách hàng đến tạo invoice PDF và gửi email tự động — tất cả trong một file miễn phí.
Tổng Quan 6 Sheet Trong Template
Trước khi đi vào chi tiết, đây là bức tranh toàn cảnh của template:
| Sheet | Mục đích | Nhập liệu |
|---|---|---|
| 1. Khách Hàng | Lưu thông tin và rate của từng khách | Thủ công (1 lần) |
| 2. Dự Án | Theo dõi tiến độ và ngân sách | Thủ công khi có dự án mới |
| 3. Time Tracking | Ghi nhận giờ làm hàng ngày | Thủ công hàng ngày |
| 4. Invoice | Quản lý hóa đơn và thanh toán | Auto từ Time Tracking |
| 5. Dashboard | Báo cáo doanh thu và hiệu suất | Auto (công thức) |
| 6. Cài Đặt | Thông tin cá nhân và template email | Thủ công (1 lần) |
Sheet 1: Khách Hàng — Nền Tảng Của Toàn Bộ Hệ Thống
Sheet này là "master data" — mọi sheet khác đều VLOOKUP về đây để lấy thông tin. Thiết lập kỹ một lần, dùng mãi mãi.
Cấu trúc cột:
- Mã KH: KH001, KH002, ... (dùng để VLOOKUP)
- Tên / Công ty: Tên hiển thị trên invoice
- Email: Dùng để gửi invoice tự động qua Apps Script
- SĐT: Liên hệ khi cần follow-up
- Địa chỉ: Hiện trên invoice nếu cần
- Loại tiền: VND, USD, EUR
- Rate mặc định ($/giờ): Tự động điền vào dự án mới
- Điều khoản TT (ngày): 7, 14, hoặc 30 — dùng để tính ngày đến hạn
- Ghi chú: Thông tin thêm, sở thích, lịch họp...
Mẹo: Đặt conditional formatting để highlight những khách hàng có điều khoản thanh toán ngắn (≤7 ngày) — đây là những client cần gửi invoice nhanh nhất sau khi hoàn thành việc.
Sheet 2: Dự Án — Theo Dõi Toàn Bộ Pipeline
Mỗi dự án là một dòng. Sheet này kết nối với Time Tracking để tự động cập nhật số giờ đã làm và doanh thu thực tế.
Cấu trúc cột:
- Mã DA: DA001, DA002, ...
- Tên dự án: Mô tả ngắn gọn
- Mã KH: Nhập mã từ Sheet 1
- Tên KH:
=VLOOKUP(C2, KhachHang!A:B, 2, 0)— tự điền - Loại: Fixed (giá cố định) hoặc Hourly (tính theo giờ)
- Ngân sách: Giá thỏa thuận ban đầu
- Rate ($/giờ):
=VLOOKUP(C2, KhachHang!A:G, 7, 0)— lấy từ khách hàng - Ngày bắt đầu / Deadline: Theo dõi tiến độ
- Trạng thái: Đang làm / Hoàn thành / Tạm dừng / Hủy
- Giờ đã làm:
=SUMIF(TimeTracking!B:B, A2, TimeTracking!G:G) - Đã xuất hóa đơn: Tổng tiền đã invoice
- Còn lại: Ngân sách - Đã xuất hóa đơn
Công thức tổng giờ theo dự án:
=SUMIF(TimeTracking!B:B, A2, TimeTracking!G:G)
Cột này tự động cộng tất cả giờ trong Time Tracking có cùng Mã DA. Bạn không cần nhập thủ công — chỉ cần track đúng mã dự án mỗi ngày.
Sheet 3: Time Tracking — Trung Tâm Nhập Liệu Hàng Ngày
Đây là sheet bạn sẽ dùng nhiều nhất. Mục tiêu: nhập nhanh, chính xác, đủ để xuất invoice.
Cấu trúc cột:
- Ngày: Ngày làm việc
- Mã DA: Dropdown từ Sheet 2
- Tên DA:
=VLOOKUP(B2, DuAn!A:B, 2, 0)— tự điền - Mô tả công việc: "Thiết kế UI màn hình đăng nhập", "Fix bug API endpoint" ...
- Giờ bắt đầu: 09:00 (tùy chọn)
- Giờ kết thúc: 11:30 (tùy chọn)
- Thời gian (giờ):
=(F2-E2)*24hoặc nhập thẳng số như 2.5 - Rate:
=VLOOKUP(B2, DuAn!A:G, 7, 0)— lấy từ dự án - Thành tiền:
=G2*H2 - Billable?: TRUE/FALSE — checkbox để loại bỏ giờ không tính phí
- Mã invoice: Gán khi tạo invoice để nhóm các giờ vào cùng một hóa đơn
Mẹo nhập liệu nhanh: Tạo Data Validation cho cột Mã DA (dropdown từ Sheet 2) để tránh nhập sai. Dùng Ctrl + ; để tự động điền ngày hôm nay.
Sheet 4: Invoice — Quản Lý Hóa Đơn Chuyên Nghiệp
Mỗi invoice là một dòng. Số tiền tự động tính từ Time Tracking, trạng thái tự cập nhật theo ngày đến hạn.
Cấu trúc cột:
- Số HĐ: INV-2026-001, INV-2026-002, ...
- Mã KH / Tên KH: VLOOKUP từ Sheet 1
- Ngày tạo: Ngày xuất invoice
- Ngày đến hạn:
=C2+VLOOKUP(B2, KhachHang!A:H, 8, 0)— tự tính dựa trên điều khoản KH - Tổng tiền:
=SUMIF(TimeTracking!K:K, A2, TimeTracking!I:I)— cộng từ Time Tracking theo Mã invoice - Thuế (10%):
=F2*0.1(điều chỉnh theo thực tế) - Tổng cộng:
=F2+G2 - Đã thu: Nhập thủ công khi nhận tiền
- Còn lại:
=H2-I2 - Trạng thái: Công thức tự động bên dưới
Công thức trạng thái tự động:
=IF(J2=0,"✅ Paid",IF(D2<TODAY(),"🔴 Overdue","🟡 Pending"))
Với công thức này, khi invoice được thanh toán đủ → hiện "✅ Paid". Quá hạn chưa trả → "🔴 Overdue". Còn trong hạn → "🟡 Pending". Bạn nhìn vào cột trạng thái là biết ngay cần follow-up invoice nào.
Đếm số invoice quá hạn chưa trả:
=COUNTIFS(Invoice!K:K,"🔴 Overdue",Invoice!J:J,">0")
Sheet 5: Dashboard — Báo Cáo Tài Chính Một Nhìn
Dashboard tổng hợp dữ liệu từ tất cả các sheet khác. Bạn chỉ cần vào đây cuối tháng để review.
Các chỉ số quan trọng:
Thu nhập tháng này:
=SUMPRODUCT(
(MONTH(Invoice!C:C)=MONTH(TODAY()))*
(YEAR(Invoice!C:C)=YEAR(TODAY()))*
Invoice!F:F
)
Tỷ lệ giờ billable:
=SUMIF(TimeTracking!J:J,TRUE,TimeTracking!G:G)/SUM(TimeTracking!G:G)
Nếu tỷ lệ này dưới 70%, bạn đang dành quá nhiều thời gian cho việc không thu phí (admin, học tập, meeting không cần thiết).
Các metric khác trên Dashboard:
- Thu nhập quý này và YTD (year-to-date)
- Số dự án đang chạy / hoàn thành / overdue
- Biểu đồ donut: khách hàng nào chiếm % doanh thu lớn nhất
- Aging report: invoice chưa thanh toán theo nhóm tuổi (0-7 ngày, 8-30 ngày, 30+ ngày)
- Top 5 dự án doanh thu cao nhất trong năm
Tạo biểu đồ doanh thu theo tháng: Chọn vùng dữ liệu tháng/doanh thu → Insert → Chart → Line chart. Thêm Moving Average để thấy xu hướng rõ hơn.
Sheet 6: Cài Đặt — Thiết Lập Một Lần Dùng Mãi
Sheet này lưu thông tin cá nhân để tự động điền vào invoice template:
- Tên đầy đủ / Tên công ty
- Email và SĐT
- Số tài khoản ngân hàng và tên ngân hàng
- Placeholder cho logo (link URL ảnh)
- Rate mặc định cho khách mới
- Đơn vị tiền tệ mặc định
- Template nội dung email invoice
Apps Script: Tạo Invoice PDF và Gửi Email Tự Động
Phần này biến template từ "bảng tính đẹp" thành "hệ thống thực sự". Chỉ cần dán code vào Extensions → Apps Script, sau đó gọi hàm khi cần gửi invoice.
function guiInvoice(invoiceId) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const invSheet = ss.getSheetByName('Invoice');
const khSheet = ss.getSheetByName('KhachHang');
// Tìm dòng invoice theo Số HĐ
const data = invSheet.getDataRange().getValues();
const row = data.find(r => r[0] === invoiceId);
if (!row) {
Logger.log('Không tìm thấy invoice: ' + invoiceId);
return;
}
const email = row[2]; // Cột C: Email KH
const tongTien = row[7]; // Cột H: Tổng cộng
const ngayHan = new Date(row[3]).toLocaleDateString('vi-VN');
const formatted = tongTien.toLocaleString('vi-VN') + ' VND';
// Export sheet Invoice thành PDF
const exportUrl = `https://docs.google.com/spreadsheets/d/${ss.getId()}/export?format=pdf&gid=${invSheet.getSheetId()}&portrait=true&fitw=true`;
const blob = UrlFetchApp.fetch(exportUrl, {
headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }
}).getBlob().setName(`Invoice_${invoiceId}.pdf`);
// Gửi email kèm PDF
GmailApp.sendEmail(
email,
`Invoice ${invoiceId} — Hạn thanh toán ${ngayHan}`,
`Kính gửi,\n\nVui lòng thanh toán ${formatted} trước ngày ${ngayHan}.\n\nMọi thắc mắc xin liên hệ reply email này.\n\nCảm ơn bạn đã hợp tác!`,
{ attachments: [blob] }
);
// Cập nhật trạng thái → Sent
const rowIndex = data.indexOf(row) + 1;
invSheet.getRange(rowIndex, 11).setValue('🟡 Pending'); // Đổi từ Draft → Pending
Logger.log(`Đã gửi invoice ${invoiceId} đến ${email}`);
}
// Gọi để test: guiInvoice('INV-2026-001')
Cách dùng:
- Vào Extensions → Apps Script
- Dán code vào editor
- Lưu và chạy
guiInvoice('INV-2026-001')với số HĐ thực tế - Lần đầu chạy sẽ yêu cầu cấp quyền Gmail và Drive — nhấn Allow
Nâng cao: Tạo một nút button trong sheet Invoice, gắn macro gọi hàm này với tham số là ô Số HĐ đang chọn — gửi invoice chỉ cần 1 click.
Mẹo Thực Chiến Cho Freelancer
1. Track giờ ngay khi bắt đầu làm, không phải cuối ngày. Ký ức về thời gian không đáng tin cậy — "hình như mình làm 3 tiếng" thường là 2 tiếng hoặc 4 tiếng. Mở Time Tracking, điền giờ bắt đầu, rồi mới làm việc.
2. Gửi invoice trong 24h sau khi hoàn thành dự án. Khi bạn giao xong, khách hàng đang hài lòng nhất. Đây là thời điểm tốt nhất để gửi invoice. Chờ một tuần thì tâm lý đã thay đổi.
3. Follow-up chính xác vào ngày thứ 7. Tạo một cột "Ngày follow-up" trong Invoice = Ngày đến hạn - 7. Dùng conditional formatting highlight màu đỏ khi TODAY() >= cột này. Bạn sẽ không bao giờ quên follow-up nữa.
4. Review Dashboard mỗi cuối tháng bằng 3 câu hỏi:
- Khách hàng nào đóng góp >40% doanh thu? (rủi ro phụ thuộc)
- Tỷ lệ billable có dưới 70%? (cần cắt việc không cần thiết)
- Có invoice nào overdue >30 ngày? (cần quyết định: nhắc tiếp hay dừng hợp tác)
5. Tạo "dự án phụ phí" cho công việc scope creep. Khi khách yêu cầu thêm ngoài hợp đồng, đừng làm chui — tạo dự án DA-XXX-EXTRA, track giờ riêng, rồi invoice riêng. Việc này giúp bạn chứng minh bằng số liệu khi cần thương lượng.
Kết Luận
Template này không thần kỳ — nó chỉ làm một việc: buộc bạn ghi lại dữ liệu đúng chỗ, đúng thời điểm. Khi dữ liệu đã ở đó, mọi quyết định về giá, về khách hàng, về thời gian đều dựa trên thực tế chứ không phải cảm giác.
Bắt đầu đơn giản: chỉ cần dùng Sheet 3 (Time Tracking) trong 2 tuần đầu. Sau khi quen, thêm Invoice. Sau đó mới cần Dashboard. Đừng setup tất cả rồi không dùng — đó là lỗi phổ biến nhất khi bắt đầu với bất kỳ hệ thống quản lý nào.
Freelancer thành công không nhất thiết là người làm giỏi nhất — mà là người biết mình đang kiếm tiền từ đâu, chi thời gian vào đâu, và ai là khách hàng đáng đầu tư quan hệ lâu dài.
Chia sẻ bài viết:
Tuân Hoang
Đội ngũ SheetStore
Google Workspace Certified, 5+ years experience
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.
