Tự động hóa báo cáo tuần với n8n và AI: Hướng dẫn từng bước

Tu-dong-hoa-bao-cao-n8n-ai-2400x1256

Sáng thứ Hai nào cũng vậy: mở file dữ liệu, lọc tuần trước, tính tổng, so với tuần trước nữa, chép số vào email, viết vài dòng nhận xét rồi gửi cho quản lý. Công việc không khó, nhưng lặp lại, tốn thời gian và dễ sai khi vội. Bài viết này hướng dẫn bạn tự động hóa báo cáo hằng tuần bằng n8n và AI: mỗi sáng thứ Hai, workflow tự đọc dữ liệu, tính KPI, nhờ Claude viết nhận xét và gửi email tóm tắt đến hộp thư người nhận.

⚡ WORKFLOWBáo cáo tuần · 6 node · chạy 8:00 sáng thứ Hai

⏰

Schedule Trigger
Thứ Hai 8:00
📄

Google Sheets
Đọc dữ liệu
{ }

Code
Tính KPI
✦

Claude
Viết nhận xét
{ }

Code
Soạn email
✉

Gmail
Gửi báo cáo

n8n là gì?

n8n là công cụ tự động hóa quy trình (workflow automation) cho phép bạn nối các ứng dụng với nhau bằng giao diện kéo thả. Mỗi bước trong quy trình là một node: node đọc Google Sheets, node chạy code, node gọi AI, node gửi Gmail… Dữ liệu chạy từ node này sang node kia như một dây chuyền.

Với Data Analyst, n8n có ba điểm hấp dẫn:

  • Có node Code để viết JavaScript (hoặc Python) khi cần tính toán chính xác, không bị giới hạn trong các thao tác kéo thả.
  • Có sẵn các node AI, ví dụ Basic LLM Chain kết hợp với Anthropic Chat Model để dùng Claude ngay trong workflow.
  • Có thể tự cài (self-host) trên máy chủ của công ty hoặc dùng bản cloud, tùy yêu cầu bảo mật.

Kiến trúc workflow báo cáo tuần: 6 node

Workflow trong bài gồm 6 node nối tiếp nhau:

⏰

NODE 1 · TRIGGER

Schedule Trigger

Khởi chạy lúc 8 giờ sáng thứ Hai

➜ Tín hiệu bắt đầu

📄

NODE 2 · DATA

Google Sheets

Đọc dữ liệu bán hàng

➜ Các dòng giao dịch thô

{ }

NODE 3 · CODE

Code – Tính KPI

Làm sạch, tính KPI tuần này so với tuần trước

➜ Một đối tượng JSON chứa các con số đã tính

✦

NODE 4 · AI

Basic LLM Chain + Anthropic Chat Model

Claude đọc KPI và viết nhận xét

➜ Đoạn nhận xét bằng tiếng Việt

{ }

NODE 5 · CODE

Code – Soạn email

Ghép KPI và nhận xét thành email HTML

➜ Nội dung email hoàn chỉnh

✉

NODE 6 · OUTPUT

Gmail

Gửi email cho người nhận

➜ Email trong hộp thư

{ } NODE CODE

Tính số

✦ CLAUDE

Viết lời

💡 Nguyên tắc quan trọng nhất: code tính số, AI viết lời. Mọi con số được tính bằng node Code, cho kết quả chính xác và lặp lại được. AI chỉ nhận các con số đã tính sẵn để diễn giải, không tự cộng trừ. Cách làm này vừa tránh AI tính sai, vừa giúp dữ liệu giao dịch chi tiết không bao giờ phải gửi cho AI.

Xây workflow từng bước

🧰 Bước 0⏰ Bước 1📄 Bước 2{ } Bước 3✦ Bước 4{ } Bước 5✉ Bước 6▶ Bước 7

BƯỚC 0🧰 CHUẨN BỊ

Bước 0: Chuẩn bị

  • n8n: dùng bản cloud, hoặc tự cài bằng Docker với lệnh chính thức:
