Analytics that actually understands your users.
Device journeys. Live event feed. UTM attribution. User identity linking. One npm package. No cookies. No config files.
18,412
Events today
24 live now
Active sessions
Features
Everything you need. Nothing you don't.
Built for developers who want deep insights without the complexity of enterprise analytics tools.
Device & location intelligence
Every visitor gets a persistent device ID from first page load. Browser, OS, screen, timezone, and GeoIP — no cookies, no login required.
Anonymous → real user, automatically
User browses anonymously then signs up? Call linkUser() and every pre-login event instantly attaches to their account. Zero data lost.
Auto-capture + custom events
Page views, clicks, scroll depth, and time spent tracked automatically. Add tracker.send() anywhere for custom events — batched with no performance hit.
Full session journeys
Every step a user took through your product, in chronological order. See exactly where they went, how long they stayed, and what they clicked.
Real-time live feed
Watch events stream in as they happen via WebSocket. See page views, clicks, and identifications the moment they occur — live.
UTM traffic attribution
First-touch UTM parameters per session — source, medium, campaign, term, content — surfaced in the Traffic dashboard so you know where users come from.
How it works
Up and running in minutes.
Three steps. No config files. No servers to manage.
Install & wrap your app
Install the npm package and wrap your layout with NohmoNextProvider. Page views, scroll depth, time spent, and clicks are tracked automatically.
npm install nohmo
// app/layout.tsximport { NohmoNextProvider } from 'nohmo'export default function RootLayout({ children }) {return (<html><body><NohmoNextProviderprojectId={process.env.NEXT_PUBLIC_NOHMO_PROJECT_ID}apiKey={process.env.NEXT_PUBLIC_NOHMO_API_KEY}>{children}</NohmoNextProvider></body></html>)}
Send custom events anywhere
Call send() with an event name and any data from any component. Events are queued and flushed every 3 seconds in a single batched request — no performance impact.
import { useNohmo } from 'nohmo'export default function BuyButton({ item }) {const { send } = useNohmo()return (<button onClick={() => send('purchase_started', {itemId: item.id,price: item.price,})}>Buy now</button>)}
Link users at login
When a user signs in, call linkUser() with their ID and email. All anonymous events from that device — including before signup — instantly attach to their account.
import { useNohmo } from 'nohmo'export default function LoginForm() {const { linkUser } = useNohmo()const handleLogin = async () => {const user = await loginAPI()// every event before this call links to the userawait linkUser(user.id, user.email)}}
A dashboard that shows you what happened.
Active devices, session journeys, event breakdowns, top pages. Everything in one place, per project.
Overview
Last 24 hoursActive Devices
2,847
↑ +3 last 5 min
Sessions Today
142
↑ +12% vs yesterday
Avg Session
4m 22s
↑ +38s vs yesterday
Events Today
184k
↓ -3% vs yesterday
Pricing
Pricing that doesn't punish growth.
Flat monthly plans. No per-event charges, no surprise bills as you scale.