Thực hành n8n đa kênh · Bài 3

Bot Telegram báo cáo và nhận lệnh duyệt bằng n8n

Bài thực hành cho người đã có n8n chạy HTTPS: tạo bot, lấy Chat ID, gửi báo cáo mỗi sáng vào nhóm, gắn nút bấm để nhân viên nhận việc và cho quản lý duyệt ngay trong Telegram. Tên node và giới hạn đối chiếu tài liệu chính thức của n8n (bản 2.44.4) và Telegram ngày 20–21/10/2026.

Cập nhật 21/10/2026⏱ 10 phút đọcCài đặt & bắt đầuTrung cấp

Sáng nào cũng gom số liệu tay, duyệt việc qua tin nhắn lẫn lộn

Tám giờ sáng, trưởng nhóm kinh doanh đếm khách mới trong bảng tính, chụp màn hình gửi vào nhóm. Nhân viên trả lời "em nhận" lẫn giữa hàng chục tin khác; việc cần sếp duyệt nằm trong tin nhắn riêng, dễ trôi. (Tình huống minh hoạ.)

Bài này dựng bot Telegram bằng n8n làm ba việc: gửi báo cáo theo lịch, cho nhân viên bấm nút nhận khách, và dừng workflow chờ quản lý duyệt việc nhạy cảm.

Bot Telegram báo cáo bằng n8n gồm những gì?

Bot Telegram báo cáo bằng n8n là một bot do bạn tạo ở @BotFather, được n8n dùng để gửi tin vào nhóm nội bộ theo lịch hoặc theo sự kiện, gắn nút bấm để người nhận ra lệnh, và tạm dừng workflow cho tới khi người có quyền bấm duyệt.

  1. Schedule TriggerChạy lúc 7:30 sáng các ngày làm việc
  2. Google SheetsGet Row(s): lấy các dòng khách có trạng thái "mới"
  3. SummarizeĐếm thành một con số, gộp thành 1 item
  4. TelegramSend Message vào nhóm, kèm nút "Tôi nhận khách"
  5. Telegram TriggerNhận cú bấm nút (Callback Query) và lệnh /baocao
  6. Answer Query + cập nhật bảngTắt vòng chờ trên nút, ghi người nhận vào bảng
Luồng báo cáo và nhận lệnh (ví dụ minh hoạ)
Sơ đồ bot Telegram báo cáo bằng n8n: Schedule Trigger 7:30 sáng lấy dữ liệu từ Google Sheets, Summarize đếm khách mới, node Telegram gửi một tin báo cáo vào nhóm Sales kèm nút inline Tôi nhận khách; Telegram Trigger nhận Callback Query, Answer Query trả lời trong 200 ký tự và ghi người nhận vào bảng
Hình: Bot Telegram gửi báo cáo theo lịch và nhận lệnh từ nút bấm (minh hoạ)

Node Telegram gửi tin, trả lời nút bấm; Telegram Trigger nhận tin và cú bấm; cả hai dùng chung credential.

Nguồn: Telegram node · Telegram Trigger · Telegram credentials

Chuẩn bị

Mới dùng n8n thì làm trước workflow đầu tiên.

Nguồn: Telegram Trigger – HTTPS · Approve Within Chat – cổng · Schedule Trigger – múi giờ

Bước 1. Tạo bot và credential

  1. Mở Telegram, nhắn cho @BotFather lệnh /newbot.
  2. Đặt tên hiển thị, rồi đặt username: dài 5–32 ký tự, chỉ chữ Latin, số, dấu gạch dưới, phải kết thúc bằng "bot", và không đổi được về sau. Ví dụ congty_baocao_bot.
  3. BotFather trả về token. Cất ngay vào trình quản lý mật khẩu.
  4. Trong n8n, vào Credentials → tạo credential Telegram → dán token vào ô Access Token → lưu. Đây là nơi duy nhất trong n8n bạn dán token.
  5. Tạo thêm một bot chỉ để thử, với credential riêng (lý do ở mục giới hạn).
Telegram ghi rõ: ai có token là điều khiển được bot. Không gửi token qua chat, email, không dán vào node Code, ghi chú workflow hay ảnh chụp màn hình.

Nguồn: Telegram credentials – BotFather · Bot features – token

Bước 2. Đưa bot vào nhóm và lấy Chat ID

Theo Telegram, bot không thể tự mở cuộc trò chuyện: phải có người nhắn bot trước, hoặc thêm bot vào nhóm. Thêm bot vào nhóm Sales như một thành viên. Gửi vào kênh (channel) thì bot phải là quản trị viên của kênh.

  1. Tạo workflow tạm, thêm Telegram Trigger, Updates chọn Message, chọn credential vừa tạo.
  2. Bấm chạy thử, rồi nhắn một câu vào nhóm. Trong bảng OUTPUT, tìm số id trong phần chat: đó là Chat ID của nhóm (nhóm thường là số âm). Ở phần from là User ID của người vừa nhắn; ghi lại ID của quản lý để dùng ở Bước 4.
  3. Cách khác theo tài liệu n8n: đọc số trên địa chỉ Telegram bản web, hoặc mời @RawDataBot vào nhóm rồi xoá ngay.

Lưu ý privacy mode: mặc định bot trong nhóm chỉ thấy tin liên quan tới nó, như lệnh gọi đích danh /baocao@congty_baocao_bot. Cách này đủ cho bot báo cáo và giúp bot không đọc chuyện riêng của nhóm.

Nguồn: Telegram Bots – bot không tự mở chat · Telegram – Chat ID, thêm bot vào kênh · Privacy mode

Bước 3. Workflow gửi báo cáo theo lịch

  1. Thêm Schedule Trigger, Trigger Interval chọn Custom (Cron), nhập 30 7 * * 1-6 (7:30 sáng thứ Hai tới thứ Bảy). Trong Workflow Settings, đặt Timezone là Asia/Ho_Chi_Minh.
  2. Thêm Google Sheets, thao tác Get Row(s), chọn bảng khách, Filters: cột trang_thai bằng moi. Mặc định node chỉ trả dòng khớp đầu tiên, nên vào Options → When Filter Has Multiple Matches → Return All Matches.
  3. Thêm Summarize, Aggregation chọn Count, Field là ma_khach. Bước này quan trọng: Get Row(s) trả về mỗi dòng một item, và node Telegram chạy một lần cho mỗi item. Không gộp lại thì 15 khách sẽ thành 15 tin nhắn.
  4. Thêm Telegram, Resource Message, Operation Send Message, điền Chat ID nhóm, dán nội dung mẫu dưới đây vào ô Text.
  5. Ở Reply Markup chọn Inline Keyboard, Add Button: chữ trên nút "Tôi nhận khách", callback data nhan_khach.
  6. Trong Additional Fields, tắt Append n8n attribution để bỏ dòng "This message was sent automatically with n8n".
  7. Chạy thử, kiểm tra tin trong nhóm, rồi bấm Publish để lịch bắt đầu chạy.
Nội dung ô TextCopy rồi dán vào ô Text của node Telegram; thay phần trong <…>
<b>Báo cáo khách mới – {{ $now.toFormat('dd/MM/yyyy') }}</b>
Khách chưa liên hệ: {{ <trường đếm, kéo từ bảng INPUT của Summarize> }}
Mở bảng khách: <link Google Sheet nội bộ>
Bấm nút bên dưới khi đã nhận khách.

Tin chỉ báo con số và đường dẫn bảng nội bộ, không liệt kê số điện thoại khách: tin nhóm dễ bị chuyển tiếp, chụp màn hình. Một tin dài tối đa 4.096 ký tự; Parse Mode mặc định là HTML, nên dữ liệu có ký tự < có thể làm tin bị từ chối.

Ngày không có khách mới, workflow dừng ở Get Row(s); muốn vẫn nhận tin "0 khách", bật Always Output Data cho node đó.

Nguồn: Schedule Trigger – cron · Google Sheets – Get Row(s) · Summarize · Send Message, Reply Markup · Node settings

Bước 4. Bắt workflow chờ người duyệt

Việc đụng tới khách hoặc đăng nội dung công khai cần một bước duyệt ngay trước node thực hiện. Thao tác Send and Wait for Response của node Telegram gửi tin rồi tạm dừng workflow tới khi có người trả lời.

  1. Thêm Telegram, Operation Send and Wait for Response, Chat ID là nhóm hoặc chat riêng với quản lý.
  2. Response Type chọn Approval. Type of Approval chọn loại có cả nút duyệt và nút từ chối; nhãn mặc định là Approve, Decline, đổi được thành "Duyệt", "Từ chối".
  3. Bật Limit Wait Time, ví dụ 4 giờ.
  4. Bật Approve Within Chat để bấm ngay trong tin nhắn. Restrict Who Can Approve = User ID của quản lý (Bước 2); người khác bấm sẽ thấy báo không có quyền. After Decision chọn Show Outcome and Remove Buttons.
  5. Sau node duyệt, thêm If: chỉ "đã duyệt" mới đi tiếp tới node gửi; mọi trường hợp khác, kể cả hết giờ, đi nhánh dừng. Tài liệu n8n không ghi tên trường kết quả: chạy thử, bấm duyệt, mở panel OUTPUT của node, tìm trường đúng/sai (thường là approved, có thể nằm trong data) rồi kéo vào ô điều kiện, không gõ tay.
Nội dung ô MessageCopy rồi dán vào ô Message của node Send and Wait; thay phần trong <…>
Duyệt gửi tin chăm sóc cho {{ <số khách, kéo từ INPUT> }} khách?
Nội dung: {{ <trường nội dung tin, kéo từ INPUT> }}
Không duyệt trong 4 giờ thì workflow tự dừng, không gửi.
Minh hoạ duyệt bằng Telegram trong n8n: workflow tạm dừng ở node Send and Wait for Response, quản lý nhận tin có hai nút Duyệt và Từ chối, chỉ User ID được phép mới bấm được, hết giờ thì không gửi; kèm giới hạn Telegram 1 tin mỗi giây mỗi chat, 20 tin mỗi phút trong nhóm, callback data 1 đến 64 byte
Hình: Workflow chờ quản lý bấm duyệt ngay trong Telegram (minh hoạ)

Với Approve Within Chat, OUTPUT có User ID, username, tên người bấm để lưu dấu vết. Không có HTTPS công khai thì node dùng nút liên kết mở trình duyệt.

Nguồn: Send and Wait for Response – Approval, Approve Within Chat

Bước 5. Nhận lệnh từ nút bấm: Telegram Trigger và Answer Query

Nút "Tôi nhận khách" là nút inline: bấm vào không gửi tin vào nhóm mà gửi callback query về bot; Telegram hiện vòng chờ trên nút tới khi bot gọi answerCallbackQuery. Tạo workflow thứ hai:

  1. Telegram Trigger, Updates chọn Callback Query và Message. Options: Restrict to Chat IDs = Chat ID nhóm Sales, để người ngoài nhóm không ra lệnh được.
  2. Switch chia hai nhánh: cú bấm nút (callback_query.data bằng nhan_khach) và tin nhắn là lệnh /baocao@congty_baocao_bot.
  3. Nhánh nút bấm, việc đầu tiên: Telegram → Resource Callback → Answer Query. Query ID là {{ $json.callback_query.id }}; Additional Fields → Text "Đã ghi bạn nhận khách" (tối đa 200 ký tự).
  4. Tiếp theo: Google Sheets → Get Row(s) lấy các dòng trang_thai = moi (bật Return All Matches), rồi Google Sheets → Update Row với Column to Match On = ma_khach: ghi tên người bấm (trong callback_query.from) vào cột nguoi_nhan, đổi trang_thai sang da_nhan. Người bấm sau sẽ không còn dòng nào để nhận.
  5. Tuỳ chọn: Edit Message Text sửa tin báo cáo thành "Đã có người nhận".
  6. Nhánh lệnh /baocao: dùng Execute Sub-workflow gọi lại workflow báo cáo (thêm node Execute Sub-workflow Trigger vào workflow đó).

Tên trường callback_query.id, .data, .from theo cấu trúc Update của Telegram Bot API; tài liệu n8n không in sẵn dữ liệu ra của Telegram Trigger, nên bấm nút thử một lần, mở panel OUTPUT và kéo đúng trường vào các ô thay vì gõ tay. Callback data dài 1–64 byte: chỉ đặt mã ngắn, không chứa dữ liệu khách.

Nguồn: Callback – Answer Query · Telegram Trigger – events, restrict · Bot API – CallbackQuery, callback_data · Inline keyboards

Giới hạn cần biết: tốc độ gửi và một webhook mỗi bot

Giới hạnCon số / quy tắcCách xử lý trong n8n
Trong một cuộc trò chuyệnTránh quá khoảng 1 tin mỗi giây; vượt lâu sẽ bị lỗi 429Gộp nội dung thành một tin (Summarize)
Trong nhómKhông quá 20 tin mỗi phútGửi một tin tổng hợp thay vì từng dòng
Gửi cho nhiều ngườiKhoảng 30 tin mỗi giây; muốn hơn thì dùng Paid Broadcasts qua @BotFather (tính phí bằng Star)Loop Over Items, mỗi lô không quá 30 chat, thêm Wait vài giây giữa các lô
WebhookMỗi bot chỉ một webhook; chỉ cổng 443, 80, 88, 8443Bot thử riêng; hoặc Unpublish khi thử
Callback data1–64 byte mỗi nútChỉ đặt mã ngắn

URL thử và URL chạy thật của Telegram Trigger đè nhau, nên dùng bot thử riêng. Riêng Approve Within Chat, n8n tự dùng chung webhook với Telegram Trigger của cùng bot.

Nguồn: Bots FAQ – giới hạn gửi · Gửi hơn 30 tin mỗi giây · Một webhook mỗi bot · setWebhook – cổng · Approve Within Chat – chia sẻ webhook

Ở Aduca, Telegram dùng để báo Sale

Aduca đang vận hành chatbot tư vấn trên n8n ở Zalo OA, Messenger và website. Khi bot nhận ra khách nóng, n8n báo Sale qua Telegram để người thật vào tiếp. Nguyên tắc: Telegram là kênh nội bộ, tin báo vừa đủ để hành động, gửi gì cho khách vẫn do người quyết định. Xem thêm Chatbot n8n đọc kịch bản từ Second Brain.

Kiểm tra đã chạy đúng

Lỗi thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Forbidden: bot is not a participant of the channelBot chưa là quản trị viên của kênhThêm bot làm admin kênh
"An HTTPS URL must be provided for webhook"n8n chưa chạy HTTPS hoặc địa chỉ webhook vẫn là httpCấu hình TLS ở reverse proxy, đặt N8N_WEBHOOK_URL dạng https
Trigger cứ "đang nghe" mà không nhận gìReverse proxy chưa bật websocketBật hỗ trợ websocket ở proxy
Bản chạy thật ngừng nhận sau khi thửMột webhook mỗi bot, bản thử đè lênPublish lại; lần sau dùng bot thử riêng
Nút bấm quay vòng mãiThiếu bước Answer QueryThêm Answer Query ngay đầu nhánh nút bấm
Nhóm nhận hàng chục tin cùng lúcMỗi item một tinGộp bằng Summarize, hoặc bật Execute Once
Bot không phản hồi lệnh trong nhómPrivacy mode, lệnh không gọi đích danh botGõ /lenh@tên_bot

Khi workflow đã chạy thật, gắn một error workflow để được báo khi có lỗi: xem giám sát lỗi, sao lưu và quản lý phiên bản.

Nguồn: Telegram – common issues · Telegram Trigger – common issues · Execute Once

An toàn và chính sách

Nguồn: Bot token · Restrict to Chat/User IDs · n8n 3.0 breaking changes

Muốn được tư vấn cách áp dụng n8n cho quy trình của doanh nghiệp, bạn có thể đăng ký Tư vấn 1-1 hoặc Coaching 1-1; chi phí báo sau buổi tư vấn.

Đọc tiếp: Form website về bảng khách →

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

Bot Telegram có tự nhắn cho khách mới được không?

Không. Theo Telegram, bot không thể tự mở cuộc trò chuyện: người dùng phải nhắn cho bot trước hoặc thêm bot vào nhóm. Vì vậy bot Telegram hợp nhất cho việc nội bộ như báo cáo, báo khách mới, duyệt việc, chứ không dùng để chào khách lạ.

Nên dùng Send and Wait for Response hay tự làm nút bấm?

Cần duyệt hoặc từ chối một việc cụ thể thì dùng Send and Wait for Response với kiểu Approval: workflow tự dừng chờ, bấm xong tự chạy tiếp. Tự làm nút bằng Inline Keyboard và Telegram Trigger hợp với lệnh không gắn với một lượt chạy đang chờ, ví dụ nhân viên bấm nhận một khách.

Vì sao đang thử thì bot không nhận tin nữa?

Telegram chỉ cho mỗi bot một webhook, nên địa chỉ thử và địa chỉ chạy thật của Telegram Trigger đè lên nhau. Tài liệu n8n gợi ý tạm Unpublish workflow khi thử, hoặc tạo một bot riêng chỉ để thử.

Gửi nhiều tin cùng lúc có bị chặn không?

Có thể. Telegram khuyên trong một cuộc trò chuyện không gửi quá khoảng 1 tin mỗi giây, trong nhóm không quá 20 tin mỗi phút; vượt lâu sẽ nhận lỗi 429. Hãy gộp nội dung thành một tin hoặc chia lô bằng Loop Over Items kèm Wait.

Token bot nên cất ở đâu?

Chỉ dán token vào ô Access Token trong mục Credentials của n8n và lưu bản dự phòng trong trình quản lý mật khẩu. Telegram nói rõ ai có token là điều khiển được bot, nên không gửi token qua chat, không dán vào ghi chú workflow.

Tài liệu liên quan

Xem tất cả tài liệu hướng dẫn →

Bước tiếp theo

Đăng ký tư vấn 1:1

Chuyên gia Aduca cùng bạn xem quy trình hiện tại, chọn việc nên giao cho AI Agent trước và cách kiểm soát rủi ro.

Về AducaChuỗi bài do đội ngũ Aduca biên soạn từ kinh nghiệm đào tạo và triển khai AI Agent cho Marketing – Sales. Aduca Academy do Nguyễn Đức – Chủ tịch Aduca Group sáng lập; ông kinh doanh thương mại điện tử từ 2012, chạy quảng cáo Facebook từ 2014 và đào tạo từ 2016. Phần thực hành từng bước nằm trong các thư mục OpenClaw, Hermes Agent, Claude, ChatGPT và n8n, Second Brain.

Nguồn tham khảo

Lịch sử cập nhật

Miễn trừ trách nhiệm

Bài viết thuộc chuỗi kiến thức của Công ty Cổ phần Giáo dục Aduca, chia sẻ miễn phí cho mục đích học tập. Thông tin kỹ thuật đối chiếu với tài liệu chính thức của các dự án và nền tảng tại ngày cập nhật (có ghi nguồn); phần nhận định là quan điểm của Aduca. OpenClaw, Hermes Agent, Claude (thương hiệu của Anthropic), ChatGPT (thương hiệu của OpenAI), n8n (thương hiệu của n8n GmbH), các phần mềm chạy model và các model AI mở (Ollama, LM Studio, Qwen, Gemma, gpt-oss…), Obsidian, Notion, phương pháp Building a Second Brain (Tiago Forte) cùng các phần mềm, dịch vụ nêu trong bài thuộc về chủ sở hữu tương ứng, không thuộc Aduca; Aduca không phải đối tác chính thức của các công ty này. Tính năng, gói và giá có thể thay đổi bất cứ lúc nào – hãy kiểm tra trang chính thức trước khi mua. Kết quả áp dụng phụ thuộc quy trình, dữ liệu và con người của từng doanh nghiệp; bài viết không cam kết doanh thu hay hiệu quả cụ thể. © 2026 Aduca — được trích dẫn khi ghi rõ nguồn aduca.vn.