🖥️ terminalCài n8n bằng Docker
1docker volume create n8n_data
2docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n
  • Dữ liệu: một Google Sheet tên DuLieuBanHang, mỗi dòng là một giao dịch với các cột NgayBan (định dạng YYYY-MM-DD), CuaHang, NhomHang, SoLuong, ThanhTien.
  • Credentials trong n8n: tài khoản Google (cho Google Sheets và Gmail) và API key của Anthropic (cho Claude). N8n lưu các thông tin này riêng, không hiển thị trong workflow.
  • Múi giờ: trong Settings của workflow, đặt Timezone là Asia/Ho_Chi_Minh để lịch chạy và cách tính tuần theo giờ Việt Nam.

BƯỚC 1⏰ TRIGGER

Bước 1: Schedule Trigger – chạy lúc 8 giờ sáng thứ Hai

Thêm node Schedule Trigger, chọn Trigger Interval là Weeks, ngày Monday, giờ 8. Trong lúc xây dựng, bạn vẫn có thể bấm Execute workflow để chạy thử bất cứ lúc nào.

BƯỚC 2📄 DATA

Bước 2: Google Sheets – đọc dữ liệu bán hàng

Thêm node Google Sheets, chọn thao tác Get row(s) in sheet, trỏ tới file và sheet DuLieuBanHang. Chạy thử node để chắc chắn n8n đọc đúng tên cột. Nếu dữ liệu nằm trong database, thay node này bằng node Postgres, MySQL hoặc Microsoft SQL và viết câu SQL chỉ lấy 2 tuần gần nhất.

BƯỚC 3{ } CODE

Bước 3: Code – làm sạch và tính KPI

Thêm node Code (ngôn ngữ JavaScript, chế độ Run Once for All Items), đặt tên là Tính KPI và dán đoạn code sau. Code xác định tuần vừa qua (thứ Hai đến Chủ nhật) và tuần trước đó, loại các dòng lỗi, rồi tính doanh thu tổng và theo từng cửa hàng:

{ } Tính KPI.jsCode node · JavaScript
1// 1. Lấy dữ liệu từ node trước
2const rows = $input.all().map(i => i.json);
3
4// 2. Xác định các mốc tuần (theo múi giờ của workflow)
5const homNay = new Date();
6homNay.setHours(0, 0, 0, 0);
7const thuHaiNay = new Date(homNay);
8thuHaiNay.setDate(homNay.getDate() - ((homNay.getDay() + 6) % 7));
9const batDau = new Date(thuHaiNay); batDau.setDate(batDau.getDate() - 7);   // thứ Hai tuần vừa qua
10const batDauTruoc = new Date(batDau); batDauTruoc.setDate(batDauTruoc.getDate() - 7);
11const ketThuc = new Date(thuHaiNay); ketThuc.setDate(ketThuc.getDate() - 1); // Chủ nhật vừa qua
12
13// 3. Làm sạch: bỏ dòng thiếu ngày hoặc doanh thu không phải số
14const sach = rows
15  .filter(r => r.NgayBan && r.CuaHang && !isNaN(Number(r.ThanhTien)))
16  .map(r => ({ ...r, Ngay: new Date(r.NgayBan + 'T00:00:00'), ThanhTien: Number(r.ThanhTien) }));
17
18const trongKhoang = (d, a, b) => d >= a && d < b;
19const tuanNay = sach.filter(r => trongKhoang(r.Ngay, batDau, thuHaiNay));
20const tuanTruoc = sach.filter(r => trongKhoang(r.Ngay, batDauTruoc, batDau));
21
22// 4. Tính KPI
23const tong = arr => arr.reduce((s, r) => s + r.ThanhTien, 0);
24const theoCuaHang = arr => arr.reduce((m, r) => { m[r.CuaHang] = (m[r.CuaHang] || 0) + r.ThanhTien; return m; }, {});
25const dt = tong(tuanNay), dtTruoc = tong(tuanTruoc);
26const chNay = theoCuaHang(tuanNay), chTruoc = theoCuaHang(tuanTruoc);
27const tyLe = (a, b) => (b ? (a - b) / b : null);
28
29const cuaHang = Object.keys({ ...chNay, ...chTruoc })
30  .map(ten => ({ cuaHang: ten, doanhThu: chNay[ten] || 0, tuanTruoc: chTruoc[ten] || 0,
31                 thayDoi: tyLe(chNay[ten] || 0, chTruoc[ten]) }))
32  .sort((a, b) => b.doanhThu - a.doanhThu);
33
34const ngay = d => `${String(d.getDate()).padStart(2, '0')}/${String(d.getMonth() + 1).padStart(2, '0')}/${d.getFullYear()}`;
35
36return [{ json: {
37  tuNgay: ngay(batDau), denNgay: ngay(ketThuc),
38  doanhThu: dt, doanhThuTuanTruoc: dtTruoc, tangTruong: tyLe(dt, dtTruoc),
39  soGiaoDich: tuanNay.length, soDongBiLoai: rows.length - sach.length,
40  cuaHang
41} }];

