Features · Analyse
Shipped several apps? One line where each app knows who is signed in, and Vitrus counts who is new, who came back, who you lost and who started paying — per app and for all of them on one page. No auth provider to connect, no admin keys to hand over, and no personal data stored.
Active users with the change against the previous period, a trend line, Web / iOS / Android badges, new, came back and lost, paying users and revenue per currency. Switch to visitors, or to one table with a total row.
Open an app and each signed-in person is a row — returning, one-time or signed up only, their actions, active days and plan — shown under a generated name. Email and name are never stored.
The tracker sends sha256(site + id), the server hashes that again with a secret, and email, phone and name fields are dropped twice. Ids are hashed per app, so nobody — us included — can join one person across your apps.
get_portfolio and get_lifecycle over MCP, or /api/portfolio with a read-only key: "which of my apps lost users this week?" comes back with the query behind every count.
The evidence
WITH people AS (
SELECT site_id, identity, MIN(ts) AS first_ts,
MAX(CASE WHEN ts >= ? AND ts < ? THEN 1 ELSE 0 END) AS cur,
MAX(CASE WHEN ts >= ? AND ts < ? THEN 1 ELSE 0 END) AS prev
FROM events WHERE site_id IN (?, ?, ?) AND ts < ? AND identity <> ''
GROUP BY site_id, identity)
SELECT site_id, SUM(cur) AS active,
SUM(CASE WHEN cur = 1 AND first_ts >= ? THEN 1 ELSE 0 END) AS new_users,
SUM(CASE WHEN cur = 0 AND prev = 1 THEN 1 ELSE 0 END) AS churned
FROM people GROUP BY site_id
Abridged: the real query also counts who came back. One query for all apps, not one per app — the dashboard shows it in full.
Totals add apps together: the same person signed in to two of your apps counts twice, by design. "New" and "came back" are bounded by how much history is on record, and the page says how far back it can see.