Stormkit's Analytics shows who visits your site, which pages they read, where they came from and how long they stay, without cookies or a consent banner. Analytics is an Enterprise feature.
Analytics is recorded for custom domains only. Set one up for your environment in Environment > Config > Other > Custom Domains, and page views are counted from then on.
An application often answers on more than one hostname for the same site — an
apex domain plus its www alias, or a staging hostname. Analytics are reported
per domain, so each of these shows up as its own entry in the domain picker and
in Team Insights, and keeps accumulating stored rows, even when you only ever
look at the production hostname.
To keep a domain out of analytics, visit your Environment > Config > Other > Custom Domains, open the domain's menu and select Exclude from analytics. The same menu offers Include in analytics to undo it.
An excluded domain is still served normally and its requests are still written to access logs — only page views and custom events are dropped. The change applies to requests served after the setting is saved; data collected before it is not removed.
Every HTML page Stormkit serves is counted server-side, so analytics work without any script and are not blocked by ad blockers. For each page view Stormkit records:
utm_source, utm_medium,
utm_campaign and refBots are detected from their user agent and left out.
No cookies or browser storage are used. A visitor is identified by a salted hash of their IP address and user agent that rotates every day; analytics never store the IP address itself. That keeps visitors anonymous, but the same person can't be recognized on two different days, so a multi-day visitor count is the sum of each day's unique visitors.
Raw page views are kept for 180 days (configurable with
STORMKIT_ANALYTICS_RETENTION_DAYS on self-hosted installs); the daily totals
the dashboard and API read from are kept indefinitely.
Server-side counting sees every full page load. Single-page apps change pages without one, so for those turn on Client-side tracking in the Events card of the environment's Analytics page. Stormkit then injects a small, same-origin script into your HTML that adds:
window.stormkit.track(), see below.The script sets no cookies either. If you add it yourself instead of using the toggle, include it in your HTML as a regular tag, not through a tag manager:
<script src="/_stormkit/analytics.js" async></script>
With client-side tracking on, record any action as an event:
window.stormkit.track("signup", { plan: "pro", ref: "pricing" });
The first argument is the event name; the optional second is a flat object of
properties stored with the event. Every property can be used to break an event
down in the dashboard, for example signup by plan.
For TypeScript, declare the global once:
declare global {
interface Window {
stormkit?: {
track(name: string, properties?: Record<string, string | number | boolean>): void;
};
}
}
export {};
Call it with optional chaining (window.stormkit?.track(...)) so code still
runs where the script isn't loaded, such as local development.
Events can also be sent from your server, for actions that never reach the browser:
curl -X POST https://www.example.org/_stormkit/collect \
-H 'Content-Type: application/json' \
-d '{"events":[{"name":"signup","metadata":{"plan":"pro"}}]}'
Limits:
Events are counted per day with the number of distinct visitors who sent them, and like page views are kept raw for 180 days.
The same numbers are available through the
Analytics API and the get_analytics
MCP tool, so an agent can answer questions like "how many
people read /blog/my-post this week, and where did they come from?" in one
call. The API also groups referrers into channels (search, AI, social, email,
referral, direct), lists landing pages, and compares a period with the one
before it.