Chạy thử node và đối chiếu doanh thu tuần với một con số bạn tự tính trong Google Sheets. Trường soDongBiLoai cho biết có bao nhiêu dòng lỗi bị bỏ qua, rất hữu ích để phát hiện dữ liệu nhập sai.

BƯỚC 4✦ AI

Bước 4: Basic LLM Chain + Claude – viết nhận xét

Thêm node Basic LLM Chain, gắn sub-node Anthropic Chat Model (chọn credential Anthropic và một model Claude). Trong phần prompt, dùng biểu thức để đưa KPI vào:

✦ prompt.txtBasic LLM Chain · Prompt
Bạn là trợ lý phân tích của phòng kinh doanh. Dưới đây là KPI doanh thu tuần
{{ $json.tuNgay }} – {{ $json.denNgay }} đã được tính sẵn (đơn vị: VNĐ):
{{ JSON.stringify($json) }}

Yêu cầu:
– Viết 3 nhận xét ngắn và 1 đề xuất hành động, bằng tiếng Việt, tổng dưới 120 chữ.
– Chỉ dùng con số có trong dữ liệu trên, không tự tính thêm số mới.
– tangTruong và thayDoi là tỷ lệ (0.12 nghĩa là 12%); null nghĩa là không có dữ liệu so sánh.
– Không phỏng đoán nguyên nhân nếu dữ liệu không cho thấy.
– Mỗi ý trên một dòng, bắt đầu bằng dấu “- “.

Nên đặt temperature thấp trong phần Options của Anthropic Chat Model để câu chữ ổn định giữa các tuần. Kết quả của node nằm trong trường text.

BƯỚC 5{ } CODE

Bước 5: Code – soạn email HTML

Thêm một node Code nữa, đặt tên Soạn email, ghép số liệu từ node Tính KPI với nhận xét của Claude:

{ } Soạn email.jsCode node · JavaScript
1const k = $('Tính KPI').first().json;
2const nhanXet = $input.first().json.text || '';
3const tien = n => new Intl.NumberFormat('vi-VN').format(Math.round(n)) + ' đ';
4const pt = x => (x === null ? '–' : (x >= 0 ? '+' : '') + (x * 100).toFixed(1) + '%');
5
6const dong = k.cuaHang.map(c =>
7  `<tr><td>${c.cuaHang}</td><td align="right">${tien(c.doanhThu)}</td><td align="right">${pt(c.thayDoi)}</td></tr>`
8).join('');
9
10const y = nhanXet.split('\n').filter(s => s.trim().startsWith('-'))
11  .map(s => `<li>${s.replace(/^\s*-\s*/, '')}</li>`).join('');
12
13const html = `
14  <h2>Báo cáo doanh thu tuần ${k.tuNgay} – ${k.denNgay}</h2>
15  <p><b>Doanh thu:</b> ${tien(k.doanhThu)} (${pt(k.tangTruong)} so với tuần trước)<br>
16     <b>Số giao dịch:</b> ${k.soGiaoDich} · <b>Dòng dữ liệu bị loại:</b> ${k.soDongBiLoai}</p>
17  <table border="1" cellpadding="6" cellspacing="0">
18    <tr><th>Cửa hàng</th><th>Doanh thu</th><th>So với tuần trước</th></tr>${dong}
19  </table>
20  <h3>Nhận xét (AI hỗ trợ viết)</h3><ul>${y}</ul>`;
21
22return [{ json: { tieuDe: `Báo cáo doanh thu tuần ${k.tuNgay} – ${k.denNgay}`, html } }];

