Workflow gửi Gmail tự động từ danh sách trên Google Sheet

Workflow gửi Gmail tự động từ danh sách trên Google Sheet

Định dạng: .Zip
Dung lượng: 2,4 KB
Lượt tải: 0-100 lượt
Tải về miễn phí

Mục lục bài viết

Workflow này hoạt động ra sao?

Workflow này tự động kiểm tra Google Sheets mỗi phút, tìm các khách hàng có trạng thái "Chờ gửi", gửi email cá nhân hóa qua Gmail, rồi cập nhật lại trạng thái trên Sheet để tránh gửi trùng. Toàn bộ quá trình diễn ra không cần con người can thiệp - bạn chỉ cần thêm một dòng dữ liệu mới vào Google Sheets (có thể dùng Google Form để nhập), hệ thống sẽ tự gửi email trong vòng 60 giây.

tạo workflow n8n gửi email tự động

Workflow gồm 6 node chính, hoạt động theo trình tự:

Thứ tự Tên Node Vai trò
1 Kích hoạt theo lịch Chạy workflow mỗi 1 phút
2 Lấy dữ liệu tin nhắn khách hàng Đọc toàn bộ dữ liệu từ Google Sheets
3 Lọc trạng thái (Chờ gửi) Chỉ giữ lại các dòng có Status = "Chờ gửi"
4 Gửi tin nhắn (Gmail) Gửi email đến từng khách hàng
5 Merge Đồng bộ để đảm bảo email gửi xong trước khi cập nhật
6 Cập nhật Trạng thái Ghi lại trạng thái mới vào Google Sheets

Những gì cần chuyển bị trước khi bắt đầu

Trước khi import workflow, hãy đảm bảo bạn có đủ các yếu tố sau:

  • Tài khoản n8n (bản Cloud hoặc self-hosted đều dùng được)
  • Tài khoản Google để tạo Google Sheets và kết nối Gmail
  • File JSON workflow "Gửi email cho khách hàng (done).json" đã có sẵn
  • Quyền truy cập Google Cloud Console nếu bạn chưa từng kết nối Gmail/Google Sheets với n8n trước đó (để cấp quyền OAuth2)

Xem thêm:

Bước 1: Tải và sao chép code JSON của Workflow

Mở file Gửi email cho khách hàng.json mà bạn tải về ở trên bằng một trình soạn thảo văn bản bất kỳ (Notepad, VS Code, hoặc Sublime Text).

Nhấn Ctrl + A để chọn toàn bộ nội dung file → nhấn Ctrl + C để sao chép toàn bộ đoạn mã JSON vào clipboard.

💡 Lưu ý: Không cần hiểu nội dung JSON này để làm theo hướng dẫn – bạn chỉ cần sao chép đúng và chính xác toàn bộ nội dung, n8n sẽ tự động dựng lại toàn bộ sơ đồ node từ đoạn mã này.

Bước 2: Dán code JSON vào n8n để tạo Workflow

hai cách để đưa workflow vào n8n – chọn cách nào phù hợp với bạn:

Cách 1 – Dán trực tiếp lên canvas (nhanh nhất)

  1. Đăng nhập vào n8n → nhấn "+ Add workflow" để tạo workflow trống mới
  2. Nhấn chuột vào vùng canvas trống (khu vực làm việc màu xám/đen)
  3. Nhấn Ctrl + V để dán đoạn JSON đã copy ở Bước 1
  4. n8n tự động nhận diện đây là cấu trúc workflow và dựng lại toàn bộ 6 node với đầy đủ vị trí, kết nối như bản gốc

Cách 2 – Import từ file (nếu giữ nguyên file .json)

  1. Tạo workflow mới trong n8n
  2. Nhấn vào biểu tượng ba chấm (⋯) ở góc trên bên phải màn hình
  3. Chọn "Import from File"
  4. Chọn file Gửi email cho khách hàng (done).json từ máy tính → nhấn Open

Sau khi import thành công, bạn sẽ thấy đúng sơ đồ workflow như trong ảnh minh họa: 6 node nối với nhau từ trái sang phải, kèm một Sticky Note màu vàng ghi chú cấu trúc cột dữ liệu Google Sheet ở góc trên cùng.

