Automate Repetitive Tasks bằng n8n, miễn phí thử
n8n là công cụ no-code nối ứng dụng và API thành automation. Trước khi tạo bất kỳ tài khoản nào, đây là 9 workflow để automate repetitive tasks mà bạn có thể
Tự chạy · bấm ô để tới mục đó · cả 9 trong một zip
- 01 Tóm tắt việc cần làm hằng ngày
- 02 Tổng hợp theo cửa sổ tuần
- 03 Khung báo cáo hằng tháng
- 04 Đồng hồ workflow và đồng hồ server
- 05 Cấu hình khoảng cách vs cron expression
- 06 Cổng điều kiện bỏ qua cuối tuần
- 07 Bắt kịp sau lần chạy bị bỏ lỡ
- 08 Nội dung email tổng hợp
- 09 Lấy, biến đổi, định dạng — pipeline 3 bước
Chín workflow này được xếp theo đúng thứ tự một công việc lặp lại thường được tự động hóa ngoài đời. Bắt đầu với ba kiểu chạy theo lịch cơ bản (01 hằng ngày, 02 hằng tuần, 03 hằng tháng), rồi tới hai thứ hay gây lỗi nhất — bẫy timezone (04) và cú pháp trigger (05) — sau đó là một cổng điều kiện quyết định có chạy hay không (06) và cách bắt kịp sau lần chạy bị bỏ lỡ (07), kết thúc bằng hai workflow định dạng kết quả thành thứ gửi đi được (08 nội dung email, 09 pipeline lấy-biến đổi-định dạng đầy đủ). Automation thật ngoài đời cũng thường được hoàn thiện theo đúng thứ tự này — cho chạy trước, kiểm tra giờ giấc, lọc ngoại lệ, rồi mới làm cho đẹp.
01Tóm tắt việc cần làm hằng ngày
Schedule Trigger khởi động mỗi sáng lúc 8 giờ (Manual Trigger để test ngay), HTTP Request lấy danh sách việc cần làm, Filter chỉ giữ việc của một người, rồi node Code viết tóm tắt 5 dòng với checkbox cho từng việc. Dùng cho bản tin buổi sáng, hoặc chỉ để kiểm tra việc đã xong mỗi ngày.
{
"name": "Build Summary",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const items = $input.all();\nconst lines = items.map(item => `- [${item.json.completed ? 'x' : ' '}] ${item.json.title}`);\nconst summary = `# Daily Summary\\n\\n${items.length} to-dos for user 3 today\\n\\n` + lines.join('\\n');\nreturn [{ json: { summary } }];"
}
}
02Tổng hợp theo cửa sổ tuần
Schedule khởi động mỗi thứ Hai lúc 9 giờ, HTTP lấy toàn bộ comment, rồi node Code chỉ giữ phần của tuần này. Khác với Aggregate, node Summarize ở đây nhóm theo từng bài viết trước khi đếm. Dùng cho báo cáo tương tác hằng tuần, hoặc đếm phản hồi theo từng bài mỗi thứ Hai.
{
"name": "Count Per Post",
"type": "n8n-nodes-base.summarize",
"typeVersion": 1.1,
"parameters": {
"fieldsToSummarize": {
"values": [
{ "aggregation": "count", "field": "id" }
]
},
"fieldsToSplitBy": "postId",
"options": { "outputFormat": "separateItems" }
}
}
03Khung báo cáo hằng tháng
Schedule khởi động ngày 1 mỗi tháng lúc 9 giờ, HTTP lấy danh sách user, rồi chỉ một node Code duy nhất viết thẳng báo cáo dạng câu văn — không cần Aggregate hay node Markdown xen giữa. Càng ít node, càng ít chỗ để hỏng. Đây là dạng dùng cho email tình hình hằng tháng, hoặc báo cáo số lượng đăng ký.
{
"name": "Build Monthly Report",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const users = $input.all().map(item => item.json);\nconst lines = users.map(u => `- ${u.name} <${u.email}>`);\nconst monthlyReport = `# Monthly Report\\n\\n${users.length} users on file this month.\\n\\n` + lines.join('\\n');\nreturn [{ json: { monthlyReport } }];"
}
}
04Đồng hồ workflow vs đồng hồ server
Ghim timezone trong cài đặt workflow thì Schedule chạy theo giờ đó, nhưng in $now (theo timezone của workflow) cạnh Date thuần JS (luôn là UTC) trong node Code thì hai bên lại mô tả cùng một thời điểm khác nhau. Chạy thử mục này khi cần chẩn đoán lịch chạy sai giờ.
{
"name": "Compare Clocks",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const workflowNow = $now.toFormat('yyyy-LL-dd HH:mm:ss');\nconst workflowZone = $now.zoneName;\nconst serverNow = new Date().toISOString();\nreturn [{ json: { workflowNow, workflowZone, serverNow } }];"
}
}
05Cấu hình khoảng cách vs cron expression
Đặt cạnh nhau hai Schedule Trigger — một cái set field Hours thành 6, cái kia viết 0 */6 * * * vào field Custom (Cron). Field trên UI đủ dùng cho nhịp đơn giản, nhưng thứ như "ngày làm việc cuối cùng của tháng" thì chỉ cú pháp cron mới viết được. Tóm lại: nhịp đơn giản dùng UI, còn điều kiện phức tạp dùng cron như ví dụ này.
{
"name": "Every 6 Hours (Cron)",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.4,
"parameters": {
"rule": {
"interval": [
{ "field": "cronExpression", "expression": "0 */6 * * *" }
]
}
}
}
06Cổng điều kiện bỏ qua cuối tuần
Code tạo 7 ngày mẫu từ Thứ Hai đến Chủ Nhật, IF chia theo cuối tuần hay không (dayOfWeek là 0 hoặc 6) — ngày thường thì lấy bài viết rồi dựng báo cáo, cuối tuần thì bỏ qua ngay. Cả hai nhánh gặp nhau sau Merge trong cùng field action. Dùng cho cảnh báo chỉ chạy ngày làm việc, im lặng cuối tuần mà không cần xóa lịch.
{
"name": "Is Weekend",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"parameters": {
"conditions": {
"conditions": [
{ "leftValue": "={{ $json.dayOfWeek }}", "rightValue": 0, "operator": { "type": "number", "operation": "equals" } },
{ "leftValue": "={{ $json.dayOfWeek }}", "rightValue": 6, "operator": { "type": "number", "operation": "equals" } }
],
"combinator": "or"
}
}
}
07Bắt kịp sau lần chạy bị bỏ lỡ
Schedule đáng lẽ chạy mỗi 15 phút, nhưng node Code nhớ thời điểm chạy cuối trong static data của chính workflow ($getWorkflowStaticData), rồi tính lần này đã trôi qua bao nhiêu phút và bỏ lỡ bao nhiêu lần chạy. Cách để n8n tự nhận ra khoảng thời gian mình bị gián đoạn. Dùng để phát hiện lỗ hổng sau khi server khởi động lại, đo khoảng cách mà không cần log thực thi để đối chiếu.
{
"name": "Detect Missed Runs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const staticData = $getWorkflowStaticData('node');\nconst expectedIntervalMinutes = 15;\nconst now = Date.now();\nconst lastRun = staticData.lastRun || (now - expectedIntervalMinutes * 3 * 60000);\nconst elapsedMinutes = Math.round((now - lastRun) / 60000);\nconst missedRuns = Math.max(0, Math.floor(elapsedMinutes / expectedIntervalMinutes) - 1);\nstaticData.lastRun = now;\nreturn [{ json: { elapsedMinutes, missedRuns } }];"
}
}
08Nội dung email tổng hợp
Schedule đọc bài RSS mới nhất mỗi 3 giờ, Sort xếp theo mới nhất, Limit cắt còn 5, Code dệt tiêu đề và lời chào thành markdown, rồi node Markdown biến nó thành HTML dán thẳng vào email được luôn. Đây là dạng dùng cho newsletter định kỳ, hoặc nội dung thông báo Slack hay email gửi theo lịch.
{
"name": "Markdown to HTML",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $json.markdown }}",
"destinationKey": "emailHtml",
"options": {}
}
}
09Pipeline lấy, biến đổi, định dạng — 3 bước
Schedule lấy dự báo 3 ngày từ API thời tiết không cần key mỗi ngày lúc 6 giờ, Code biến đổi bằng cách tính trung bình nhiệt độ cao nhất và thấp nhất, rồi node Markdown định dạng thành câu báo cáo. Hầu hết workflow báo cáo thực ra chỉ gồm đúng ba bước này. Dùng làm bản tin thời tiết hằng ngày, hoặc đổi API để lấy khung pipeline báo cáo tổng quát có thể dùng lại ở chỗ khác.
{
"name": "Build Report",
"type": "n8n-nodes-base.markdown",
"typeVersion": 1,
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ '# Weather Report — ' + $json.reportDate + '\\n\\n3-day average high: ' + $json.avgHigh + '°C\\n3-day average low: ' + $json.avgLow + '°C' }}",
"destinationKey": "report",
"options": {}
}
}
Chuẩn bị — tài khoản, quyền, phiên bản
Cột chuẩn bị ở dòng nào cũng ghi "không có", nhưng bảng vẫn cần thiết vì thời điểm kiểm chứng và phiên bản n8n khác nhau giữa các mục. Cấp độ đo bằng ba mức V0 (cấu trúc), V1 (đã xác minh import), V2 (đã xác minh chạy thật) — bài này đạt V2 ở cả 9/9 mục.
| Mục | Cấp độ | Chuẩn bị | Phiên bản n8n |
|---|---|---|---|
| 01 Tóm tắt việc cần làm hằng ngày | V2 | không có | 2.38.5 |
| 02 Tổng hợp theo cửa sổ tuần | V2 | không có | 2.38.5 |
| 03 Khung báo cáo hằng tháng | V2 | không có | 2.38.5 |
| 04 Đồng hồ workflow vs đồng hồ server | V2 | không có | 2.38.5 |
| 05 Cấu hình khoảng cách vs cron expression | V2 | không có | 2.38.5 |
| 06 Cổng điều kiện bỏ qua cuối tuần | V2 | không có | 2.38.5 |
| 07 Bắt kịp sau lần chạy bị bỏ lỡ | V2 | không có | 2.38.5 |
| 08 Nội dung email tổng hợp | V2 | không có | 2.38.5 |
| 09 Pipeline lấy, biến đổi, định dạng | V2 | không có | 2.38.5 |
Có ba cách để đưa các file này vào n8n: dán trực tiếp JSON vào canvas bằng Ctrl/Cmd+V, dùng Import from File trong menu canvas để chọn file trong zip, hoặc chạy n8n import:workflow --input=file.json nếu dùng CLI. Sau khi import xong, bấm nút Test workflow ở góc trên bên trái (hoặc icon play trên node Manual Trigger) là chạy được ngay.
Vỡ ở đâu — một bẫy có thật
Chỗ hay gây nhầm lẫn nhất là timezone ở mục 04 — ghim timezone trong cài đặt workflow thì giờ chạy của Schedule và mọi biểu thức $now sẽ theo đúng múi giờ đó, nhưng nếu vô tình dùng new Date() thuần trong node Code, giá trị lại theo đồng hồ hệ thống của server (thường là UTC). Trộn lẫn hai thứ này sẽ ra lỗi kiểu "rõ ràng chạy lúc 9 giờ sáng mà báo cáo lại ghi nửa đêm". Mật khẩu để mở file zip này là kenrd2uf, giải nén ra là thấy ngay 9 file JSON nằm trong thư mục workflows/. Node Summarize ở mục 02 cũng có một bẫy nhỏ tương tự — tên field đầu ra không phải do bạn đặt mà được ghép tự động kiểu count_id, nên đoán bừa là count thì node tiếp theo sẽ không tìm thấy field đó.
FAQ
Mới dùng n8n lần đầu, có cần tạo tài khoản trước không?
Không cần. Cả 9 workflow trong file zip này đều không dùng community node hay thông tin xác thực cần tài khoản — chỉ cần import vào một instance n8n local hoặc miễn phí là Manual Trigger chạy được ngay.
Nếu phiên bản n8n của tôi khác thì sao?
Gặp lỗi typeVersion thì hãy tạo mới chính node đó trên canvas, export ra rồi xem giá trị nó thực sự hỗ trợ. File zip này đã được xác minh import và chạy trên n8n 2.38.5 (Node 24).
Muốn nối vào Google Sheets hay Slack thật thì làm sao?
Chỉ cần thay node HTTP Request hoặc node Code cuối cùng dựng báo cáo bằng đích bạn muốn (Google Sheets, Slack, email). Node nào cần key thì thêm thông tin xác thực qua tùy chọn Authentication riêng, thay vì gõ thẳng giá trị vào JSON của workflow rồi chia sẻ — đó cũng là cách tài liệu chính thức của n8n khuyên dùng.
Nếu muốn tìm hiểu thêm n8n, chuyên mục automation có thêm ví dụ tiếp theo trong nhóm này, còn trang giới thiệu ghi rõ trang này kiểm chứng nội dung theo tiêu chuẩn nào.