Mục lục bài viết
Workflow này hoạt động như thế nào?
Workflow n8n này sẽ giúp bạn không bỏ lỡ bất kỳ liên hệ nào từ khách hàng. Mỗi khi có người submit Google Form, hệ thống tự động đọc dữ liệu từ Google Sheets, gửi email thông báo HTML đến admin và tin nhắn Telegram đồng thời, sau đó ghi nhận trạng thái "Đã thông báo" vào sheet để đảm bảo không gửi trùng lặp ở các lần chạy tiếp theo.
Đối tượng: Phù hợp cho các website, fanpage, hoặc doanh nghiệp nhỏ cần tiếp nhận liên hệ khách hàng một cách tự động mà không cần lập trình.
Hoạt động: Khi khách hàng gửi liên hệ qua Google Form, dữ liệu vào Google Sheet và hệ thống tự động gửi thông báo đến Gmail/Telegram ngay sau đó.
Tổng quan kiến trúc

Cơ chế hoạt động
- Mỗi phút workflow chạy một lần, đọc các dòng trong sheet có cột
Trạng tháiđang trống (= chưa xử lý) - Chuẩn hóa dữ liệu qua 2 node Set nối tiếp (tránh lỗi tham chiếu biến trong cùng node)
- Gửi thông báo song song đến Gmail và Telegram
- Hễ một trong hai gửi xong là cập nhật ngay cột
Trạng tháithành Đã thông báo
Lần chạy tiếp theo sẽ bỏ qua những dòng đã có trạng thái → không gửi lặp
Hướng dẫn thiết lập ban đầu trước khi triển khai
Yêu cầu chuẩn bị
Trước khi bắt đầu, hãy chuẩn bị sẵn:
- Tài khoản n8n (self-hosted hoặc cloud)
- Google Form đã tạo và có Google Sheet liên kết nhận responses
- Cột Trạng thái đã có trong Google Sheet (thêm thủ công nếu chưa có)
- Credential Google Sheets OAuth2 đã kết nối trong n8n
- Credential Gmail OAuth2 đã kết nối trong n8n
- Credential Telegram Bot API đã kết nối trong n8n
Chuẩn bị Google Sheet
Google Form khi nhận response sẽ tự tạo sheet với các cột tương ứng với từng câu hỏi. Bạn cần thêm thủ công một cột tên Trạng thái vào sheet đó.
- Mở Google Sheet liên kết với form
- Click vào dòng 1 của cột trống cuối cùng (hoặc insert thêm cột mới)
- Đặt tên header là: Trạng thái
- Để trống toàn bộ các dòng dữ liệu bên dưới — đây là điều kiện để workflow nhận ra "chưa xử lý"
Cột Trạng thái không cần có trong Google Form, chỉ cần có trong Sheet là đủ.
Kết nối Credential
Bước này có thể bỏ qua nếu đã kết nối sẵn sàng hết rồi:
- Credential Google Sheets OAuth2: 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.
- Credential Gmail OAuth2: Xem thêm bài: Hướng dẫn kết nối Gmail với n8n qua Google Cloud Console.
- Credential Telegram Bot API: Xem thêm bài: Hướng dẫn cách tạo Bot Telegram và kết nối với n8n nhanh nhất
Hướng dẫn triển khai cấu hình Workflow
1. Import workflow
- Tải file JSON workflow trong bài này về máy
- Trong n8n, vào Workflows → click nút ⋯ → chọn Import from file
- Chọn file JSON → workflow được tạo ở trạng thái Inactive
2. Cấu hình node Get row(s) in sheet
Mở node Get row(s) in sheet và kiểm tra / chỉnh các thông số:
| Trường | Cần chỉnh |
| Credential | Chọn Google Sheets credential đã kết nối |
| Document | Chọn lại đúng Google Sheet thu thập từ Form liên hệ của bạn |
| Sheet | Chọn đúng sheet chứa form responses |
| Filter → Column | Chọn cột Trạng thái, Value để trống |

3. Cấu hình node Map Raw Fields
Node này chuẩn hóa dữ liệu và giữ lại row_number để dùng cho bước Update sau. Mở node và kiểm tra tên cột khớp với header thực tế trong Google Sheet của bạn.
Mapping mặc định:
| Field trong workflow | Tên cột mặc định trong Sheet |
row_number |
(n8n tự sinh, không cần chỉnh) |
ho_ten |
Họ và tên |
email_khach |
|
so_dien_thoai |
Số điện thoại |
noi_dung |
Nội dung liên hệ |
timestamp |
Timestamp |
Cách kiểm tra tên cột: Mở Google Sheet → xem hàng đầu tiên (header row) → đối chiếu với bảng trên.
Nếu tên cột khác, sửa expression tương ứng trong node. Ví dụ nếu form dùng Tên của bạn thay vì Họ và tên:
# Thêm tên thực tế vào đầu expression
$json['Tên của bạn'] ?? $json['Họ và tên'] ?? '(không có)'