Bước 3: Tạo Google Sheet với dữ liệu chuẩn

Xem bài viết Hướng dẫn tích hợp Google Sheets vào n8n để biết cách kết nối Google Sheets vào n8n đã nhé.

n8n Google Sheets Gmail

Workflow này chỉ hoạt động đúng khi Google Sheets của bạn có chính xác 7 cột theo đúng tên và thứ tự sau:

Cột Tên cột Ý nghĩa Ví dụ
A ID Mã định danh khách hàng 1, 2, 3...
B Name Tên khách hàng hoặc công ty Quantrimang.com
C Email Địa chỉ email nhận thông báo quantrimang35@gmail.com
D Title Dùng làm chủ đề (subject) của email Khuyến mãi tháng 6
E Subject Nội dung mô tả ngắn cho nội bộ Ưu đãi đặc biệt dành cho khách hàng thân thiết
F Date Ngày dự kiến gửi 22/06/2026
G Status Trạng thái xử lý Chờ gửi / Đã gửi

Cách tạo:

  1. Truy cập https://docs.google.com/spreadsheets/u/0/ → nhấn "+ Blank" để tạo Sheet mới
  2. Đặt tên file (ví dụ: QTMTest-1)
  3. Nhập tiêu đề 7 cột vào dòng đầu tiên (hàng 1) đúng theo bảng trên
  4. Nhập dữ liệu mẫu vào các dòng tiếp theo, cột Status đặt là Chờ gửi cho các dòng cần gửi thử

Ví dụ dữ liệu mẫu thực tế:

ID | Name           | Email                     | Title              | Date       | Status
1  | Quantrimang.com| quantrimang35@gmail.com   | Khuyến mãi tháng 6 | 23/06/2026 | Chờ gửi
2  | QTM-2          | quantrimang45@gmail.com   | Giới thiệu sản phẩm| 22/06/2026 | Chờ gửi
3  | Quản Trị Mạng  | quantrimang55@gmail.com   | Thông báo cập nhật | 23/06/2026 | Đã gửi
4  | QTM-008        | quantrimang25@gmail.com   | Chương trình VIP   | 23/06/2026 | Chờ gửi

⚠️ Quan trọng: Tên sheet (tab) mặc định của Google Sheets tiếng Việt là "Trang tính1" – bạn cần dùng đúng tên này hoặc nhớ chọn lại đúng tên tab khi cấu hình node ở các bước sau.

Bước 4: Thiết lập node "Kích Hoạt Theo Lịch" (Schedule Trigger)

tự động hóa gửi email khách hàng

Nhấn đúp chuột vào node "Kích hoạt theo lịch" để mở cấu hình.

Thiết lập các tham số:

Tham số Giá trị
Trigger Interval Minutes
Minutes Between Triggers 1

Điều này nghĩa là mỗi 1 phút, workflow sẽ tự động chạy lại từ đầu để kiểm tra xem có khách hàng mới cần gửi email không.

hướng dẫn filter node n8n

Nhấn nút "Execute step" màu đỏ để kiểm tra – output trả về sẽ hiển thị một bản ghi gồm timestamp, ngày giờ hiện tại, ngày trong tuần, múi giờ... xác nhận node hoạt động bình thường.

Mẹo thực tế: Nếu bạn có nhiều dòng dữ liệu hoặc lo ngại vượt giới hạn gửi email (Gmail giới hạn khoảng 500 email/ngày với tài khoản cá nhân), nên tăng khoảng thời gian lên 5–15 phút thay vì 1 phút để tránh gửi quá dồn dập.

Bước 5: Thiết lập node "Lấy Dữ Liệu Tin Nhắn Khách Hàng"

merge node n8n là gì

Nhấn đúp chuột vào node "Lấy dữ liệu tin nhắn khách hàng".

5.1 – Kết nối Credential

Tại mục Credential, nhấn vào ô chọn → nhấn "Create New Credential" nếu chưa kết nối Google Sheets trước đó.

Một cửa sổ popup của Google sẽ hiện ra, yêu cầu bạn đăng nhập tài khoản Googlecấp quyền cho n8n truy cập Google Sheets. Nhấn Allow (Cho phép) để hoàn tất.

