Tác giả:
    Ngày tạo:2026-07-08Cập nhật lần cuối:2026-07-08

    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:

    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ể controlblack_friday). @intlayer/analytics khép kín quy trình này:

    1. 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ênkhô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)).
    2. Mỗi sự kiện content_exposure mang theo variant đã được hiển thị.
    3. useConversion() cho phép bạn quy một mục tiêu (ví dụ: "cta_click") cho biến thể đó.
    4. Đ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:

    bash
    npm install @intlayer/analytics

    Nế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:

    intlayer.config.ts
    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 khi clientId đượ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:

    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_view mỗ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): sampleRate cho 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ối try/catch — một ứng dụng không bao giờ cài đặt @intlayer/analytics sẽ 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/config bất cứ khi nào editor.clientId khô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 nayngườ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ị 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.

    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:

    analytics.ts
    import { createIntlayerCMS } from "@intlayer/api";import { analyticsEndpoint } from "@intlayer/api/analytics";const cms = createIntlayerCMS();const { data: audience } = await analyticsEndpoint(cms).getAudience(30);

    Các liên kết hữu ích