Tới nội dung chính
hstation
Dịch vụDự ánVề tôiBlogThư viện nhạc

Tự động hoá · 9 phút đọc · 2026-09-17

Hướng dẫn n8n tiếng Việt: dựng luồng đầu tiên, đọc số item và ba lỗi người mới hay gặp

Một luồng đơn hàng mẫu cho thấy cách đọc INPUT, Parameters, OUTPUT và số item để bắt ba lỗi n8n người mới hay gặp. Từ Split Out đến Expression, mỗi bước đều có dấu hiệu kiểm tra rõ ràng.

Bài hướng dẫn n8n tiếng Việt này đi đúng một việc: dựng xong một luồng chạy được, rồi học cách đọc nó để tự tìm ra lỗi. Luồng mẫu lọc đơn hàng từ 1 triệu trở lên, không cần tài khoản hay dịch vụ ngoài nào, nên bạn chạy được ngay trên bản n8n vừa cài.

Mình làm trên n8n 2.35.7 tự cài trên Windows. Mọi ảnh trong bài là ảnh chụp sau khi bấm chạy thật, mọi thông báo lỗi là nguyên văn máy trả về.

Hướng dẫn n8n tiếng Việt: cần gì trước khi bắt đầu

  • Bạn đã có n8n chạy trên máy. Chưa có thì làm theo bài Cài n8n trên Windows.
  • Chưa rõ node, workflow, trigger là gì thì đọc nhanh bài n8n là gì.

Hai từ cần nhớ cho cả bài: node là một bước xử lý, item là một dòng dữ liệu đi qua node.

Bước 1: dán luồng mẫu vào n8n

Cách nhanh nhất để có n8n workflow đầu tiên chạy được là dán sẵn JSON của nó.

  1. Mở n8n, tạo một workflow trống.
  2. Bấm nút "Sao chép" ở khối mã dưới đây.
  3. Bấm vào vùng canvas trống rồi nhấn Ctrl+V.