tích hợp Gmail vào n8n

5.2 – Cấu hình Resource và Operation

Tham số Giá trị
Resource Sheet Within Document
Operation Get Row(s)

5.3 – Chọn đúng Document và Sheet

  • Document: Nhấn vào ô "From list" → chọn đúng Google Sheet bạn vừa tạo ở Bước 3 (ví dụ: QTMTest-1)
  • Sheet: Chọn tab tương ứng (ví dụ: Trang tính1)

5.4 – Phần Filters

Để trống mục Filters (giữ "Currently no items exist") – node này có nhiệm vụ lấy toàn bộ dữ liệu trong Sheet về, việc lọc theo trạng thái sẽ được xử lý ở node tiếp theo.

Nhấn "Execute step" để kiểm tra. Nếu cấu hình đúng, phần Output bên phải sẽ hiển thị toàn bộ các dòng dữ liệu trong Sheet (ví dụ: 4 items với đầy đủ các cột ID, Name, Email, Title, Subject...).

Bước 6: Thiết lập node "Lọc Trạng Thái" (Filter)

workflow automation email

Nhấn đúp chuột vào node "Lọc trạng thái (Chờ gửi)".

Đây là node quyết định dòng dữ liệu nào đủ điều kiện để gửi email. Bạn cần thiết lập đúng 5 điều kiện, kết hợp bằng AND (tất cả điều kiện phải đúng cùng lúc):

# Trường Điều kiện Giá trị
1 {{ $json.Email }} exists (tồn tại)
2 {{ $json.Date }} exists (tồn tại)
3 {{ $json.Name }} exists (tồn tại)
4 {{ $json.Status }} is equal to Chờ gửi
5 {{ $json.Date }} is equal to
{{ $now.toFormat('dd/MM/yyyy') }}

n8n gui email tu dong

Cách thêm từng điều kiện

  1. Nhấn "Add condition"
  2. Ở ô bên trái, nhập biểu thức (ví dụ {{ $json.Email }}) hoặc kéo từ phần tiêu đề của mỗi cột trong Sheets vào.
  3. Nhấn vào ô operator ở giữa, chọn loại kiểm tra phù hợp (exists hoặc is equal to)
  4. Nếu chọn is equal to, nhập giá trị so sánh vào ô bên phải (ví dụ: Chờ gửi)
  5. Lặp lại cho đến khi đủ 5 điều kiện, đảm bảo Combinator giữa các điều kiện là AND

Giải thích thêm về các loại điều kiện chọn trong khi nhập biểu thức:

exists (Tồn tại): Kiểm tra xem danh sách (mảng) đó có tồn tại trong dữ liệu đầu vào hay không.

does not exist (Không tồn tại): Lọc ra các hàng hoàn toàn không chứa trường danh sách này.

is empty (Mảng trống): Lọc các hàng có tồn tại danh sách nhưng bên trong danh sách đó không có phần tử nào (mảng rỗng, dạng []).

is not empty (Không bị trống): Bắt buộc ô dữ liệu đó phải có chữ hoặc số. Bạn nên dùng lệnh này cho các cột quan trọng như Email hay Name để đảm bảo hệ thống không gửi thư đi khi thiếu thông tin người nhận.

is equal to (Bằng / Khớp chính xác): Ô dữ liệu phải giống y hệt 100% từng ký tự (kể cả chữ hoa, chữ thường, dấu tiếng Việt) với cụm từ bạn điền. Ví dụ: Status bằng chính xác chữ Chờ gửi.

contains (Chứa phần tử): Kiểm tra xem bên trong danh sách có chứa một giá trị cụ thể nào đó mà bạn chỉ định hay không.

  • Ví dụ thực tế: Ô dữ liệu của bạn là danh sách quyền hạn ["Nhân viên", "Kế toán", "Quản trị"]. Bạn dùng lệnh này để lọc xem danh sách đó có chứa chữ "Quản trị" hay không.

does not contain (Không chứa phần tử): Lọc ra những hàng mà bên trong danh sách hoàn toàn không xuất hiện giá trị bạn điền. 

