Know what changed, who it hit, and what to do next.
Analytics, session replay, errors, traces, flags and revenue in one console, every row reading from one schema. Installed with one line, exportable in full, readable by your agents over MCP.
- Free for 10,000 events a month
- No payment method to start
- Export everything, any time
What this page is claiming
- 54
- feature families
- 1
- SDK envelope
- 1
- Postgres database
- 7.7 KB
- script tag, gzipped
- 31
- MCP tools
- 0
- bytes of telemetry to us
One console. Five views of the same rows.
Visitors, funnels, errors, traces and revenue are the same table read five ways, so a number you see here can always be followed to the request that produced it.
| Point | Value |
|---|---|
| 1 | 1,488 |
| 2 | 1,402 |
| 3 | 995 |
| 4 | 934 |
| 5 | 1,476 |
| 6 | 1,552 |
| 7 | 1,610 |
| 8 | 1,571 |
| 9 | 1,498 |
| 10 | 1,043 |
| 11 | 981 |
| 12 | 1,520 |
| 13 | 1,603 |
| 14 | 1,662 |
Visitors
26,940
+16.3%vs previous 30 days
| Point | Value |
|---|---|
| 1 | 3,702 |
| 2 | 3,489 |
| 3 | 2,477 |
| 4 | 2,325 |
| 5 | 3,674 |
| 6 | 3,861 |
| 7 | 4,004 |
| 8 | 3,910 |
| 9 | 3,726 |
| 10 | 2,596 |
| 11 | 2,441 |
| 12 | 3,782 |
| 13 | 3,988 |
| 14 | 4,136 |
Pageviews
68,318
+12.1%vs previous 30 days
| Point | Value |
|---|---|
| 1 | 1,741 |
| 2 | 1,640 |
| 3 | 1,164 |
| 4 | 1,093 |
| 5 | 1,727 |
| 6 | 1,816 |
| 7 | 1,884 |
| 8 | 1,839 |
| 9 | 1,753 |
| 10 | 1,220 |
| 11 | 1,148 |
| 12 | 1,779 |
| 13 | 1,876 |
| 14 | 1,945 |
Sessions
31,486
+14.8%vs previous 30 days
| Point | Value |
|---|---|
| 1 | 43.1% |
| 2 | 42.8% |
| 3 | 44.6% |
| 4 | 45.1% |
| 5 | 42.2% |
| 6 | 41.8% |
| 7 | 41.4% |
| 8 | 41.9% |
| 9 | 42.0% |
| 10 | 43.6% |
| 11 | 44.1% |
| 12 | 41.6% |
| 13 | 41.1% |
| 14 | 40.8% |
Bounce rate
41.2%
-3.8%vs previous 30 days
Signup funnel
4.1K
+5.8%Viewed pricing through to first event
| Stage | Reached | Step conversion | Share of entry |
|---|---|---|---|
| Viewed pricing | 4,127 | 100% | 100% |
| Started signup | 1,286 | 31% | 31% |
| Created organization | 742 | 58% | 18% |
| Sent first event | 511 | 69% | 12% |
Events by kind
123.7K
Every kind the ingest endpoint accepts
| Slice | Value | Share |
|---|---|---|
| page | 68,318 | 55.2% |
| track | 24,110 | 19.5% |
| vital | 12,480 | 10.1% |
| metric | 9,420 | 7.6% |
| identify | 6,142 | 5.0% |
| error | 3,184 | 2.6% |
Visitors
26,940
+16.3%vs previous 30 days
| Point | Visitors | Previous 30 days |
|---|---|---|
| 5 Aug | 1,180 | 1,042 |
| 6 Aug | 1,244 | 1,101 |
| 7 Aug | 1,301 | 1,148 |
| 8 Aug | 1,096 | 968 |
| 9 Aug | 842 | 744 |
| 10 Aug | 796 | 702 |
| 11 Aug | 1,287 | 1,136 |
| 12 Aug | 1,352 | 1,194 |
| 13 Aug | 1,418 | 1,252 |
| 14 Aug | 1,377 | 1,216 |
| 15 Aug | 1,290 | 1,139 |
| 16 Aug | 921 | 813 |
| 17 Aug | 868 | 766 |
| 18 Aug | 1,394 | 1,231 |
| 19 Aug | 1,461 | 1,290 |
| 20 Aug | 1,523 | 1,345 |
| 21 Aug | 1,488 | 1,314 |
| 22 Aug | 1,402 | 1,238 |
| 23 Aug | 995 | 879 |
| 24 Aug | 934 | 825 |
| 25 Aug | 1,476 | 1,303 |
| 26 Aug | 1,552 | 1,371 |
| 27 Aug | 1,610 | 1,421 |
| 28 Aug | 1,571 | 1,387 |
| 29 Aug | 1,498 | 1,323 |
| 30 Aug | 1,043 | 921 |
| 31 Aug | 981 | 866 |
| 1 Sep | 1,520 | 1,342 |
| 2 Sep | 1,603 | 1,416 |
| 3 Sep | 1,662 | 1,468 |
Activation
72%
Signups this month, against the goal for each step
- Installed an SDK412 of 500
- Sent a first event361 of 500
- Invited a teammate188 of 500
| Ring | Progress |
|---|---|
| Installed an SDK | 412 of 500 |
| Sent a first event | 361 of 500 |
| Invited a teammate | 188 of 500 |
Events ingested
9,544k
+18.2%Thousands of events a month, by the SDK that sent them
- Browser
- Server
| Category | Browser | Server |
|---|---|---|
| Oct | 412k | 128k |
| Nov | 448k | 141k |
| Dec | 461k | 149k |
| Jan | 502k | 162k |
| Feb | 538k | 174k |
| Mar | 571k | 188k |
| Apr | 604k | 199k |
| May | 655k | 217k |
| Jun | 690k | 228k |
| Jul | 724k | 241k |
| Aug | 768k | 258k |
| Sep | 812k | 274k |
| Page | Pageviews | Share | Bounce |
|---|---|---|---|
/saaspro.dev | 18,204 | 100% of the busiest page | 32.1% |
/docs/sdk/script-tagsaaspro.dev | 6,338 | 35% of the busiest page | 18.9% |
/pricingsaaspro.dev | 4,127 | 23% of the busiest page | 44.7% |
/docs/getting-startedsaaspro.dev | 3,905 | 21% of the busiest page | 21.4% |
/featuressaaspro.dev | 2,614 | 14% of the busiest page | 36.2% |
Crash-free sessions, web@2026.9.1
97.4%
-2.2%vs the release before, deployed 09:00 UTC
Unresolved issues
14
+7.7%61 people affected
p95 response time
181 ms
-3.1%Rolling 30 days
| Issue | Release | Users | Events | Status |
|---|---|---|---|---|
TypeError: Cannot read properties of undefined (reading 'plan')app/checkout/summary.tsx in PlanSummary | web@2026.9.1 | 61 | 84 | unresolved |
FetchError: POST /api/billing/session returned 502lib/billing/session.ts in createSession | web@2026.9.1 | 27 | 31 | investigating |
ChunkLoadError: Loading chunk 42 failednext/dist/client/route-loader.js | web@2026.8.4 | 12 | 12 | resolved |
On call
Routed from the alert rule that fired
Today
Checkout 502s after web@2026.9.1
mitigated · Ada O. · open 41m
Worker queue depth above 40
acknowledged · Ravi P. · open 2h
Error budget
99.94%
Checkout availability, 30 days
| Measure | Value |
|---|---|
| Availability against objective | 99.94% of 100.00% |
| Share | 100% |
| Verdict | Within budget |
Trace 4f1c…9a2e
612 ms
One request, correlated with the error by request id
p95 response time
181 ms
−3.1%Rolling 30 days
| Point | p95 ms |
|---|---|
| 5 Aug | 184 ms |
| 6 Aug | 179 ms |
| 7 Aug | 188 ms |
| 8 Aug | 176 ms |
| 9 Aug | 168 ms |
| 10 Aug | 165 ms |
| 11 Aug | 191 ms |
| 12 Aug | 186 ms |
| 13 Aug | 194 ms |
| 14 Aug | 205 ms |
| 15 Aug | 231 ms |
| 16 Aug | 212 ms |
| 17 Aug | 188 ms |
| 18 Aug | 183 ms |
| 19 Aug | 179 ms |
| 20 Aug | 176 ms |
| 21 Aug | 182 ms |
| 22 Aug | 188 ms |
| 23 Aug | 174 ms |
| 24 Aug | 169 ms |
| 25 Aug | 181 ms |
| 26 Aug | 186 ms |
| 27 Aug | 192 ms |
| 28 Aug | 187 ms |
| 29 Aug | 183 ms |
| 30 Aug | 172 ms |
| 31 Aug | 168 ms |
| 1 Sep | 179 ms |
| 2 Sep | 184 ms |
| 3 Sep | 181 ms |
Correlated logs
Every line carries trace 4f1c…9a2e
- warn
stripe webhook retried (2) - error
billing.session: upstream 502 after 188 ms - info
checkout rendered · plan=team · flag new-checkout=on
new-onboarding
25% rollout
Evaluated locally from a cached ruleset
- 01plan is one of team, businesson
- 02country is DEoff
- 03everyone else25% rollout, hashed on distinct id
| Grader | Baseline | Candidate | Change |
|---|---|---|---|
| Answer contains the policy | 78% | 91% | +13 |
| No invented order number | 94% | 97% | +3 |
| Tone matches the brand guide | 71% | 83% | +12 |
| Under 120 words | 99% | 96% | -3 |
MRR (EUR)
18,420
+6.4%vs previous 30 days
ARR (EUR)
221,040
412 active subscriptions
Net revenue churn
2.1%
-0.4%vs previous 30 days
Monthly recurring revenue (EUR)
18,420
+6.4%Booked from the billing connector, not estimated
| Point | MRR |
|---|---|
| 5 Aug | 14.8K |
| 6 Aug | 15K |
| 7 Aug | 15K |
| 8 Aug | 15K |
| 9 Aug | 15.2K |
| 10 Aug | 15.2K |
| 11 Aug | 15.3K |
| 12 Aug | 15.5K |
| 13 Aug | 15.6K |
| 14 Aug | 15.6K |
| 15 Aug | 15.9K |
| 16 Aug | 16K |
| 17 Aug | 16K |
| 18 Aug | 16.2K |
| 19 Aug | 16.4K |
| 20 Aug | 16.5K |
| 21 Aug | 16.5K |
| 22 Aug | 16.8K |
| 23 Aug | 17K |
| 24 Aug | 17K |
| 25 Aug | 17.2K |
| 26 Aug | 17.3K |
| 27 Aug | 17.6K |
| 28 Aug | 17.6K |
| 29 Aug | 17.8K |
| 30 Aug | 18K |
| 31 Aug | 18K |
| 1 Sep | 18.1K |
| 2 Sep | 18.3K |
| 3 Sep | 18.4K |
Weekly retention
71%
Share of each cohort still active, by week
| Week 0 | Week 1 | Week 2 | Week 3 | Week 4 | Week 5 | |
|---|---|---|---|---|---|---|
| Aug 4 | 100% | 61% | 48% | 41% | 38% | 36% |
| Aug 11 | 100% | 64% | 50% | 44% | 40% | — |
| Aug 18 | 100% | 66% | 53% | 46% | — | — |
| Aug 25 | 100% | 68% | 55% | — | — | — |
| Sep 1 | 100% | 71% | — | — | — | — |
Why one console
Give every application you ship one console and one schema for analytics, replay, errors, traces, flags and revenue, then follow any number to the request that produced it.
- POST /checkout412ms
- auth.session18ms
- stripe.charge291ms
- db.orders42ms
- email.enqueue9ms
- 14:02:07.118infocheckout.started plan=team seats=12
- 14:02:07.409warnstripe.charge retried after 291ms, idempotency key reused
- 14:02:07.530infoorder.created id=ord_8f21 amount=4280
Everything is connected, because everything is one table.
Trace an incident from rage click to the fix without leaving the tab. One database. No correlation to do by hand.
01 · Issue
TypeError: Cannot read properties of undefined (reading 'plan')
app/checkout/summary.tsx:41 in PlanSummary- Users
- 61
- Events
- 84
- First seen
- web@2026.9.1 · 09:02 UTC
- Owner
- @billing-team
Stack trace resolved from build 2026.9.1+ab41f2.
02 · Replay
The session that hit it
- 0:00/pricingnavigated
- 0:41Start trialclicked
- 1:58/checkout · plan Teamnavigated
- 2:36Continue ×3rage click
- 2:37TypeError thrownerror
3m 12s, recorded with inputs masked. Private by default.
03 · Trace
The request behind the click
GET /checkout612 msrender PlanSummary74 msPOST /api/billing/session212 msstripe.checkout.sessions.create188 msSELECT subscriptions11 ms
Trace 4f1c…9a2e, correlated with the error by request id.
04 · Release
web@2026.9.1Crash-free sessions fell from 99.6% to 97.4%, deployed 09:00 UTC.
Adoption62% of sessionsAnnotated on every chart for this application.
05 · Action
Flag
new-checkoutaudit #48,211 · hash-chained · passkey verified.
One line to install. One envelope for everything.
The script tag captures pageviews, errors and vitals. React and Node add custom events, identities, metrics and the signed connector — one schema.
- 01Add the snippetThe script tag or the npm client starts capturing traffic on the next page load.
- 02Mint a keyOne public key per environment. No agent to run, no pipeline to maintain.
- 03Read one connected truthPageviews, errors, traces, flags and revenue arrive as rows you can join.
One envelope, ten kinds
- page
- track
- identify
- error
- vital
- metric
- span
- log
- session
- flag
Also WordPress, React Native, Python and an OpenTelemetry bridge. Every SDK.
<script defer src="https://saaspro.dev/spm.js"
data-key="spm_pub_prod_xxxxxxxx"></script>7.7 KB gzipped. Pageviews, route changes, errors and Core Web Vitals, no dependencies.
pnpm add @saaspro/reactimport { SaaSProMaxProvider } from "@saaspro/react";
import { SPMPageview } from "@saaspro/react/next";
export function Providers({ children }: { children: React.ReactNode }) {
return (
<SaaSProMaxProvider config={{ key: process.env.NEXT_PUBLIC_SPM_KEY! }}>
<SPMPageview />
{children}
</SaaSProMaxProvider>
);
}Initialises once on the client and stays quiet during server rendering.
pnpm add @saaspro/nodeimport { SaaSProMax } from "@saaspro/node";
const spm = new SaaSProMax({ secretKey: process.env.SPM_SECRET_KEY! });
spm.track({
distinctId: "user_123",
event: "subscription started",
value: 49,
currency: "EUR",
});Batches, retries, and never throws into your request handler.
All three post to POST https://saaspro.dev/api/v1/ingest with the same event envelope.
{
"kind": "page",
"key": "spm_pub_prod",
"ts": 1757520127,
"props": {
"path": "/pricing"
}
}{
"kind": "track",
"key": "spm_pub_prod",
"ts": 1757520127,
"props": {
"event": "sub.started"
}
}{
"kind": "error",
"key": "spm_pub_prod",
"ts": 1757520127,
"props": {
"message": "TypeError"
}
}{
"kind": "span",
"key": "spm_pub_prod",
"ts": 1757520127,
"props": {
"status": "502"
}
}{
"kind": "flag",
"key": "spm_pub_prod",
"ts": 1757520127,
"props": {
"key": "new-checkout"
}
}- page/pricing
- tracksubscription started
- errorTypeError in PlanSummary
- spanPOST /api/billing 502
- flagnew-checkout on, 25%
Product tour
Six workspaces built to answer the questions you actually ask, all reading from one database.

Workspace 01
Analytics
11 families
Where do visitors come from, and what do they do?
Learn more
Workspace 02
Revenue
6 families
Which channels and customers create value?
Learn more
Workspace 03
People and communications
6 families
Which accounts need attention, and how do we reach them?
Learn more
Workspace 04
Errors and metrics
14 families
What failed, who is affected, and what changed?
Learn more
Workspace 05
Flags and evaluations
7 families
Is a change safe, and is it useful?
Learn more
Workspace 06
Data and integrations
10 families
How do we connect, control and move our data?
Learn more
Built for the agent doing the integration.
One permission-filtered read layer for agents and operators, over MCP.
Purpose-built MCP
SaaS Pro Max in every conversation with your agent
- Analytics
- People
- Errors and metrics
- Flags
- Revenue
- Manage tokens
- Add scope
- Tool access31 tools, loaded when needed
Questions we get asked first.
The ones that decide whether this is worth your afternoon.
- Where does my data live?
- On the hosted service at
saaspro.dev, in a Postgres database we operate. Retention is set per application in Settings → Data, and deleting an application deletes its events. - Who owns the data?
- You do. Read it back through the Management API or MCP, export people as CSV, or schedule exports to your own S3 bucket. IP addresses are HMAC-hashed at ingest and never stored raw.
- Can it run without cookies?
- Yes.
cookieless: truewrites no cookies,consent: "pending"stores nothing until you grant it, and Do Not Track is respected. - What does it cost?
- Free covers 10,000 events a month on one application, with no payment method. Starter starts at $12 a month, Business at $35, priced by the events you send, and yearly is 30% off.
- Is session replay private?
- Inputs are masked before a frame leaves the browser, recordings are sampled per application, and every replay is scoped by the same permission that gates a person's profile.
- Can I publish stats on my own site?
- Yes, per report and off by default. Each share gets a URL under
/s/and an embed under/embed/. Aggregates only, and turning it off takes the URL down.