Đặt câu hỏi và nhận tóm tắt tài liệu bằng cách tham chiếu trang này và nhà cung cấp AI bạn chọn
Lịch sử phiên bản
- "Init doc — gói @intlayer/analytics, theo dõi ở cấp độ provider/node, thử nghiệm A/B, dashboard"v9.0.08/7/2026
Nội dung của trang này đã được dịch bằng AI.
Xem phiên bản mới nhất của nội dung gốc bằng tiếng AnhIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Tài liệu Intlayer Analytics
@intlayer/analytics là một gói đồng hành tùy chọn cho bạn biết chính xác nội dung nào được hiển thị cho khách truy cập của bạn — trang nào, bằng ngôn ngữ (locale) nào và đoạn nội dung được dịch cụ thể nào — để bạn có thể hiểu rõ khán giả của mình và chạy thử nghiệm A/B trên nội dung.
Mục lục
Những gì nó theo dõi
@intlayer/analytics gom nhóm ba loại sự kiện ẩn danh thành các batch:
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Sự kiện | Bắt ở đâu | Cho bạn biết điều gì |
|---|---|---|
page_view | Cấp độ Provider (IntlayerProvider) | Trang và ngôn ngữ nào mà một phiên (session) đã xem, khi tải lần đầu, khi chuyển hướng (route change) hoặc chuyển ngôn ngữ. |
content_exposure | Cấp độ Node (useIntlayer / plugin trình biên dịch) | Khóa từ điển (dictionary key) / đường dẫn khóa nào thực sự được giải quyết và hiển thị — và nếu là một phần của thử nghiệm, thì đó là biến thể (variant) nào. |
conversion | Bất cứ nơi nào bạn gọi useConversion() | Một mục tiêu đạt được (đăng ký, nhấp chuột, mua hàng...) được quy cho (attributed) biến thể A/B mà phiên đó đã tiếp xúc. |
Các sự kiện được thu thập trong bộ nhớ và được gửi dưới dạng một yêu cầu batch duy nhất khoảng 20 giây một lần — không bao giờ gửi trên mỗi lần gõ phím hoặc mỗi lần render — do đó, analytics không bao giờ ảnh hưởng đến thời gian render đầu tiên hoặc thêm một yêu cầu cho mỗi tương tác.
Cách nó hỗ trợ thử nghiệm A/B trên nội dung
Intlayer đã cho phép bạn khai báo Biến thể (Variants) nội dung (ví dụ: từ điển hero-banner có biến thể control và black_friday). @intlayer/analytics khép kín quy trình này:
getVariant(experimentKey, variants)gán một cách tất định mỗi phiên ẩn danh cho một biến thể — đây là một hàm thuần túy (pure function) của session id và khóa thử nghiệm, vì vậy việc gán là ổn định trong toàn bộ phiên và không cần round-trip đến máy chủ trước lần render đầu tiên (không bị nhấp nháy (flicker), không thay đổi bố cục (layout shift)).- Mỗi sự kiện
content_exposuremang theovariantđã được hiển thị. useConversion()cho phép bạn quy một mục tiêu (ví dụ:"cta_click") cho biến thể đó.- Điểm cuối (endpoint) kết quả thử nghiệm trên dashboard sẽ so sánh tỷ lệ chuyển đổi trên mỗi biến thể, bao gồm cả ý nghĩa thống kê (kiểm định z).
Cài đặt
@intlayer/analytics là một dependency ngang hàng (peer), tùy chọn — không bao giờ được tự động cài đặt bởi một gói framework. Hãy thêm nó cùng với intlayer:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
npm install @intlayer/analyticsNếu bạn không cài đặt nó, mọi điểm tích hợp (integration point) sẽ được coi là một hành động trống (no-op) — xem phần Không tốn phí khi không được cài đặt bên dưới.
Cấu hình
Analytics sử dụng lại khối cấu hình editor hiện có — không có schema cấu hình analytics riêng biệt để điền vào:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
backendURL: "https://back.intlayer.org", // Cũng được sử dụng làm điểm cuối nhận dữ liệu (ingestion endpoint) cho analytics
clientId: "your-client-id", // Cũng được sử dụng làm khóa dự án analytics
clientSecret: "your-client-secret",
},
};
export default config;editor.backendURL— URL cơ sở mà các sự kiện analytics được gửi đến (POST {backendURL}/api/analytics/events).editor.clientId— khóa dự án công khai được gắn vào mọi sự kiện được thu nhận. Nó cũng đóng vai trò là công tắc bật (enable switch): analytics hoàn toàn bị vô hiệu hóa (và được loại bỏ bằng tree-shaking, xem bên dưới) cho đến khiclientIdđược định cấu hình.
Nếu bạn tự lưu trữ (self-host) Intlayer, analytics sẽ tự động trỏ đến phiên bản của riêng bạn vì nó dùng chung editor.backendURL.
Hỗ trợ Framework
Analytics được liên kết với IntlayerProvider dùng chung từ react-intlayer, vì vậy nó có sẵn ở bất kỳ đâu provider đó được sử dụng:
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Framework | Trạng thái |
|---|---|
| React | ✅ Có sẵn |
Next.js (next-intlayer) | ✅ Có sẵn (thông qua react-intlayer) |
React Native / Expo (react-native-intlayer) | ✅ Có sẵn (thông qua react-intlayer) |
| Vue, Svelte, Angular, Solid, Preact, Lit, Astro, Vanilla | 🚧 Đã lên kế hoạch — cùng một client, các ràng buộc cấp provider tuân theo mô hình @intlayer/editor |
Cách sử dụng
Tự động theo dõi ở cấp độ provider
Không cần thay đổi mã nguồn. Khi @intlayer/analytics đã được cài đặt và editor.clientId được cấu hình, IntlayerProvider sẽ tự động:
- khởi tạo analytics client khi mount,
- ghi lại một
page_viewở lần tải ban đầu, - ghi lại một
page_viewmỗi khi thay đổi ngôn ngữ, - bắt đầu vòng lặp flush ~20 giây và flush mọi sự kiện còn lại khi unmount / đóng tab (thông qua
navigator.sendBeacon, với fallback làfetch(..., { keepalive: true })).
Tự động theo dõi ở cấp độ node
Mỗi khi useIntlayer phân giải một phần nội dung để hiển thị, trình thông dịch sẽ báo cáo một sự kiện content_exposure cho chính xác dictionaryKey + đường dẫn khóa + ngôn ngữ đó — một lần nữa, không cần thay đổi mã. Các lần hiển thị lặp lại của cùng một node trong cùng một cửa sổ flush sẽ được gộp lại thành một sự kiện duy nhất với thuộc tính count, vì vậy một danh sách hiển thị lại (re-render) 50 lần sẽ không gửi 50 sự kiện.
Theo dõi chuyển đổi cho thử nghiệm A/B
Sử dụng useConversion() để quy một mục tiêu cho biến thể mà một phiên đã thấy:
Phân giải biến thể phía client (client-side)
Quyền riêng tư & Hiệu suất
- Ẩn danh theo thiết kế (Anonymous by design): các phiên được xác định bằng một id xoay vòng (rotating id); máy chủ (backend) chỉ lưu trữ mã băm SHA-256 của id đó — không bao giờ lưu trữ id thô và không bao giờ lưu trữ địa chỉ IP.
- Vị trí là tương đối: chỉ có mã quốc gia, bắt nguồn từ các tiêu đề vị trí địa lý của CDN (ví dụ:
cf-ipcountry,x-vercel-ip-country, ...) — không có IP nào được đọc hoặc lưu trữ. - URL loại trừ tham số tìm kiếm (search params) theo mặc định, do đó các chuỗi truy vấn (query strings) không bao giờ bị thu thập.
- Lấy mẫu (Sampling):
sampleRatecho phép bạn chỉ giữ lại một phần nhỏ các sự kiện hiển thị nội dung trên các ứng dụng có lưu lượng truy cập cao. - Xử lý theo batch: một yêu cầu được gửi sau khoảng 20 giây (
flushInterval), hoặc sớm hơn nếu bộ đệm bị đầy (maxBufferSize) — không bao giờ gửi một yêu cầu cho mỗi sự kiện.
Không tốn phí khi không được cài đặt
@intlayer/analytics tuân theo chính xác cùng một mô hình tùy chọn-dependency như @intlayer/editor:
- mọi điểm tích hợp đều tải gói này thông qua việc sử dụng dynamic
import()được bao bọc trong khốitry/catch— một ứng dụng không bao giờ cài đặt@intlayer/analyticssẽ không bao giờ bị tăng kích thước bundle hoặc chi phí thời gian chạy, và không bao giờ thấy lỗi; - một biến môi trường ở thời điểm biên dịch (
INTLAYER_ANALYTICS_ENABLED), được đặt tự động thành'false'bởi@intlayer/configbất cứ khi nàoeditor.clientIdkhông được định cấu hình, cho phép các bundler có thể loại bỏ mã thừa (dead-code-eliminate) toàn bộ tích hợp này; - analytics bị vô hiệu hóa bên trong iframe xem trước của trình chỉnh sửa / CMS Intlayer, do đó các phiên của trình chỉnh sửa không bao giờ được tính là lưu lượng truy cập thực.
Dashboard: Trang Analytics
Sau khi dự án của bạn đã thu thập các sự kiện, trang Analytics trong Intlayer dashboard (hiển thị ở thanh bên sau khi dự án được chọn) sẽ hiển thị:
- Người dùng đang hoạt động (Active users) — số lượng khách truy cập duy nhất trong khoảng thời gian cuộn (rolling window) đã chọn (7 / 30 / 90 ngày).
- Người dùng hôm nay và người dùng trong 7 ngày qua.
- Lượt xem trang (Page views) trong khoảng thời gian đã chọn.
- Một biểu đồ diễn biến (evolution graph) của số khách truy cập duy nhất hàng ngày.
- Các tab phân tích theo Ngôn ngữ (Locales) và Vị trí (Location), xếp hạng khán giả của bạn theo ngôn ngữ và quốc gia.
Tham khảo API Backend (Backend API reference)
Tất cả các điểm cuối (endpoint) để đọc đều yêu cầu xác thực; việc thu thập dữ liệu (ingestion) là công khai và được quy cho thông qua thuộc tính clientId trong phần body.
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Phương thức | Điểm cuối (Endpoint) | Mô tả |
|---|---|---|
POST | /api/analytics/events | Thu nhận một lô sự kiện (công khai, được gán bởi clientId trong body). |
GET | /api/analytics/overview | Tổng số trang / ngôn ngữ cho dự án đã được xác thực. |
GET | /api/analytics/audience?days=30 | Khách truy cập duy nhất, lượt xem trang, chuỗi ngày, phân tích theo ngôn ngữ + quốc gia. |
GET | /api/analytics/content-stats | Tổng số lượt hiển thị theo mỗi nội dung, được nhóm theo khóa từ điển / đường dẫn khóa / ngôn ngữ. |
GET | /api/analytics/experiments/:experimentKey | Tỷ lệ chuyển đổi cho mỗi biến thể và ý nghĩa thống kê cho một thử nghiệm A/B. |
Bạn cũng có thể gọi các API này theo chương trình thông qua CMS SDK:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { createIntlayerCMS } from "@intlayer/api";import { analyticsEndpoint } from "@intlayer/api/analytics";const cms = createIntlayerCMS();const { data: audience } = await analyticsEndpoint(cms).getAudience(30);