starts with (Bắt đầu bằng): Kiểm tra xem phần đầu của văn bản có bắt đầu bằng ký tự bạn muốn hay không. Ví dụ: Lọc danh sách số điện thoại bắt đầu bằng 09.

does not start with (Không bắt đầu bằng): Loại bỏ những hàng có phần đầu văn bản trùng với ký tự bạn chỉ định.

ends with (Kết thúc bằng): Kiểm tra xem phần đuôi của văn bản có kết thúc bằng ký tự bạn muốn hay không. Ví dụ: Kiểm tra file đính kèm có đuôi kết thúc là .pdf.

does not end with (Không kết thúc bằng): Ngược lại với lệnh trên, loại bỏ các hàng có đuôi văn bản trùng khớp.

matches regex (Khớp biểu thức chính quy): Dành cho người dùng nâng cao. Bạn có thể điền một chuỗi mã Regex để kiểm tra các cấu trúc văn bản phức tạp (ví dụ: kiểm tra tính hợp lệ chuẩn của một địa chỉ email hoặc định dạng căn cước công dân).

does not match regex (Không khớp biểu thức chính quy): Loại bỏ các hàng có dữ liệu trùng với cấu trúc mã Regex mà bạn thiết lập.

length equal to (Độ dài bằng): Đếm số lượng phần tử trong danh sách và kiểm tra xem có bằng chính xác số bạn đưa ra hay không. Ví dụ: Chỉ lọc ra các đơn hàng có đúng 3 sản phẩm đính kèm.

length not equal to (Độ dài khác): Lọc các hàng có số lượng phần tử trong danh sách khác với con số bạn chỉ định.

length greater than (Độ dài lớn hơn): Lọc ra các danh sách có số lượng phần tử nhiều hơn con số bạn điền. Ví dụ: Lọc khách hàng có số lượng tag sở thích lớn hơn 5 để gửi ưu đãi đặc biệt.

length less than (Độ dài nhỏ hơn): Lọc các danh sách có số lượng phần tử ít hơn con số bạn điền.

length greater than or equal to (Độ dài lớn hơn hoặc bằng): Số lượng phần tử trong danh sách phải từ mức bạn chỉ định trở lên.

length less than or equal to (Độ dài nhỏ hơn hoặc bằng): Số lượng phần tử trong danh sách phải từ mức bạn chỉ định trở xuống.

Tại mục Options, đảm bảo "Convert types where required" được đặt là true – điều này giúp tránh lỗi so sánh dữ liệu khi Google Sheets trả về kiểu dữ liệu không khớp hoàn toàn (ví dụ: số bị đọc thành chuỗi văn bản).

Vì sao điều kiện Status quan trọng nhất?

Đây chính là "cổng kiểm soát" của toàn bộ workflow – chỉ những dòng có Status đúng là Chờ gửi mới được đi tiếp đến bước gửi email. Nếu bạn đổi thủ công Status của một dòng thành Đã gửi hoặc bất kỳ giá trị khác, dòng đó sẽ tự động bị loại khỏi danh sách gửi ở lần chạy kế tiếp.

Nhấn "Execute step" để kiểm tra – output chỉ nên hiển thị những dòng có Status = "Chờ gửi", các dòng đã "Đã gửi" sẽ không xuất hiện.

Bước 7: Thiết lập node "Gửi Tin Nhắn (Gmail)"

Xem thêm bài: Hướng dẫn kết nối Gmail với n8n qua Google Cloud Console để biết cách kết nối Google Cloud Console nhé.

gửi email tự động từ Google Sheets

Nhấn đúp chuột vào node "Gửi tin nhắn (Gmail)".

7.1 – Kết nối Credential Gmail

Tại mục Credential, nhấn "Create New Credential" nếu chưa kết nối. Quy trình tương tự Google Sheets: đăng nhập Google → cấp quyền gửi email thay mặt bạn → nhấn Allow.

Nếu n8n báo lỗi quyền truy cập, vào Google Cloud Console → kiểm tra Gmail API đã được Enable (Bật) trong project OAuth của bạn chưa.

7.2 – Cấu hình Resource và Operation