4. Kiểm tra node Build Messages
Node này nhận output từ node Map Raw Fields bên trên và dùng các field $json.ho_ten, $json.email_khach... để build nội dung thông báo. Không cần chỉnh gì thêm trừ khi muốn tuỳ chỉnh template mail.
Node có bật Include Other Fields = true để giữ lại toàn bộ field từ node trước (kể cả row_number) cho các node phía sau dùng tiếp.
Nếu muốn chỉnh nội dung thông báo, sửa tại đây:
email_body_html— nội dung email dạng HTML gửi cho admintelegram_text— tin nhắn Markdown gửi lên Telegram
5. Cấu hình node Send Gmail
Mở node Send Gmail và điền:
| Trường | Giá trị |
| Credential | Chọn Gmail OAuth2 đã kết nối |
| To | Sửa thành Email nhận thông báo (vd: quantrimang@congty.com) |
| Các trường khác | Không cần sửa |
Tiêu đề và nội dung HTML đã được tạo sẵn. Tính năng Reply-To tự động trỏ về email của khách, giúp admin reply thẳng trong email thông báo là trả lời được cho khách luôn.

6. Cấu hình node Send Telegram
Mở node Send Telegram và điền:
| Trường | Giá trị |
| Credential | Chọn Telegram API đã kết nối |
| Chat ID | ID của group/channel nhận thông báo |
Cách lấy Chat ID group nhanh:
- Thêm bot @userinfobot vào group → nó trả về Chat ID ngay (dạng -100xxxxxxxxxx)
- Hoặc forward tin nhắn từ channel vào @userinfobot để lấy ID channel
7. Cấu hình node Cập nhật Trạng thái → Đã thông báo
Mở node Cập nhật Trạng thái → Đã thông bá" và kiểm tra:
| Trường | Cần chỉnh |
| Credential | Chọn Google Sheets credential (giống node Get row(s)) |
| Document | Chọn lại đúng Google Sheet (giống node Get row(s)) |
| Sheet | Chọn đúng sheet (giống node Get row(s)) |
| Column to match on | Chọn row_number |
| row_number (using to match) | Nhập {{ $('Map Raw Fields').item.json.row_number }} |
| Trạng thái | Nhập giá trị Đã thông báo |
Node này dùng row_number - một n8n tự sinh khi đọc Google Sheets - để xác định chính xác dòng nào cần update. Không cần cột ID riêng trong sheet.

8. Test toàn bộ workflow
- Submit thử Google Form hoặc thêm thủ công một dòng vào Sheet (để trống cột Trạng thái)
- Trong n8n, mở workflow → click Execute workflow
- Quan sát từng node theo thứ tự:
| Node | Kết quả mong đợi |
| Get row(s) in sheet | Trả về dòng vừa thêm, có field row_number trong output |
| Map Raw Fields | Hiển thị đúng họ tên, email, SĐT, row_number |
| Send Gmail | Status Success -> kiểm tra hộp thư nhận được email |
| Send Telegram | Status Success -> kiểm tra Telegram nhận được tin |
| Cập nhật Trạng thái | Status Success |
- Mở Google Sheet kiểm tra dòng vừa test → cột
Trạng tháiphải hiện Đã thông báo - Chạy lại Execute workflow lần nữa → lần này node Get row(s) phải trả về 0 item (vì dòng đó đã có trạng thái)
9. Kích hoạt workflow
Sau khi test thành công:
- Click nút toggle góc trên bên phải: Inactive → Active
- Workflow tự chạy mỗi 1 phút một lần
Muốn đổi tần suất? Mở node "Poll mỗi 5 phút" → chỉnh field Interval. Tuy nhiên tôi khuyến nghị để 5 phút cho môi trường production để tránh gọi Google Sheets API quá nhiều.
Nội dung thông báo mẫu
| 📬 Có liên hệ mới từ Google Form | |
| ⏰ Thời gian | 24/06/2026 09:15:30 |
| 👤 Họ tên | Nguyễn Văn A |
| khach@email.com | |
| 📞 SĐT | 0901234567 |
| 💬 Nội dung | ... |
📬 *Liên hệ mới từ Google Form*
⏰ *Thời gian:* 24/06/2026 09:15:30
👤 *Họ tên:* Nguyễn Văn A
📧 *Email:* khach@email.com
📞 *SĐT:* 0901234567
💬 *Nội dung:* ...
Các lỗi thường gặp
Lỗi Get row(s) không trả về data
- Nguyên nhân: Cột Trạng thái chưa có trong sheet
- Cách xử lý: Thêm cột Trạng thái vào hàng header của sheet
Lỗi Get row(s) trả về 0 item dù form có submission mới
- Nguyên nhân: Cột Trạng thái đang có giá trị (kể cả dấu cách)
- Cách xử lý: Xóa trắng hoàn toàn các ô trong cột Trạng thái của dòng mới
Lỗi cột Trạng thái không được cập nhật
- Nguyên nhân:
row_numberbị mất do node Set không map - Cách xử lý: Kiểm tra node Map Form Fields có assignment
row_numberkhông
Lỗi Gmail lỗi 401/403
- Nguyên nhân: Credential hết hạn
- Cách xử lý: Reconnect Gmail credential trong n8n Settings
Lỗi Telegram không nhận được tin
- Nguyên nhân: Chat ID sai hoặc bot chưa join group
- Cách xử lý: Dùng @userinfobot để lấy lại Chat ID; kiểm tra bot đã được add vào group
Lỗi gửi lặp dù đã có Đã thông báo
- Nguyên nhân: Lỗi chính tả tên cột filter
- Cách xử lý: Đảm bảo tên cột filter trong
Get row(s)là Trạng thái (đúng dấu, đúng chính tả)
Các lỗi phát sinh khác: Bạn hãy gửi ảnh cho ChatGPT và hỏi cách xử lý trên từng lỗi cụ thể nhé!
Hướng dẫn AI
AI Tools
Học IT
AI
Hàm Excel