Bài hướng dẫn này giúp bạn tự động gửi báo cáo Google Analytics 4 (GA4) vào nhóm Telegram mỗi ngày bằng Google Apps Script. Cách làm này miễn phí, không cần thuê server và phù hợp để theo dõi nhanh các chỉ số website như người dùng, phiên truy cập, lượt xem trang, nguồn traffic và sự kiện quan trọng.
Kết quả sau khi hoàn thành:
Sau khi cài đặt xong, mỗi sáng Telegram sẽ tự nhận một báo cáo dạng như sau (xem ảnh phía dưới):

Chuẩn bị trước khi làm
Bạn cần có:
Một tài khoản Google có quyền truy cập GA4
Một tài sản GA4 đang thu thập dữ liệu
Một nhóm Telegram muốn nhận báo cáo
Bước 1: Tạo Telegram Bot
Mở Telegram và làm theo các bước sau:
Tìm bot @BotFather
Gửi lệnh: /newbot
Đặt tên cho bot
Đặt username cho bot
Sau khi tạo xong, BotFather sẽ gửi cho bạn Bot Token

Bot Token thường có dạng:
123456789:ABC-xyz...
Lưu lại token này để dùng ở bước cấu hình code.
- Tiếp theo, thêm bot vừa tạo vào nhóm Telegram (group) mà bạn muốn nhận báo cáo. Nếu bạn muốn thêm bot vừa tạo vào group thì chỉ cần ấn Add Memeber --> Tìm kiếm tên bot vừa tạo và ấn thêm

Bước 2: Lấy Chat ID của nhóm Telegram
Để gửi tin nhắn vào nhóm, bạn cần biết Chat ID của nhóm đó.
Cách làm:
Tìm kiếm @userinfobot trên Telegram
Ấn nút /Start
Ở góc dưới màn hình bạn sẽ thấy lựa chọn "Group". Hãy chọn Group bạn muốn lấy Chat ID và ấn gửi.
Sau khi gửi, Bot sẽ trả về thông tin nhóm, trong đó có Chat ID

Chat ID của nhóm thường là số âm, ví dụ: -1001234567890
Lưu lại Chat ID này để dùng trong code.
Bước 3: Lấy mã tài sản GA4 (Property ID)
Vào Google Analytics và làm theo các bước sau:
Mở Google Analytics
Chọn đúng tài khoản và tài sản GA4
Nhấn vào biểu tượng bánh răng cưa ở góc trái phía dưới màn hình để truy cập trang Admin
Điều hướng đến mục Cài đặt tài sản
Chọn Thông tin về tài sản
Sao chép Mã tài sản

Mã tài sản thường là dãy số gồm 9 chữ số, ví dụ: 520574179
Lưu ý: Không dùng mã đo lường dạng G-XXXXXXXX. Bạn cần dùng Property ID, tức mã tài sản dạng số.
Bước 4: Tạo Google Apps Script
Truy cập:
$$
script.google.com
$$
Sau đó:
Chọn Dự án mới (New project)

Đổi tên dự án, ví dụ: Báo cáo GA4 tự động
Ở thanh bên trái, tìm đến mục dịch vụ sau đó bấm dấu cộng để Thêm dịch vụ
Tìm Google Analytics Data API
Bấm Thêm