json
{"nodes":[{"id":"n1","name":"Bấm chạy thử","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0],"parameters":{}},{"id":"n2","name":"Tạo danh sách đơn","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[240,0],"parameters":{"mode":"manual","assignments":{"assignments":[{"id":"a1","name":"don","value":"[{\"ma\":\"DH01\",\"khach\":\"Chị Mai\",\"tien\":450000},{\"ma\":\"DH02\",\"khach\":\"Anh Khoa\",\"tien\":1250000},{\"ma\":\"DH03\",\"khach\":\"Chị Thảo\",\"tien\":780000},{\"ma\":\"DH04\",\"khach\":\"Anh Phúc\",\"tien\":2100000},{\"ma\":\"DH05\",\"khach\":\"Chị Ngân\",\"tien\":990000}]","type":"array"}]},"options":{}}},{"id":"n3","name":"Tách từng đơn","type":"n8n-nodes-base.splitOut","typeVersion":1,"position":[480,0],"parameters":{"fieldToSplitOut":"don","options":{}}},{"id":"n4","name":"Đơn từ 1 triệu?","type":"n8n-nodes-base.if","typeVersion":2.3,"position":[720,0],"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","version":3,"typeValidation":"={{ ($nodeVersion < 2.1 ? $parameter.options.looseTypeValidation :  $parameter.looseTypeValidation) ? \"loose\" : \"strict\" }}"},"conditions":[{"id":"d1","leftValue":"={{ $json.tien }}","rightValue":1000000,"operator":{"type":"number","operation":"gte"}}],"combinator":"and"},"looseTypeValidation":false,"options":{}}},{"id":"n5","name":"Nhắc gọi xác nhận","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[980,-100],"parameters":{"mode":"manual","assignments":{"assignments":[{"id":"a2","name":"loiNhan","value":"=Gọi xác nhận đơn {{ $json.ma }} của {{ $json.khach }}, {{ $json.tien }} đ","type":"string"}]},"options":{}}},{"id":"n6","name":"Đơn nhỏ, bỏ qua","type":"n8n-nodes-base.noOp","typeVersion":1,"position":[980,100],"parameters":{}}],"connections":{"Bấm chạy thử":{"main":[[{"node":"Tạo danh sách đơn","type":"main","index":0}]]},"Tạo danh sách đơn":{"main":[[{"node":"Tách từng đơn","type":"main","index":0}]]},"Tách từng đơn":{"main":[[{"node":"Đơn từ 1 triệu?","type":"main","index":0}]]},"Đơn từ 1 triệu?":{"main":[[{"node":"Nhắc gọi xác nhận","type":"main","index":0}],[{"node":"Đơn nhỏ, bỏ qua","type":"main","index":0}]]}}}

Đã xong khi canvas hiện đủ 6 node: Bấm chạy thử, Tạo danh sách đơn, Tách từng đơn, Đơn từ 1 triệu?, Nhắc gọi xác nhận, Đơn nhỏ, bỏ qua. Mình đã dán đúng khối JSON này vào một workflow trống và chạy thử:

Workflow trống tên My workflow 3 sau khi dán JSON của luồng mẫu và bấm chạy: đủ sáu node với đúng tên, các đường nối ghi 1 item, 1 item, 5 items, nhánh true 2 items, nhánh false 3 items.
Workflow trống tên My workflow 3 sau khi dán JSON của luồng mẫu và bấm chạy: đủ sáu node với đúng tên, các đường nối ghi 1 item, 1 item, 5 items, nhánh true 2 items, nhánh false 3 items.

Bước 2: bấm chạy và đọc số item

Bấm nút Execute workflow. Chạy xong, mỗi node viền xanh có dấu tích, và mỗi đường nối có một nhãn đếm item.

Luồng mẫu sau khi bấm Execute workflow trong n8n 2.35.7. Sáu node đều viền xanh có dấu tích: Bấm chạy thử, Tạo danh sách đơn, Tách từng đơn, Đơn từ 1 triệu?, rồi rẽ hai nhánh Nhắc gọi xác nhận và Đơn nhỏ, bỏ qua. Nhãn trên các đường nối ghi lần lượt 1 item, 1 item, 5 items, nhánh true 2 items, nhánh false 3 items, và 2 items, 3 items ở đầu ra hai node cuối.
Luồng mẫu sau khi bấm Execute workflow trong n8n 2.35.7. Sáu node đều viền xanh có dấu tích: Bấm chạy thử, Tạo danh sách đơn, Tách từng đơn, Đơn từ 1 triệu?, rồi rẽ hai nhánh Nhắc gọi xác nhận và Đơn nhỏ, bỏ qua. Nhãn trên các đường nối ghi lần lượt 1 item, 1 item, 5 items, nhánh true 2 items, nhánh false 3 items, và 2 items, 3 items ở đầu ra hai node cuối.

Đọc nhãn theo thứ tự:

  1. Bấm chạy thử → Tạo danh sách đơn: 1 item. Lượt bấm tay tạo ra đúng một item.
  2. Tạo danh sách đơn → Tách từng đơn: 1 item. Vẫn một item, nhưng giờ chứa một mảng 5 đơn.
  3. Tách từng đơn → Đơn từ 1 triệu?: 5 items. Mảng đã tách thành 5 item, mỗi đơn một item.
  4. Nhánh true: 2 items, nhánh false: 3 items. Hai đơn từ 1 triệu trở lên, ba đơn nhỏ hơn.

Đây là thói quen quan trọng nhất khi học cách sử dụng n8n: nhìn số item trước, nhìn chữ "thành công" sau. Phần lỗi bên dưới sẽ cho thấy vì sao.

Bước 3: mở một node để xem dữ liệu vào và ra

Nhấp đúp vào node bất kỳ. Bảng mở ra có ba cột:

  • INPUT: dữ liệu node nhận vào. Đổi cách xem bằng ba nút Schema, Table, JSON.
  • Parameters: cấu hình của node. Nút Execute step chạy riêng node này.
  • OUTPUT: dữ liệu node trả ra, kèm số item ở đầu cột.

n8n Split Out là gì: từ 1 item thành 5 items

Bảng của node Tách từng đơn mở ra sau lượt chạy. Cột INPUT ghi Tạo danh sách đơn 1 item, bên trong là trường don gồm don 0 đến don 4, mỗi phần tử có ma, khach, tien. Cột giữa có ô Fields To Split Out ghi don. Cột OUTPUT ghi 5 items, dạng bảng ba cột ma, khach, tien: DH01 Chị Mai 450000, DH02 Anh Khoa 1250000, DH03 Chị Thảo 780000, DH04 Anh Phúc 2100000, DH05 Chị Ngân 990000.
Bảng của node Tách từng đơn mở ra sau lượt chạy. Cột INPUT ghi Tạo danh sách đơn 1 item, bên trong là trường don gồm don 0 đến don 4, mỗi phần tử có ma, khach, tien. Cột giữa có ô Fields To Split Out ghi don. Cột OUTPUT ghi 5 items, dạng bảng ba cột ma, khach, tien: DH01 Chị Mai 450000, DH02 Anh Khoa 1250000, DH03 Chị Thảo 780000, DH04 Anh Phúc 2100000, DH05 Chị Ngân 990000.

Node Tạo danh sách đơn trả ra một item chứa trường don là một mảng. Nếu để nguyên như vậy, node If phía sau chỉ nhận một item. Split Out nhận tên trường mảng (ô Fields To Split Out ghi don) và tách nó ra thành 5 items. Từ đây, mọi node phía sau chạy một lần cho mỗi đơn.

n8n Expression là gì: ô có dấu bằng và dòng xem trước

Node Nhắc gọi xác nhận. Cột INPUT ghi Đơn từ 1 triệu? 2 items, item đầu là DH02 Anh Khoa 1250000. Ở giữa, trường loiNhan kiểu String có vạch dấu bằng bên trái, các đoạn trong ngoặc nhọn tô màu xanh, dòng xem trước bên dưới ghi Gọi xác nhận đơn DH02 của Anh Khoa, 1250000 đ. Cột OUTPUT 2 items: Gọi xác nhận đơn DH02 của Anh Khoa, 1250000 đ và Gọi xác nhận đơn DH04 của Anh Phúc, 2100000 đ.
Node Nhắc gọi xác nhận. Cột INPUT ghi Đơn từ 1 triệu? 2 items, item đầu là DH02 Anh Khoa 1250000. Ở giữa, trường loiNhan kiểu String có vạch dấu bằng bên trái, các đoạn trong ngoặc nhọn tô màu xanh, dòng xem trước bên dưới ghi Gọi xác nhận đơn DH02 của Anh Khoa, 1250000 đ. Cột OUTPUT 2 items: Gọi xác nhận đơn DH02 của Anh Khoa, 1250000 đ và Gọi xác nhận đơn DH04 của Anh Phúc, 2100000 đ.

Expression (biểu thức) là cách lấy dữ liệu từ item đang chạy chèn vào một ô. Trường loiNhan ghi:

text
Gọi xác nhận đơn {{ $json.ma }} của {{ $json.khach }}, {{ $json.tien }} đ

$json.ma nghĩa là "trường ma của item đang chạy". Ô đang ở chế độ biểu thức có ba dấu hiệu, và bạn nên tập nhìn ra cả ba:

  1. Vạch có dấu = ở mép trái ô.
  2. Phần trong {{ }} được tô màu xanh.
  3. Có dòng xem trước kết quả ngay dưới ô.

Kết quả thật: "Gọi xác nhận đơn DH02 của Anh Khoa, 1250000 đ" và "Gọi xác nhận đơn DH04 của Anh Phúc, 2100000 đ".

Lỗi 1: quên bật chế độ biểu thức

Mình gõ đúng nội dung trên vào trường loiNhan, nhưng để ô ở chế độ thường.

Cùng node Nhắc gọi xác nhận nhưng trường loiNhan ở chế độ thường: không có vạch dấu bằng, chữ không tô màu, không có dòng xem trước. Cột OUTPUT vẫn 2 items nhưng cả hai dòng ghi nguyên văn Gọi xác nhận đơn, rồi các đoạn ngoặc nhọn $json.ma, $json.khach, $json.tien chưa được thay bằng dữ liệu.
Cùng node Nhắc gọi xác nhận nhưng trường loiNhan ở chế độ thường: không có vạch dấu bằng, chữ không tô màu, không có dòng xem trước. Cột OUTPUT vẫn 2 items nhưng cả hai dòng ghi nguyên văn Gọi xác nhận đơn, rồi các đoạn ngoặc nhọn $json.ma, $json.khach, $json.tien chưa được thay bằng dữ liệu.
  • Lượt chạy vẫn báo thành công, không có lỗi nào.
  • Số item vẫn đúng: 2 items.
  • Nhưng lời nhắn ra nguyên văn Gọi xác nhận đơn {{ $json.ma }} của {{ $json.khach }}, {{ $json.tien }} đ.

Cách sửa: chuyển ô sang chế độ Expression, rồi kiểm lại ba dấu hiệu ở trên. Không thấy dòng xem trước nghĩa là ô chưa phải biểu thức.

Lỗi 2: số tiền là chữ

Mình đổi số tiền trong mảng thành chữ, ví dụ "450000" trong ngoặc kép.

Node Đơn từ 1 triệu? báo lỗi. Cột INPUT ghi Tách từng đơn 5 items, trường tien của DH01 mang biểu tượng chữ T và giá trị 450000. Ở giữa là điều kiện so tien lớn hơn hoặc bằng 1000000 viền đỏ, công tắc Convert types where required đang tắt. Cột OUTPUT ghi chữ đỏ Wrong type: '450000' is a string but was expecting a number, kèm gợi ý bật Convert types where required hoặc thêm .toNumber().
Node Đơn từ 1 triệu? báo lỗi. Cột INPUT ghi Tách từng đơn 5 items, trường tien của DH01 mang biểu tượng chữ T và giá trị 450000. Ở giữa là điều kiện so tien lớn hơn hoặc bằng 1000000 viền đỏ, công tắc Convert types where required đang tắt. Cột OUTPUT ghi chữ đỏ Wrong type: '450000' is a string but was expecting a number, kèm gợi ý bật Convert types where required hoặc thêm .toNumber().
  • Node If báo lỗi và luồng dừng. Nguyên văn: Wrong type: '450000' is a string but was expecting a number [condition 0, item 0].
  • Dấu hiệu ở cột INPUT: trường tien mang biểu tượng chữ T thay vì dấu # của số.
  • n8n gợi ý hai cách: bật Convert types where required, hoặc thêm .toNumber().

Cách sửa mình đã thử: bật công tắc Convert types where required trong node If, chạy lại. Kết quả thành công, nhánh true 2 items, nhánh false 3 items, giống hệt luồng gốc. Cách .toNumber() mình chưa thử.

Một chuyện mình vấp khi dựng luồng bằng API: nếu JSON của node If ghi cứng "typeValidation": "strict" thì bật công tắc cũng vẫn lỗi, vì giao diện tự đặt ô đó là một biểu thức đọc công tắc. JSON ở Bước 1 đã dùng đúng biểu thức đó, nên bạn bật công tắc là có tác dụng.

Lỗi 3: sai tên trường ở Split Out

Mình gõ dons thay vì don ở ô Fields To Split Out. Chỉ thừa một chữ s.

Node Tách từng đơn với ô Fields To Split Out ghi dons. Cột INPUT vẫn có trường don với 5 phần tử. Cột OUTPUT không có bảng dữ liệu, chỉ có dòng The field 'dons' wasn't found in any input item và khối chữ No output data returned, n8n stops executing the workflow when a node has no output data, kèm gợi ý đổi ở Settings, Always Output Data.
Node Tách từng đơn với ô Fields To Split Out ghi dons. Cột INPUT vẫn có trường don với 5 phần tử. Cột OUTPUT không có bảng dữ liệu, chỉ có dòng The field 'dons' wasn't found in any input item và khối chữ No output data returned, n8n stops executing the workflow when a node has no output data, kèm gợi ý đổi ở Settings, Always Output Data.
  • Lượt chạy vẫn báo thành công.
  • Split Out ra 0 item, luồng dừng ngay tại đó, hai node sau không chạy.
  • Chỉ khi mở node mới thấy dòng The field 'dons' wasn't found in any input item.

Cách sửa: mở cột INPUT ở dạng Schema, đọc đúng tên trường (ở đây là don), rồi gõ lại cho khớp từng chữ.

Điều rút ra cho người mới bắt đầu với n8n

Hai trong ba lỗi ở trên không làm lượt chạy báo lỗi. Vì vậy mỗi lần chạy thử, kiểm theo thứ tự này:

  1. Số item trên từng đường nối có đúng như bạn nghĩ không?
  2. Có node nào ra 0 item mà lẽ ra phải có dữ liệu không?
  3. Mở node cuối, đọc cột OUTPUT xem nội dung có đúng không, không chỉ đếm dòng.

Những gì mình chưa kiểm: n8n Cloud, bản chạy bằng Docker, cách sửa bằng .toNumber(), và tuỳ chọn Always Output Data.

Làm tiếp gì sau luồng đầu tiên

Bài hướng dẫn n8n tiếng Việt này dừng ở một luồng không cần tài khoản nào. Khi đã quen đọc số item, bạn có thể thử các luồng có dịch vụ thật mà mình đã dựng: