Server-side work leaves no client trail
Loaders and actions run where no analytics tag can see them. Tracking in the browser records what the person did, not just what the server was asked for.
Analytics for Remix
Remix moves work to the server, which is exactly why the browser side goes unmeasured. Add page views, events, replay, and heatmaps in one place.
Why it matters
Loaders and actions run where no analytics tag can see them. Tracking in the browser records what the person did, not just what the server was asked for.
A validation error returned from an action ends the journey quietly. Replay shows the field the user could not get past and the message they were shown.
Remix prefetches routes on hover, so server-log analytics count pages nobody opened. Client-side page views only fire when a route is actually shown.
Setup
Put the tag in the root route's document shell, next to Meta and Links, so it loads once for the whole app.
app/root.tsx
// app/root.tsx
import { Links, Meta, Outlet, Scripts } from '@remix-run/react';
export default function App() {
return (
<html lang="en">
<head>
<Meta />
<Links />
<script
src="https://pulsepanda.dev/sdk.js"
data-project="YOUR_PROJECT_ID"
defer
/>
</head>
<body>
<Outlet />
<Scripts />
</body>
</html>
);
}Remix navigates client-side after the first load, and the SDK follows those transitions on its own — no useEffect in each route.
Workflow
Add the script once to app/root.tsx and every nested route 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
In app/root.tsx, inside the head of the document component. That file wraps every route, so one tag covers the entire app.
Yes. Page views follow the URL, so a nested route that changes the address bar is recorded like any other navigation.
Track it in the browser rather than the action: call track() when the submission succeeds, so the event stays attached to the session and its replay.
Related pages
Install once and connect analytics, session replay, heatmaps, funnels, and feedback in minutes.
Start for free