- Sau khi thêm xong, xoá toàn bộ code mẫu và dán đoạn code bên dưới.
Bước 5: Dán code đoạn code này vào Google App Script
// ===== CẤU HÌNH =====
const BOT_TOKEN = 'DIEN_BOT_TOKEN';
const CHAT_ID = 'DIEN_CHAT_ID';
const GA4_PROP = 'DIEN_PROPERTY_ID';
// ===== HÀM CHÍNH =====
function sendGA4Report() {
const yesterday = getYesterday();
const dateStr = formatDate();
const summary = runReport({
dateRanges: [{ startDate: yesterday, endDate: yesterday }],
metrics: [
{ name: 'activeUsers' },
{ name: 'sessions' },
{ name: 'screenPageViews' },
{ name: 'bounceRate' },
{ name: 'averageSessionDuration' }
]
});
const pages = runReport({
dateRanges: [{ startDate: yesterday, endDate: yesterday }],
dimensions: [{ name: 'pagePath' }],
metrics: [{ name: 'screenPageViews' }],
orderBys: [{ metric: { metricName: 'screenPageViews' }, desc: true }],
limit: 5
});
const sources = runReport({
dateRanges: [{ startDate: yesterday, endDate: yesterday }],
dimensions: [{ name: 'sessionDefaultChannelGroup' }],
metrics: [{ name: 'sessions' }],
orderBys: [{ metric: { metricName: 'sessions' }, desc: true }],
limit: 6
});
const events = runReport({
dateRanges: [{ startDate: yesterday, endDate: yesterday }],
dimensions: [{ name: 'eventName' }],
metrics: [{ name: 'eventCount' }],
dimensionFilter: {
filter: {
fieldName: 'eventName',
inListFilter: { values: ['xem_trang_gia', 'chon_goi_thanh_toan'] }
}
}
});
const v = summary.rows && summary.rows.length > 0
? summary.rows[0].metricValues
: null;
let msg = `📊 <b>Báo cáo GA4 — ${dateStr}</b>\n\n`;
if (!v) {
msg += `⚠️ Chưa có dữ liệu cho ngày hôm qua.`;
sendTelegram(msg);
return;
}
msg += `👥 Users: <b>${fmt(v[0].value)}</b>\n`;
msg += `🔁 Sessions: <b>${fmt(v[1].value)}</b>\n`;
msg += `📄 Pageviews: <b>${fmt(v[2].value)}</b>\n`;
msg += `📉 Bounce Rate: <b>${(parseFloat(v[3].value) * 100).toFixed(1)}%</b>\n`;
msg += `⏱ Thời gian TB: <b>${fmtDur(v[4].value)}</b>\n`;
msg += `\n🏆 <b>Top 5 trang:</b>\n`;
if (pages.rows && pages.rows.length > 0) {
pages.rows.forEach((row, i) => {
msg += `${i + 1}. <code>${truncate(row.dimensionValues[0].value, 30)}</code> — ${fmt(row.metricValues[0].value)}\n`;
});
} else {
msg += `• Chưa có dữ liệu\n`;
}
msg += `\n🌍 <b>Nguồn traffic:</b>\n`;
if (sources.rows && sources.rows.length > 0) {
sources.rows.forEach(row => {
msg += `• ${row.dimensionValues[0].value || 'Unknown'}: <b>${fmt(row.metricValues[0].value)}</b>\n`;
});
} else {
msg += `• Chưa có dữ liệu\n`;
}
const eventMap = {};
if (events.rows && events.rows.length > 0) {
events.rows.forEach(row => {
eventMap[row.dimensionValues[0].value] = fmt(row.metricValues[0].value);
});
}
msg += `\n🎯 <b>Sự kiện quan trọng:</b>\n`;
msg += `• xem_trang_gia: <b>${eventMap['xem_trang_gia'] || '0'}</b>\n`;
msg += `• chon_goi_thanh_toan: <b>${eventMap['chon_goi_thanh_toan'] || '0'}</b>\n`;
sendTelegram(msg);
}
// ===== HÀM TIỆN ÍCH =====
function runReport(body, retries) {
retries = retries || 3;
for (var i = 0; i < retries; i++) {
try {
const result = AnalyticsData.Properties.runReport(
body,
`properties/${GA4_PROP}`
);
if (result) return result;
} catch (e) {
if (i === retries - 1) throw e;
Utilities.sleep(2000);
}
}
}
function sendTelegram(text) {
UrlFetchApp.fetch(
`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`,
{
method: 'POST',
contentType: 'application/json',
payload: JSON.stringify({
chat_id: CHAT_ID,
text: text,
parse_mode: 'HTML'
})
}
);
}
function getYesterday() {
const d = new Date();
d.setDate(d.getDate() - 1);
return Utilities.formatDate(d, 'Asia/Ho_Chi_Minh', 'yyyy-MM-dd');
}
function formatDate() {
const d = new Date();
d.setDate(d.getDate() - 1);
return Utilities.formatDate(d, 'Asia/Ho_Chi_Minh', 'dd/MM/yyyy');
}
function fmt(val) {
return parseInt(val).toLocaleString();
}
function fmtDur(val) {
const secs = parseFloat(val);
return `${Math.floor(secs / 60)}p ${Math.round(secs % 60)}s`;
}
function truncate(str, max) {
return str.length > max ? str.substring(0, max) + '...' : str;
}

Bước 6: Điền thông tin cấu hình
Ở đầu file, thay 3 giá trị sau thành các thông tin bạn vừa tạo:
const BOT_TOKEN = 'DIEN_BOT_TOKEN';
const CHAT_ID = 'DIEN_CHAT_ID';
const GA4_PROP = 'DIEN_PROPERTY_ID';
Ví dụ:
const BOT_TOKEN = '123456789:ABC-xyz';
const CHAT_ID = '-1001234567890';
const GA4_PROP = '520574179';
Ngoài ra, trong code mẫu, báo cáo đang theo dõi 2 sự kiện:
'xem_trang_gia'
'chon_goi_thanh_toan'
Bạn có thể thay bằng sự kiện thực tế trong GA4 của mình. Để nhanh nhất, bạn có thể yêu cầu AI sửa code để phù hợp với sự kiện mong muốn, ví dụ prompt mẫu:
Sửa đoạn mã app script này sao cho phù hợp với sự kiện dưới đây của tôi (những thông tin khác không đổi):
'generate_lead'
'purchase'
'sign_up'
'contact_form_submit'
[Chèn đoạn code tại đây]
Bước 7: Chạy thử báo cáo
Trong Google Apps Script:
Bấm nút Chạy 2 lần
Lần thứ 2 chạy, Google sẽ yêu cầu cấp quyền
Chọn tài khoản Google
Chọn Advanced
Chọn Go to project
Bấm Allow
Sau khi cấp quyền xong, chạy lại 1 lần nữa
Nếu mọi thứ đúng, nhóm Telegram sẽ nhận được báo cáo GA4.
Bước 8: Cài lịch gửi tự động hằng ngày
Để báo cáo tự gửi mỗi ngày:
Trong Google Apps Script, chọn mục Kích hoạt ở góc bên trái màn hình
Bấm Thêm trình kích hoạt

- Cấu hình như sau:
| Mục | Giá trị |
| Hàm cần chạy | sendGA4Report |
| Nguồn sự kiện | Theo thời gian |
| Loại trình kích hoạt | Đồng hồ đếm ngày |
| Thời gian | 8 giờ sáng đến 9 giờ sáng |
Sau đó bấm Lưu.

Từ lúc này, báo cáo GA4 sẽ tự động gửi vào Telegram mỗi ngày vào lúc 8-9 giờ sáng.
Mẹo: Bạn hoàn toàn có thể tùy chỉnh thời gian gửi hằng ngày, hằng tuần theo ý muốn tại mục trình kích hoạt này.
Lỗi thường gặp và cách xử lý
| Lỗi | Nguyên nhân | Cách xử lý |
| AnalyticsData is not defined | Chưa thêm Google Analytics Data API | Vào Dịch vụ, thêm Google Analytics Data API |
| Không có dữ liệu | GA4 mới tạo hoặc hôm qua chưa có traffic | Chờ 24 đến 48 giờ hoặc thử đổi ngày test |
| 400 Bad Request từ Telegram | Nội dung tin nhắn có ký tự không hợp lệ | Dùng parse_mode: 'HTML' như code mẫu |
| 401 Unauthorized từ Telegram | Sai Bot Token | Kiểm tra lại token từ @BotFather |
| Bot không gửi được vào group | Bot chưa được thêm vào group hoặc Chat ID sai | Thêm bot vào group và kiểm tra lại Chat ID |
| Sai số liệu GA4 | Dùng nhầm mã đo lường G-XXXXXXXX | Đổi sang Property ID dạng số |
Với Google Apps Script, Telegram Bot và GA4 Data API, bạn có thể tạo hệ thống báo cáo tự động đơn giản mà không cần server riêng. Sau khi cài đặt theo hướng dẫn trên, báo cáo sẽ tự động gửi vào nhóm Telegram mỗi ngày, giúp bạn theo dõi nhanh tình hình website mà không cần mở Google Analytics thủ công.