BƯỚC 6✉ OUTPUT

Bước 6: Gmail – gửi email

Thêm node Gmail, chọn thao tác Send a message: ô To là địa chỉ người nhận, Subject là biểu thức {{ $json.tieuDe }}, Email Type chọn HTML và Message là {{ $json.html }}. Nếu công ty dùng Outlook, thay bằng node Microsoft Outlook; muốn gửi vào nhóm chat, thêm node Slack hoặc Microsoft Teams.

📥 Hộp thư đến · n8n · 08:00 Thứ Hai

Báo cáo doanh thu tuần [từ ngày] – [đến ngày]

Doanh thu: [số liệu] ([± %] so với tuần trước)
Số giao dịch: [số liệu] · Dòng dữ liệu bị loại: [số liệu]

Cửa hàng Doanh thu So với tuần trước
Cửa hàng A [± %]
Cửa hàng B [± %]
Cửa hàng C [± %]

✦ Nhận xét (AI hỗ trợ viết)

•

•

•

Minh họa bố cục email mà workflow tạo ra (số liệu thật do node Tính KPI điền vào).

BƯỚC 7▶ KÍCH HOẠT

Bước 7: Chạy thử và kích hoạt

1
Bấm Execute workflow, kiểm tra đầu ra của từng node theo thứ tự.
2
Trong 2–3 tuần đầu, chỉ gửi email cho chính bạn để đối chiếu số liệu với cách làm thủ công.
3
Khi đã tin tưởng kết quả, đổi ô To thành người nhận thật và kích hoạt workflow (nút Active, hoặc Publish ở một số phiên bản mới) để lịch chạy tự động có hiệu lực.

Kiểm soát chất lượng: để báo cáo tự động vẫn đáng tin

Một báo cáo tự động chỉ có giá trị khi người nhận tin vào con số. Bảng dưới đây liệt kê các rủi ro thường gặp và cách phòng tránh:

⚠ RỦI RO 01 Dữ liệu chưa cập nhật

Ví dụ: Sheet chưa có số của Chủ nhật, doanh thu tuần bị thấp

Cách phòng tránh: Trong node Tính KPI, kiểm tra ngày mới nhất; nếu thiếu, dừng và gửi cảnh báo thay vì báo cáo

⚠ RỦI RO 02 Dữ liệu nhập sai

Ví dụ: Ô doanh thu có chữ, ngày sai định dạng

Cách phòng tránh: Loại dòng lỗi và hiển thị số dòng bị loại ngay trong email

⚠ RỦI RO 03 AI tự tính hoặc bịa số

Ví dụ: Nhận xét nêu một tỷ lệ không có trong KPI

Cách phòng tránh: Chỉ đưa số đã tính sẵn, ghi rõ “không tự tính số mới” trong prompt, đặt temperature thấp

⚠ RỦI RO 04 AI phỏng đoán nguyên nhân

Ví dụ: “Doanh thu giảm do thời tiết” trong khi không có dữ liệu thời tiết

Cách phòng tránh: Yêu cầu không suy đoán; ghi “AI hỗ trợ viết” để người đọc biết cách đọc

⚠ RỦI RO 05 Workflow lỗi mà không ai biết

Ví dụ: Hết hạn credential, API không phản hồi

Cách phòng tránh: Tạo một workflow riêng bắt đầu bằng node Error Trigger, gửi email báo lỗi cho bạn

Bảo mật và chi phí

🔒 Chỉ gửi số tổng hợp cho AI

Claude chỉ nhìn thấy KPI tuần và doanh thu theo cửa hàng, không thấy từng giao dịch hay thông tin khách hàng.

🔑 Quản lý credential trong n8n

không dán API key trực tiếp vào node Code hay prompt.

🏢 Chọn cách triển khai phù hợp

dữ liệu nhạy cảm nên dùng n8n tự cài trên máy chủ công ty và tuân theo chính sách IT.

💰 Chi phí AI thấp

mỗi tuần chỉ có một lần gọi AI với dữ liệu đã tóm gọn, nên chi phí API thường rất nhỏ. Chi phí chính nằm ở cách bạn chạy n8n (bản cloud trả phí, hoặc máy chủ tự cài).

