Docs
Install a package. Watch people move.
Rove lives at rovestats.com. Wrap your app, send a few events, and the dashboard tells the story — people, visits, and what they did.
01
Start here
01
Create a workspace
Sign up at rovestats.com and add a web or mobile app. You get a write key shown once.
02
Install the package
@rovestudio/web for Next.js and other web apps. @rovestudio/react-native for Expo and React Native.
03
Point it at Rove
Host is https://rovestats.com. The package only POSTs events. It never reads your dashboard or database.
Longer guides: how to add analytics to your app, Expo analytics, React Native analytics, Next.js analytics, mobile analytics.
02
Web
@rovestudio/web on npm. Sessions and page views start as soon as you wrap the app.
Install
npm install @rovestudio/web.env.local
NEXT_PUBLIC_ROVE_KEY=rov_live_YOUR_WRITE_KEY
NEXT_PUBLIC_ROVE_HOST=https://rovestats.comapp/rove-provider.tsx
"use client";
import { RoveProvider } from "@rovestudio/web";
export function Rove({ children }: { children: React.ReactNode }) {
return (
<RoveProvider
writeKey={process.env.NEXT_PUBLIC_ROVE_KEY!}
host={process.env.NEXT_PUBLIC_ROVE_HOST!}
>
{children}
</RoveProvider>
);
}app/layout.tsx
import { Rove } from "./rove-provider";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<Rove>{children}</Rove>
</body>
</html>
);
}RoveProvider records session start and page views, including App Router client navigations. Keep the root layout a Server Component. No React? Use initRove and rove in any JavaScript app.
03
Mobile
@rovestudio/react-native on npm. Same events, same host. Async Storage keeps the queue if the process dies.
Expo
npx expo install @rovestudio/react-native @react-native-async-storage/async-storageReact Native
npm install @rovestudio/react-native @react-native-async-storage/async-storageEnv
EXPO_PUBLIC_ROVE_KEY=rov_live_YOUR_WRITE_KEY
EXPO_PUBLIC_ROVE_HOST=https://rovestats.comRoot layout
import { RoveProvider } from "@rovestudio/react-native";
export default function RootLayout({ children }) {
return (
<RoveProvider
writeKey={process.env.EXPO_PUBLIC_ROVE_KEY}
host={process.env.EXPO_PUBLIC_ROVE_HOST}
>
{children}
</RoveProvider>
);
}RoveProvider records session start plus app foreground and background. Call rove.screen on important screens if you are not using a navigator hook.
04
What to send
Automatic events cover the session. Add names that a person would understand — signup, purchase, invite sent — not raw system noise.
rove.track(name, properties?)
Something someone did. Use a short name and a few properties, like value or plan.
rove.identify(userId, traits?)
Tie the anonymous device to your signed-in user. Call this after login if you already have auth.
rove.reset()
Forget the user on sign-out. The next visitor starts a fresh path.
rove.page(path?) / rove.screen(name)
A page or screen you care about. Web already records navigations; screen is for mobile.
rove.flush()
Send the queue now. Do this before a redirect so the last event is not lost.
Custom events
import { rove } from "@rovestudio/web";
rove.track("purchase", { value: 9.99, currency: "USD" });
rove.identify("user_123", { plan: "pro" });
rove.page("/pricing");05
HTTP, if you skip the package
Both packages POST here. You can do the same from iOS, Android, or anything that can send JSON.
POST https://rovestats.com/api/v1/events
curl -X POST https://rovestats.com/api/v1/events \
-H "Authorization: Bearer rov_live_YOUR_WRITE_KEY" \
-H "Content-Type: application/json" \
-d '{"events":[{"id":"<uuid v4>","name":"session_start","distinct_id":"dev_1"}]}'- Event names start with a letter, then letters, numbers, _, ., :, -
- At most 50 events per request
- Each event needs a UUID id, a name, and a distinct_id
- Optional identify object ties the device to your user
- Write key in Authorization: Bearer, or X-Rove-Key
06
Keys and the host
Write key
Starts with rov_live_. It can only ingest. We store a hash, not the secret. Shown once — rotate it from the app if you lose it. Do not commit it.
Host
Production host is https://rovestats.com. No trailing path. The SDK appends /api/v1/events.