Skip to content
Codeskop

User tracking & monitoring

See who is using your apps, how often, and who is hit by crashes: per person when you identify users, per install when you don't.

Available on Growth and Scale

The Users tab and per-user history are included on the Growth and Scale plans. On Free and Starter, issues still show how many users they affected. See Plans & features.

How it works

There's nothing extra to turn on. The SDK already attaches two things to every event:

  • An install ID: a random ID created the first time the SDK runs in an app install or browser. It isn't tied to hardware, advertising IDs or the user. On Android it's stored encrypted on the device; on the web it's kept in localStorage with a first-party cookie as a fallback.
  • Your user ID, from the moment you call identify(userId) until you call reset().

Codeskop counts a user as your user ID when there is one, and otherwise the install. One customer signed in on a phone and a laptop counts once; an anonymous visitor counts once per browser or install.

Sessions

While your app is in the foreground (or your web page is visible), the SDK sends a small heartbeat at a regular interval (every 30 seconds on the web) with a session ID. A session starts when the app opens or the tab becomes visible, and ends when it goes to the background. Sessions are how Codeskop tells an active user from one who only crashed once.

Heartbeats are free: they never count toward your monthly events.

Identify your users

Call identify after login and on startup when a user is already signed in (the SDK doesn't remember the user between launches). Call reset on logout.

Android (Kotlin)
// After login, and on launch when a user is already signed inCodeskop.identify(userId = user.id, traits = mapOf("plan" to user.plan)) // On logoutCodeskop.reset()
Flutter
await Codeskop.identify(user.id, traits: {'plan': user.plan});await Codeskop.reset();
Web
import { identify, reset } from "@codeskop/tracker"; identify(user.id, { plan: user.plan });reset();
React
const { identify, reset } = useCodeskop(); useEffect(() => {  if (user) identify(user.id);  else reset();}, [user, identify, reset]);
  • Use your own stable ID: a database ID, not an email, phone number or name.
  • Traits are optional and should be non-personal (plan, tier, cohort). They travel with events but aren't shown in the Users tab.
  • Earlier anonymous events from the same install aren't merged into the user after identify.

Platform details: Android, Flutter, web and React.

The Users tab

Users in the dashboard covers the last 30 days of the environment you have selected (Production or Test).

Headline numbers

OptionTypeDescription
Active usersn/aDistinct users and anonymous installs that sent anything in the period, with the change from the previous period.
New usersn/aUsers seen for the first time in the period.
Users affected by crashesn/aDistinct users who had at least one crash, native crash or ANR.
Crash-free usersn/aThe share of active users who didn't crash. The number to watch after a release.
Daily active usersn/aA chart of distinct users per day.

The user list

The 500 most recently active users, each with: user ID (or Anonymous install), platform, device, OS, country (from the device or browser locale), app version, sessions, crashes, issues and when they were first and last seen. Search by user ID, device, OS, country or app version, and filter by project or by users with and without crashes.

For web users, the device is the browser and computer, read from the user agent (for example Chrome 129 on Mac or Safari 17 on iPhone), and the OS is macOS, Windows, iOS 17.5 and so on. The app version is the release you pass to init; use your package.json version.

One user's history

Select a user to see the journey of their latest session (crashes, errors and failed API calls in order), their last 10 sessions (start time, length, app version, and whether the session ended in a crash) and the issues they hit, each linking to the issue.

Supporting a customer

When a customer reports a problem, search the Users tab for their user ID to see exactly what happened in their recent sessions.

Privacy

  • Codeskop never needs names, emails or phone numbers, only the ID you choose.
  • Country comes from the locale setting (for example en-KE), not from IP geolocation or GPS.
  • reset() stops attributing events to the user; the install ID stays so anonymous counts remain right.
  • User data follows your plan's retention, like all events. More in Privacy & Security.

Current limitations

  • 30-day window: the Users tab looks back 30 days and lists up to 500 users.
  • Custom events, screens and funnels are part of product analytics, with each user's traits and full timeline.

User tracking is an area we're actively building on. Changes appear in the release notes.

Next steps