Checklist trước khi kích hoạt

▶ kiem_tra_truoc_khi_kich_hoatExecution log
$ execute checklist –before-activate
✔ OKĐã đặt múi giờ workflow là Asia/Ho_Chi_Minh
✔ OKDoanh thu tuần trong node Tính KPI khớp với số tự tính
✔ OKPrompt có ràng buộc “chỉ dùng số có sẵn” và “không phỏng đoán”
✔ OKEmail hiển thị số dòng dữ liệu bị loại
✔ OKĐã gửi thử cho chính mình ít nhất 2 tuần
✔ OKCó workflow Error Trigger để báo lỗi
6/6 mục đạt → bật Active cho workflow

📅 Muốn học cách xây quy trình báo cáo tự động với Power BI, SQL, Python và AI? Xem Lịch khai giảng tháng 10/2026 các khóa Power BI, SQL, Python, AI tại MCNA.

Câu hỏi thường gặp (FAQ)

?Không biết JavaScript có làm được không?

Được. Bạn có thể dùng nguyên đoạn code trong bài và chỉ đổi tên cột, hoặc nhờ Claude viết node Code bằng cách mô tả cấu trúc dữ liệu và kết quả mong muốn, tương tự cách viết DAX bằng AI. Xem thêm bài Viết DAX bằng Claude.

?n8n khác gì Power Automate?

Cả hai đều là công cụ tự động hóa. Power Automate tích hợp sâu với hệ sinh thái Microsoft 365; n8n linh hoạt hơn khi cần viết code, tự cài đặt hoặc kết hợp nhiều dịch vụ AI. Nếu công ty đã dùng Microsoft 365, hãy cân nhắc công cụ có sẵn trước.

?Dữ liệu nằm trong SQL hoặc Excel trên OneDrive thì sao?

n8n có node cho các database phổ biến (Postgres, MySQL, Microsoft SQL) và node Microsoft Excel 365. Bạn chỉ cần thay node Google Sheets, các bước còn lại giữ nguyên.

?Có thể đính kèm biểu đồ trong email không?

Có thể, bằng cách tạo ảnh biểu đồ từ một dịch vụ vẽ biểu đồ qua node HTTP Request hoặc chụp trang Power BI. Tuy nhiên, với báo cáo tuần, một bảng số gọn cùng link tới Dashboard Power BI thường đủ và ít lỗi hơn.

?n8n có miễn phí không?

n8n có phiên bản tự cài đặt miễn phí và các gói cloud trả phí. Điều khoản và giá có thể thay đổi, hãy xem trang chính thức của n8n trước khi sử dụng cho công ty.

Kết luận

Tự động hóa báo cáo hằng tuần với n8n và AI không cần hệ thống phức tạp: chỉ 6 node, từ Schedule Trigger đến Gmail, là đã thay được cả buổi sáng thứ Hai làm thủ công. Chìa khóa là nguyên tắc code tính số, AI viết lời, cộng với các lớp kiểm soát chất lượng để người nhận luôn tin vào con số. Thời gian tiết kiệm được, hãy dành cho việc đào sâu vào những thay đổi mà báo cáo phát hiện ra. Bắt đầu ngay hôm nay bằng một workflow gửi báo cáo cho chính bạn.

Nếu bạn muốn học bài bản cách kết hợp phân tích dữ liệu với AI và tự động hóa, các khóa học tại MCNA Technology School sẽ đồng hành cùng bạn. Đọc thêm: AI Automation cho Data Analyst.

👉 Xem lịch khai giảng tháng 10/2026: Power BI, SQL, Python, AI – MCNA

Thông tin tác giả

Võ Ngọc Vương – Data Analyst tại MCNA Technology School

MCNA Technology School – Đơn vị tiên phong đào tạo AI, Big Data, Business Intelligence tại Việt Nam. Chuyên sâu về Power BI, Python, SQL và Data Analytics — đối tác đào tạo của 300+ doanh nghiệp.

Đối tác đào tạo: Viettel Global, Masan Group, Techcombank, VPBank, Daikin.

→ Chỉ mục