Tham số Giá trị
Resource Message
Operation Send

7.3 – Điền nội dung email

Trường Giá trị Giải thích
To {{ $json.Email }} Lấy email khách hàng từ dữ liệu đã lọc
Subject {{ $json.Title }} Lấy tiêu đề email từ cột Title trong Sheet
Email Type Text Gửi email dạng văn bản thuần
Message Xin chào, đây là email test của Quantrimang.com Nội dung email
gửi email tự động

Tại mục Options, để "Append n8n Attribution" ở trạng thái tắt (off) – tránh n8n tự động chèn dòng quảng cáo "This email was sent automatically with n8n" vào cuối mỗi email gửi cho khách hàng thật.

Bước 8: Thiết lập node "Merge" – tại sao phải có node này?

Nhấn đúp chuột vào node "Merge".

gửi gmail tự động

Thiết lập:

Tham số Giá trị
Mode Choose Branch
Output Type Wait for Both Inputs to Arrive
Output Input 2 Data

Cách kết nối hai input vào Merge

Node Merge cần nhận 2 luồng dữ liệu đi vào, vì vậy bạn cần kéo 2 đường kết nối riêng biệt:

  • Input 1: Kéo từ output của node "Gửi tin nhắn (Gmail)" → nối vào cổng input đầu tiên của Merge
  • Input 2: Kéo từ output của node "Lọc trạng thái (Chờ gửi)" → nối vào cổng input thứ hai của Merge (lưu ý: cùng một output của node Filter sẽ được kéo ra 2 đường – một đến Gmail, một đến Merge)
hướng dẫn gửi gmail tự động

Tại sao thiết kế lại phức tạp như vậy?

Đây chính là điểm kỹ thuật khéo léo nhất của workflow:

Nếu cập nhật trạng thái ngay sau khi node Filter chạy xong (không qua Gmail), bạn sẽ cập nhật Status = "Đã gửi" trước khi biết email có gửi thành công hay không – nếu Gmail lỗi, dữ liệu trên Sheet vẫn báo sai là đã gửi.

Việc đặt "Wait for Both Inputs to Arrive" buộc node Merge phải chờ Gmail gửi xong (Input 1 đến) có dữ liệu từ Filter (Input 2 đến) thì mới được phép chạy tiếp. Tuy nhiên, dữ liệu thực tế được dùng để cập nhật Sheet ở bước sau là từ Input 2 (dữ liệu gốc từ Filter, có chứa row_number cần thiết để xác định đúng dòng cần update) – không lấy dữ liệu phản hồi từ Gmail.

Nói ngắn gọn: Merge đóng vai trò "rào chắn đồng bộ" – đảm bảo thứ tự đúng (gửi email xong mới cập nhật), trong khi vẫn giữ đúng dữ liệu cần thiết để thực hiện cập nhật.

Bước 9: Thiết lập node "Cập Nhật Trạng Thái"

n8n gửi email tự động

Nhấn đúp chuột vào node "Cập nhật Trạng thái".

Tham số Giá trị
Resource Sheet Within Document
Operation Update
Document Chọn đúng Google Sheet (giống Bước 5)
Sheet Chọn đúng tab (giống Bước 5)

Cấu hình cột để khớp đúng dòng cần cập nhật

cách gửi email tự động

Tại mục "Matching Columns", chọn row_number – đây là cột ẩn do n8n tự sinh ra để xác định chính xác dòng nào trên Google Sheets cần được cập nhật, tránh nhầm sang dòng khác.

 Bước quan trọng cần hoàn thiện: Thêm giá trị cập nhật cho Status

Đây là điểm bạn cần tự bổ sung để workflow hoạt động đúng và an toàn: trong phần "Columns to Send", ngoài row_number (dùng để khớp dòng), bạn cần bật thêm cột Status và gán giá trị:

Status = Đã gửi

🔴 Cảnh báo quan trọng: Nếu bỏ qua bước này, cột Status trên Google Sheets sẽ không bao giờ thay đổi từ "Chờ gửi" sang "Đã gửi". Vì node Schedule Trigger chạy lại mỗi 1 phút và node Filter vẫn tìm thấy dòng có Status = "Chờ gửi", email sẽ bị gửi lại liên tục mỗi phút cho cùng một khách hàng – đây là lỗi nghiêm trọng nhất có thể xảy ra với loại workflow này.

Cũng cần đảm bảo giá trị row_number được map bằng expression động {{ $json.row_number }} (lấy từ dữ liệu đầu vào thực tế) chứ không phải nhập một số cố định – số cố định chỉ nên xuất hiện khi bạn đang test thủ công từng bước.

Kiểm tra toàn bộ Workflow và kích hoạt

Sau khi hoàn tất cả 6 node, thực hiện kiểm tra cuối cùng:

  1. Nhấn nút "Execute workflow" ở dưới canvas để chạy thử toàn bộ luồng một lần
  2. Theo dõi từng node sáng lên màu xanh (✓) khi chạy thành công
  3. Mở Gmail (hộp thư đã gửi - Sent) để xác nhận email thực sự được gửi đi
  4. Mở lại Google Sheet, kiểm tra cột Status của dòng vừa gửi đã chuyển thành Đã gửi

Khi mọi thứ hoạt động đúng, nhấn vào công tắc Active ở góc trên bên phải màn hình workflow để kích hoạt chạy tự động theo lịch – từ giờ bạn không cần mở n8n thủ công nữa, hệ thống tự vận hành 24/7.

Các lỗi thường thấy khi thiết lập Workflows này

Lỗi "No output data" ở node Filter: Thường do tên cột trong Google Sheets không khớp chính xác (phân biệt hoa/thường, dư khoảng trắng) với biểu thức {{ $json.Status }} trong điều kiện. Kiểm tra lại chính xác tên cột trên Sheet.

Email gửi đi nhưng Subject hoặc nội dung bị trống: Kiểm tra lại cột Title trên Google Sheets có dữ liệu hay không – nếu để trống, biểu thức {{ $json.Title }} sẽ trả về rỗng.

Gmail báo lỗi "insufficient permission": Vào Google Cloud Console, kiểm tra phạm vi quyền (scope) gmail.send đã được cấp trong màn hình OAuth Consent. Cần kết nối lại Credential trong n8n sau khi cập nhật quyền.

Email bị gửi lặp lại nhiều lần: Như đã phân tích ở Bước 9, nguyên nhân hầu hết do node Update chưa được cấu hình để ghi giá trị Đã gửi vào cột Status.

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

Workflow này có thể gửi email cho hàng trăm khách hàng cùng lúc không?

Có thể, nhưng Gmail giới hạn khoảng 500 email/ngày với tài khoản Google cá nhân thông thường (Google Workspace cho phép giới hạn cao hơn). Với số lượng lớn, nên dùng node "Split in Batches" để chia nhỏ và giãn cách thời gian gửi, tránh bị Gmail tạm khóa do gửi quá nhanh.

Có thể thay Gmail bằng dịch vụ email khác không?

Hoàn toàn được. n8n hỗ trợ sẵn các node như SMTP, SendGrid, Mailgun – chỉ cần thay thế node Gmail bằng node tương ứng và giữ nguyên cấu trúc luồng dữ liệu phía trước và sau nó.

Vì sao cần đến 2 điều kiện "Date exists" trùng nhau trong node Filter?

Đây là điều dư thừa không ảnh hưởng đến kết quả lọc (cùng kiểm tra một điều kiện hai lần), có thể giữ nguyên để không ảnh hưởng workflow, hoặc xóa một điều kiện trùng để sơ đồ gọn hơn – kết quả lọc không thay đổi.

n8n bản miễn phí có giới hạn số lần chạy workflow không?

n8n self-hosted (tự host) không giới hạn số lần thực thi. n8n Cloud có giới hạn theo gói cước, dựa trên số lượt thực thi (executions) mỗi tháng – nên kiểm tra gói đang dùng nếu thiết lập trigger chạy mỗi 1 phút liên tục.

Workflow gửi Gmail tự động từ danh sách trên Google Sheet
Định dạng: .Zip Dung lượng: 2,4 KB Lượt tải: 0-100 lượt
31 👨 73
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo