Umami
Expert at deploying and managing Umami, a privacy-focused open-source web analytics platform.
Overview
- Self-hosted analytics — GDPR-compliant, no cookies, lightweight tracker (~2KB)
- API Client —
@umami/api-client TypeScript package for all API endpoints
- Node Client —
@umami/node for server-side event tracking
- Tracker — Client-side
umami.track() and umami.identify() functions
- Reports — Attribution, funnel, retention, journey, revenue, and UTM analysis
- Realtime — Live visitor data with 30-minute rolling window
CLI Tool (umami-cli)
A Rust CLI for managing self-hosted Umami instances from the terminal. Covers auth, websites, stats, events, sessions, reports, realtime, teams, users, admin, shares, links, and pixels.
Install globally
# From source (clone first)
cargo install --path .
# Or directly from GitHub
cargo install --git https://github.com/zot24/umami-cli.git
After install, umami-cli is available globally via ~/.cargo/bin/.
CLI subcommands
umami-cli auth # Login, logout, verify
umami-cli websites # Manage websites
umami-cli stats # View website statistics
umami-cli events # Manage and track events
umami-cli sessions # View session data
umami-cli reports # Run and manage reports
umami-cli realtime # View realtime analytics
umami-cli teams # Manage teams
umami-cli users # User management
umami-cli admin # Admin operations (self-hosted only)
umami-cli shares # Manage share pages
umami-cli links # Manage tracked links
umami-cli pixels # Manage tracking pixels
Quick Start
# Docker Compose (recommended for the Umami server)
git clone https://github.com/umami-software/umami.git
cd umami
docker-compose up -d
# Access at http://localhost:3000 (admin/umami)
// API Client
import { getClient } from '@umami/api-client';
const client = getClient();
const { ok, data } = await client.getWebsites();
Core Concepts
Authentication — Self-hosted uses POST /api/auth/login for bearer tokens. Cloud uses API keys. The API client handles auth via environment variables.
Tracking — Add <script src="/script.js" data-website-id="..."> to pages. Use umami.track() for pageviews and custom events, umami.identify() for session data.
API Client Config — Set UMAMI_API_CLIENT_USER_ID, UMAMI_API_CLIENT_SECRET, and UMAMI_API_CLIENT_ENDPOINT for self-hosted. Set UMAMI_API_KEY and UMAMI_API_CLIENT_ENDPOINT for Cloud.
Documentation Index
Setup & Configuration
- Installation — Docker, source, and cloud setup
- Environment Variables — Full configuration reference
- Authentication — Login, tokens, API keys
Client Libraries
- API Client —
@umami/api-client TypeScript client with all methods
- Node Client —
@umami/node server-side tracking
Tracking & Events
- Tracker Functions — Client-side
umami.track() and umami.identify()
- Event Taxonomy ��� Naming conventions, categories, central registry pattern
- Auto-Enrichment — Enhanced trackEvent with auto device/geo context
- Implementation Patterns — Forms, CTAs, sections, funnels, privacy, Next.js
- Sending Stats — Direct POST /api/send (no auth required)
Analytics & Optimization
- Funnel Design — B2C, B2B, SaaS, e-commerce, onboarding funnel templates with benchmarks
- Journey Analysis — User journey archetypes, geographic/language variations, multi-visit patterns
API Reference
- Websites API — Website CRUD operations
- Website Statistics — Metrics, pageviews, active users
- Events API — Event tracking and data retrieval
- Sessions API — Session data and activity
- Reports API — Attribution, funnel, retention, journey, revenue, UTM
- Realtime API — Live visitor data (30-min window)
- Teams & Users — Team, user, and me endpoints
- Admin API — Admin-only endpoints (self-hosted)
- Share API — Share page management
- Links & Pixels — URL shortening and tracking pixels
Common Workflows
Get website stats for last 7 days
const client = getClient();
const now = Date.now();
const weekAgo = now - 7 * 24 * 60 * 60 * 1000;
const { data } = await client.getWebsiteStats('website-id', {
startAt: weekAgo, endAt: now
});
Track custom event from server
import umami from '@umami/node';
umami.init({ websiteId: 'your-id', hostUrl: 'https://your-umami.com' });
umami.track({ url: '/api/checkout', name: 'purchase', data: { amount: 99 } });
Create a funnel report
const { data } = await client.createReport({
websiteId: 'id', type: 'funnel',
parameters: { startDate: '...', endDate: '...', urls: ['/signup', '/onboard', '/activate'] }
});
Upstream Sources
Sync & Update
When user runs sync: fetch latest from upstream, update docs/.
When user runs diff: compare current vs upstream, report changes.
1---2name: umami3description: Deploy, configure, and manage Umami — open-source privacy-focused web analytics with API client, tracker functions, event tracking, website statistics, reports, and team management. Includes umami-cli Rust CLI tool for terminal-based management. Use when setting up web analytics, tracking pageviews, or working with Umami. Triggers on mentions of Umami, umami-cli, web analytics, pageviews, event tracking, privacy analytics, Google Analytics alternative.4---56# Umami78Expert at deploying and managing Umami, a privacy-focused open-source web analytics platform.910## Overview1112- **Self-hosted analytics** — GDPR-compliant, no cookies, lightweight tracker (~2KB)13- **API Client** — `@umami/api-client` TypeScript package for all API endpoints14- **Node Client** — `@umami/node` for server-side event tracking15- **Tracker** — Client-side `umami.track()` and `umami.identify()` functions16- **Reports** — Attribution, funnel, retention, journey, revenue, and UTM analysis17- **Realtime** — Live visitor data with 30-minute rolling window1819## CLI Tool (umami-cli)2021A Rust CLI for managing self-hosted Umami instances from the terminal. Covers auth, websites, stats, events, sessions, reports, realtime, teams, users, admin, shares, links, and pixels.2223- **GitHub**: https://github.com/zot24/umami-cli24- **Language**: Rust (requires `cargo`)2526### Install globally2728```bash29# From source (clone first)30cargo install --path .3132# Or directly from GitHub33cargo install --git https://github.com/zot24/umami-cli.git34```3536After install, `umami-cli` is available globally via `~/.cargo/bin/`.3738### CLI subcommands3940```41umami-cli auth # Login, logout, verify42umami-cli websites # Manage websites43umami-cli stats # View website statistics44umami-cli events # Manage and track events45umami-cli sessions # View session data46umami-cli reports # Run and manage reports47umami-cli realtime # View realtime analytics48umami-cli teams # Manage teams49umami-cli users # User management50umami-cli admin # Admin operations (self-hosted only)51umami-cli shares # Manage share pages52umami-cli links # Manage tracked links53umami-cli pixels # Manage tracking pixels54```5556## Quick Start5758```bash59# Docker Compose (recommended for the Umami server)60git clone https://github.com/umami-software/umami.git61cd umami62docker-compose up -d63# Access at http://localhost:3000 (admin/umami)64```6566```typescript67// API Client68import { getClient } from '@umami/api-client';69const client = getClient();70const { ok, data } = await client.getWebsites();71```7273## Core Concepts7475**Authentication** — Self-hosted uses `POST /api/auth/login` for bearer tokens. Cloud uses API keys. The API client handles auth via environment variables.7677**Tracking** — Add `<script src="/script.js" data-website-id="...">` to pages. Use `umami.track()` for pageviews and custom events, `umami.identify()` for session data.7879**API Client Config** — Set `UMAMI_API_CLIENT_USER_ID`, `UMAMI_API_CLIENT_SECRET`, and `UMAMI_API_CLIENT_ENDPOINT` for self-hosted. Set `UMAMI_API_KEY` and `UMAMI_API_CLIENT_ENDPOINT` for Cloud.8081## Documentation Index8283### Setup & Configuration84- **[Installation](docs/installation.md)** — Docker, source, and cloud setup85- **[Environment Variables](docs/environment-variables.md)** — Full configuration reference86- **[Authentication](docs/authentication.md)** — Login, tokens, API keys8788### Client Libraries89- **[API Client](docs/api-client.md)** — `@umami/api-client` TypeScript client with all methods90- **[Node Client](docs/node-client.md)** — `@umami/node` server-side tracking9192### Tracking & Events93- **[Tracker Functions](docs/tracker-functions.md)** — Client-side `umami.track()` and `umami.identify()`94- **[Event Taxonomy](docs/event-taxonomy.md)** ��� Naming conventions, categories, central registry pattern95- **[Auto-Enrichment](docs/auto-enrichment.md)** — Enhanced trackEvent with auto device/geo context96- **[Implementation Patterns](docs/implementation-patterns.md)** — Forms, CTAs, sections, funnels, privacy, Next.js97- **[Sending Stats](docs/sending-stats.md)** — Direct POST /api/send (no auth required)9899### Analytics & Optimization100- **[Funnel Design](docs/funnel-design.md)** — B2C, B2B, SaaS, e-commerce, onboarding funnel templates with benchmarks101- **[Journey Analysis](docs/journey-analysis.md)** — User journey archetypes, geographic/language variations, multi-visit patterns102103### API Reference104- **[Websites API](docs/websites-api.md)** — Website CRUD operations105- **[Website Statistics](docs/website-stats.md)** — Metrics, pageviews, active users106- **[Events API](docs/events-api.md)** — Event tracking and data retrieval107- **[Sessions API](docs/sessions-api.md)** — Session data and activity108- **[Reports API](docs/reports-api.md)** — Attribution, funnel, retention, journey, revenue, UTM109- **[Realtime API](docs/realtime-api.md)** — Live visitor data (30-min window)110- **[Teams & Users](docs/teams-users-api.md)** — Team, user, and me endpoints111- **[Admin API](docs/admin-api.md)** — Admin-only endpoints (self-hosted)112- **[Share API](docs/share-api.md)** — Share page management113- **[Links & Pixels](docs/links-pixels-api.md)** — URL shortening and tracking pixels114115## Common Workflows116117### Get website stats for last 7 days118```typescript119const client = getClient();120const now = Date.now();121const weekAgo = now - 7 * 24 * 60 * 60 * 1000;122const { data } = await client.getWebsiteStats('website-id', {123 startAt: weekAgo, endAt: now124});125```126127### Track custom event from server128```typescript129import umami from '@umami/node';130umami.init({ websiteId: 'your-id', hostUrl: 'https://your-umami.com' });131umami.track({ url: '/api/checkout', name: 'purchase', data: { amount: 99 } });132```133134### Create a funnel report135```typescript136const { data } = await client.createReport({137 websiteId: 'id', type: 'funnel',138 parameters: { startDate: '...', endDate: '...', urls: ['/signup', '/onboard', '/activate'] }139});140```141142## Upstream Sources143144- **Website**: https://umami.is145- **Documentation**: https://docs.umami.is146- **GitHub**: https://github.com/umami-software/umami147- **API Client**: https://www.npmjs.com/package/@umami/api-client148- **Node Client**: https://www.npmjs.com/package/@umami/node149150## Sync & Update151152When user runs `sync`: fetch latest from upstream, update docs/.153When user runs `diff`: compare current vs upstream, report changes.