Product analytics
Active users, events, funnels and retention for your web and mobile apps, stored next to your project and queryable in SQL.
Send events from your app with the SDK. Sovaria keeps them for your project, shows daily, weekly and monthly active users, trends per event, funnels and retention cohorts in the console, and lets you copy raw events into your own Postgres to join them with your tables in SQL. The signed-in user is taken from the request's token, never from the event, so one app user can't send events as another.
import { SovariaSDK, indexedDbStorage } from '@sovaria/sdk'
const sov = new SovariaSDK({ projectUrl: 'https://<ref>.sovarias.in', anonKey: '<anon key>' })
sov.analytics.configure({ storage: indexedDbStorage(), appVersion: '2.4.1' }) // keep the queue across reloads
sov.analytics.track('purchase', { amount: 20, plan: 'pro' })
sov.analytics.screen('Checkout')
sov.analytics.identify({ plan: 'pro', team_size: 4 }) // user properties
await sov.analytics.setEnabled(false) // the user opted out#Events the SDK sends for you
| Event | When |
|---|---|
$session_start | The first event after 30 minutes without one. |
$app_open | The first event of each app launch. |
$screen | screen(name). |
$identify | identify(props): sets user properties. |
$exposure | The first time the app reads a remote config value that is part of an experiment (A/B experiments). |
#Reports
- Overview: active users per day, events and new users per day, top events, platforms, countries and this month's usage.
- Events: every event name with its count, a daily trend (times and distinct users) and the properties it carries. Turn on Live events to watch events arrive while you add tracking.
- Funnels: ordered steps, each counted only after the previous one and within a window from the first (
sov analytics funnel view_item add_to_cart purchase). - Retention: cohorts by first activity (or a start event) and the share that came back (or did a return event) each week or day. Only finished periods are shown, so the newest column never reads low.
- Users: recent users with their properties, and one user's timeline (for support questions).
#Query events with SQL
Copy raw events into a table in your project's own database and join them with your data, for example revenue per acquisition channel:
sov analytics export --to-db --since 2026-10-01 # into sovaria_analytics.events
sov db query "select date_trunc('day', e.occurred_at) d, sum(o.total) from sovaria_analytics.events e
join orders o on o.user_id::text = e.user_id where e.name = 'purchase' group by 1 order by 1"
sov analytics export --format csv --out events.csv # or a file#Privacy and consent
- Properties are flat values. Values that look like email addresses or long numbers (cards, accounts), and keys named like passwords, tokens or keys, are dropped before storage.
setEnabled(false)records the user's choice on the server (PUT /analytics/v1/consent): their events are dropped on every device and their properties deleted.setEnabled(false, { erase: true })also deletes their stored events.- Analytics › Overview › Consent: Require consent first records only users who said yes.
- Erase one user from the console (Users › Erase analytics),
sov analytics erase <user>or Sovariq. - Under HIPAA mode analytics is off by default: event properties are free-form and could carry PHI.
#Plans and limits
| Free | Pro | Ultra | Team | Enterprise | |
|---|---|---|---|---|---|
| Analytics events per month | 100,000 | 2,000,000 | 5,000,000 | 20,000,000 | 100,000,000 |
| What happens at the limit (hard, overage, off) | Hard stop | Billed beyond | Billed beyond | Billed beyond | Billed beyond |
| Days analytics events are kept | 30 days | 90 days | 365 days | 730 days | 1825 days |
| Funnels | ✓ | ✓ | ✓ | ✓ | ✓ |
| Steps per funnel | 3 | 8 | 10 | 15 | 20 |
| Raw event export and copy into your own database | — | ✓ | ✓ | ✓ | ✓ |
| User properties per app user | 25 | 50 | 100 | 100 | 200 |
Events count per organization and month. On Free, events past the limit are dropped (the Overview says how many); paid plans bill extra events as usage. The SDK sends at most 300 events a minute, and the gateway limits batches per address and per device, so a loop in one client can't use up the month.