Nitro hides the client side
Server logs tell you a route was rendered, not whether anyone read it, scrolled it, or gave up on it. Client-side tracking fills in everything the server never sees.
Analytics for Nuxt
See how visitors move through your Nuxt app — page views, custom events, session replay, and heatmaps — without wiring up a plugin for each one.
Why it matters
Server logs tell you a route was rendered, not whether anyone read it, scrolled it, or gave up on it. Client-side tracking fills in everything the server never sees.
After the first load, Nuxt swaps pages without a full request. Tools that only count document loads report one page view for an entire session.
A hydration mismatch breaks the page for the user but leaves the server response looking fine. Replay shows you the broken screen the visitor actually got.
Setup
Register the script in the app.head block of nuxt.config.ts. It applies to every route, in SSR and SSG alike.
nuxt.config.ts
// nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
script: [
{
src: 'https://pulsepanda.dev/sdk.js',
'data-project': 'YOUR_PROJECT_ID',
defer: true
}
]
}
}
})Nuxt navigates with the History API, so route changes are picked up automatically — you do not need a router hook to record page views.
Workflow
Add the script once to nuxt.config.ts and every route in your app is covered.
Call pulsepanda.track() on key actions and pulsepanda.identify() after login to connect events, sessions, and feedback to each user.
Build funnels, watch the replays behind drop-offs, read heatmaps, and collect in-product feedback — all in one workspace.
What you get
| Analytics layer | Page views, custom events, conversion funnels, and retention. |
|---|---|
| Behavior layer | Session replay, click and scroll heatmaps, and error context. |
| Feedback layer | In-product surveys, feedback widgets, forms, and a feature voting board. |
FAQ
Yes. The snippet is client-side only, so it runs after hydration regardless of whether the page was server-rendered, statically generated, or both.
No. The app.head entry is enough for page views and replay. Add a plugin only if you want to call track() from composables in one place.
The tag is deferred, so it loads after your app is interactive and does not block rendering or the first paint.
Related pages
Install once and connect analytics, session replay, heatmaps, funnels, and feedback in minutes.
Start for free