Docs

Configuration

Configure your Analytics Server.

Manage servers in your Project's Analytics > Settings. Only Project owners can change them.

Projects

A saved server connects a Chunkify Project to one analytics project. Its credentials select the analytics project automatically; browser events do not need a project ID.

Hosted setup provisions the analytics project for you. For a self-hosted server, use public and read-only keys from the same analytics project.

To create another analytics project on a self-hosted server, run from the Docker Compose stack directory:

docker compose exec analytics \
  chunkify-analytics project create "Production website"
docker compose exec analytics \
  chunkify-analytics project list

Creation returns a generated project_id, public_key, and full-access secret_key. Save the keys privately when returned. Use that project ID when creating its read-only API or MCP keys.

Select a saved server when opening reports. Default for dashboard players independently selects where Chunkify previews, the playground, and newly generated player snippets send events.

Changing that default does not update players already deployed on your website.

Credentials

Key Where it belongs Access
Public Player key, ck_public_… Playback tracker in the browser Sends events to one analytics project.
Read-only API key, ck_secret_… Your application backend Reads analytics and creates CSV export links.
MCP key, ck_secret_… Your private MCP client configuration Reads analytics through MCP, separately managed from the API key.
Full-access secret key Self-hosted administration backend or secret manager Reads analytics and manages the analytics project's settings and keys.

In hosted settings, use the Keys tab for the Player and read-only API keys. Use the MCP tab for a separate MCP key and its endpoint. New private keys are shown once; save them before closing the dialog.

Rotation invalidates the previous key immediately. Update the clients that use it. Private keys never belong in player code.

For self-hosted servers, create and rotate keys on your server. The read-only key saved in Chunkify lets the dashboard query reports. It does not grant project or key management access.

Analytics keys are separate from Chunkify access tokens. The main Chunkify SDK manages saved analytics connections through the connection API.

Browser access

For hosted analytics, edit Allowed origins in the server's configuration. Chunkify dashboard origins are always allowed. Add every website origin from which you send events.

For self-hosted analytics, edit the existing section in config.toml:

[server]
allowed_origins = ["https://app.example.com", "http://localhost:3000", "https://chunkify.dev"]

Include the scheme and any port. Do not include paths, trailing slashes, or wildcards. localhost and 127.0.0.1 are different origins. A self-hosted project's additional origins extend the installation's shared list.

An empty combined allowlist denies browser requests carrying an Origin header.

Only POST /v1/events enables ingestion CORS. The server handles JSON and X-Chunkify-Ingest-Key preflight requests. Analytics reads belong on your backend, where the private key stays secret.

Configure your HTTPS proxy to forward the API and its OPTIONS requests without replacing the server's CORS responses. The tracker needs the full public ingestion URL, such as https://analytics.example.com/v1/events.

The public key authorizes event submission. Origin checks restrict browser access; they do not identify a viewer or authenticate the submitted measurements.

Browser and page context

The Chunkify adapter adds browser_context, including browser, OS, device, language, screen dimensions, and the current document's page_origin and page_path.

Page context excludes query parameters and fragments. In an iframe it describes the iframe document. Paths can still contain application identifiers; use collectBrowserContext: false to omit context for that destination.

Page context follows client-side navigation on subsequent events. A retry keeps the context serialized for the original event.

Location

The server derives approximate continent, country, and city from a local geolocation database. The lookup discards request IP addresses after use. Missing or private-address locations appear as null.

For self-hosting behind a proxy, configure the trusted proxy addresses or CIDRs in the existing [server] section:

trusted_proxies = ["10.20.1.2", "2001:db8:abcd::/48"]

The proxy must supply the real client address through X-Forwarded-For. Only trust proxy hops you control. Missing or invalid forwarded data can make location unavailable.

Pages displaying or using the bundled location results must include an IP Geolocation by DB-IP link. See the geolocation reference.

Self-hosted settings

Use config.toml for application settings. Environment variables cover the ClickHouse connection and secrets; in the Docker Compose stack, .env supplies the ClickHouse password. Run docker compose restart analytics after editing config.toml, or docker compose up -d after changing .env.

The Docker image reads /data/config.toml and sets CHUNKIFY_BIND=0.0.0.0:4174, which overrides server.bind.

TOML setting Purpose
server.allowed_origins Website origins permitted to send events.
server.public_url External base URL used for CSV download links behind a proxy.
server.trusted_proxies Proxy addresses trusted to provide client location context.
retention.seconds Default receipt-time retention; 2592000 is 30 days and 0 disables expiration.
retention.interval_seconds Interval between cleanup sweeps, in seconds.
rate_limits Shared project read budgets, concurrency, and export limits.
mcp.allowed_hosts Hostnames permitted to reach the MCP endpoint.
clickhouse.url, clickhouse.database ClickHouse connection. Put the password in CHUNKIFY_CLICKHOUSE_PASSWORD.
clickhouse.rollup_max_lag_seconds How long reports may lag stored events; 0 makes reports exact.
cache.report_ttl_seconds Report cache lifetime on each server, from 0 to 60 seconds; 0 disables it.

For remote MCP access, add your hostname to the existing section:

[mcp]
enabled = true
allowed_hosts = ["localhost", "127.0.0.1", "[::1]", "analytics.example.com"]

Use the configuration reference for the complete settings, defaults, and bounds.

Storage and event delivery

ClickHouse stores events, analytics projects, and key hashes. Analytics servers keep no data, so several servers can share one database behind a load balancer. Ingestion succeeds after ClickHouse stores the events.

A repeated event ID received within the deduplication window, seven days by default, keeps its first payload.

Summary, engagement, quality, time-series, and video reports read hourly rollups and can lag stored events by about a minute. Set rollup_max_lag_seconds = 0 under [clickhouse] for exact reports, which cost more under load.

See the storage reference for scaling, replication, and these settings.

Ingestion responses

Response Meaning
201 A new event was stored.
200 This event ID was already received within the deduplication window; the first payload is preserved.
400 The event is invalid. Send complete tracker events with the Chunkify adapter.
401 The public key is missing or invalid.
403 The website origin is not allowed for that analytics project.
413 The body or pending-write budget is exceeded.
415 The content type or encoding is unsupported.
429 An ingestion rate limit was reached.
503 The server is busy or unavailable. Inspect health and logs for a self-hosted server.

The Chunkify adapter sends individual JSON events. Use the OTLP adapter for external telemetry gateways. See delivery retries and limits.