Ghi mỗi lead thành một dòng Google Sheet

Lưu trước, báo sau. Bài này thêm Google Sheet vào giữa luồng form về Telegram, kèm cách gộp số điện thoại viết kiểu 09, 849 hay +849 về một dạng.

Đăng 06/10/2026Đọc khoảng 9 phútWebhook → Google Sheets → Telegram

Ở bài 1, mỗi lần khách gửi form, Telegram báo về điện thoại. Chuông báo thì tốt, nhưng tin nhắn trôi rất nhanh. Sau một tuần, muốn biết hôm thứ Ba có bao nhiêu khách, đến từ trang nào, ai đã gọi, thì kéo tin nhắn không phải cách. Bài này thêm một chỗ lưu: mỗi lead là một dòng trong Google Sheet, ghi trước khi báo.

Tóm tắt nhanh

  • Luồng mới: Webhook → Google Sheets (ghi dòng) → Telegram (báo).
  • Chuẩn hoá số điện thoại về dạng 0xxxxxxxxx ngay trong biểu thức, để lọc trùng và tra cứu được.
  • Định dạng cột số điện thoại là văn bản, nếu không Sheet sẽ ăn mất số 0.
Webhook nhận lead, Google Sheets ghi một dòng, sau đó Telegram báo Webhooktừ bài 1 Google SheetsAppend Row Telegrambáo sau khi lưu
Chèn node Google Sheets vào giữa. Thứ tự lưu trước, báo sau là cố ý.

Bước 1: Chuẩn bị bảng tính

Tạo một file Google Sheet mới, đặt tên trang tính (tab) là lead, dòng 1 là tiêu đề cột. Gợi ý bộ cột tối thiểu:

CộtLấy từ đâuGhi chú
thoi_gianGiờ n8n nhận leadGhi theo giờ Việt Nam
ten$json.body.name
sdt$json.body.phone đã chuẩn hoáĐịnh dạng cột: Văn bản thuần
nhu_cau$json.body.noteCó thể rỗng
trang$json.body.pageBiết lead đến từ bài nào
trang_thaiĐể trốngNgười gọi tự điền: đã gọi, hẹn lại…

Chọn cả cột sdt, vào Định dạng → Số → Văn bản thuần. Bỏ qua bước này, số 0912… sẽ thành 912… và mọi phép lọc trùng sau đó đều sai.

Bước 2: Kết nối tài khoản Google với n8n

Thêm node Google Sheets sau Webhook. Ở ô Credential, tạo mới. Có hai đường:

Cấp quyền bằng một tài khoản Google dùng riêng cho việc vận hành thì tốt hơn tài khoản cá nhân của chủ doanh nghiệp: người nghỉ việc không kéo theo luồng chết.

Bước 3: Ghi dòng và ánh xạ cột

Trong node Google Sheets chọn thao tác thêm dòng (Operation: Append Row), chọn file và trang tính lead. Ở phần ánh xạ cột, chọn chế độ điền tay từng cột (Map Each Column Manually). n8n đọc dòng tiêu đề và hiện sẵn ô cho từng cột. Điền biểu thức:

thoi_gian  {{ $now.setZone('Asia/Ho_Chi_Minh').toFormat('yyyy-LL-dd HH:mm:ss') }}
ten        {{ $json.body.name }}
sdt        {{ String($json.body.phone || '').replace(/\D/g, '').replace(/^84/, '0').replace(/^(?!0)/, '0') }}
nhu_cau    {{ $json.body.note || '' }}
trang      {{ $json.body.page }}

Dòng sdt làm ba việc: bỏ hết ký tự không phải số (khoảng trắng, dấu chấm, dấu cộng), đổi đầu 84 thành 0, và thêm số 0 nếu khách gõ thiếu. Nhờ vậy +84 912 345 678, 84912345678 và 0912.345.678 đều về cùng một dạng. Đây là chuẩn hoá cơ bản, không phải kiểm tra số thật; muốn chặn số rác như 0123456789, cần thêm bước kiểm đầu số di động Việt Nam.

Ghi thời gian theo định dạng yyyy-LL-dd (năm-tháng-ngày) giúp sắp xếp và lọc theo ngày dễ hơn kiểu ngày/tháng/năm. Bài báo cáo cuối ngày sẽ dựa vào cột này.

Bước 4: Nối lại Telegram sau khi lưu

Kéo node Telegram từ bài 1 ra sau node Google Sheets. Có một thay đổi quan trọng: sau node Google Sheets, $json là dữ liệu của dòng vừa ghi, không còn là dữ liệu Webhook. Hai cách lấy dữ liệu đúng:

// Cách 1: lấy từ dòng vừa ghi (đã chuẩn hoá số)
SĐT: {{ $json.sdt }}

// Cách 2: gọi thẳng node Webhook theo tên
Tên: {{ $('Webhook').item.json.body.name }}

Cách 2 an toàn hơn khi luồng có nhiều nhánh, vì nó không phụ thuộc node đứng ngay trước là gì.

Bước 5 (tuỳ chọn): Chặn lead trùng

Khách hay bấm gửi hai lần, hoặc quay lại hôm sau điền tiếp. Hai cách xử lý, từ đơn giản đến kỹ:

  1. Ghi đè theo số điện thoại. Đổi thao tác sang Append or Update Row, chọn sdt làm cột để so khớp. Số đã có thì cập nhật dòng cũ, chưa có thì thêm dòng mới. Nhược điểm: mất dấu vết lần gửi trước.
  2. Tra trước, quyết sau. Thêm node Google Sheets đọc dòng (Get Row(s)) có lọc theo sdt, rồi node If: có kết quả thì đi nhánh “khách cũ” (báo Telegram kèm chữ quay lại), không có thì đi nhánh ghi dòng mới. Giữ được lịch sử, đội sale biết khách đã quay lại.

Khi dùng cách 2, nhớ bật tuỳ chọn luôn trả dữ liệu ra (Always Output Data) ở node đọc dòng. Nếu không, khi không tìm thấy, node trả về rỗng và luồng dừng luôn ở đó, lead mới không được ghi.

Bẫy hay gặp

Bước tiếp theo: có Sheet rồi, cuối ngày đếm lead theo nguồn và gửi một bản tóm tắt về Telegram.

Đọc bài 3: Báo cáo lead cuối ngày tự gửi về Telegram

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

Dùng Google Sheet làm kho lead có đủ không?

Với lượng lead vài chục đến vài trăm mỗi ngày, Google Sheet đủ dùng và ai trong đội cũng mở được. Khi lead nhiều hơn hoặc cần phân quyền chặt, nên chuyển sang cơ sở dữ liệu hoặc phần mềm quản lý khách hàng, nhưng luồng n8n gần như giữ nguyên, chỉ thay node cuối.

Vì sao phải lưu Sheet trước rồi mới báo Telegram?

Nếu Telegram lỗi hoặc chậm, lead vẫn nằm trong Sheet. Làm ngược lại thì khi Telegram lỗi, luồng dừng giữa chừng và lead không được ghi ở đâu cả.

Số điện thoại bị mất số 0 đầu trong Sheet thì sửa thế nào?

Google Sheet tự hiểu chuỗi toàn chữ số là số và bỏ số 0 đầu. Định dạng cột số điện thoại thành Văn bản thuần (Plain text) trước khi ghi, hoặc thêm dấu nháy đơn phía trước giá trị.

Có chặn được một khách gửi form hai lần không?

Có. Trước khi ghi, đọc Sheet tìm số điện thoại đã chuẩn hoá. Nếu đã có trong vài giờ gần đây thì bỏ qua hoặc chỉ cập nhật dòng cũ. Node Google Sheets có thao tác Append or Update dựa trên một cột khoá, dùng cột số điện thoại làm khoá.

Đọc tiếp