Getting started
From a Google sign-in to your first event, in about ten minutes.
SaaS Pro Max is a control plane you run: one Postgres database, one console, one ingest endpoint. An organization owns applications; each application has three environments (production, staging, development), its own ingest keys, and its own set of enabled modules.
1. Sign in
Open /login and sign in with Google, then enrol a passkey — every console user
needs one, on every sign-in, not just the first. A first-time visitor gets an
organization and a starter application. Team-mates still join through
Organization → Members.
If you were invited to an existing organization, the invite link takes you through the same flow and drops you inside that organization.
2. Your organization
A new account already has one. Skip this if you were invited into someone else's.
To add another, go to /o/new, give the organization a name and a slug. The slug appears in
every console URL (/o/<org>/…) and cannot be changed later. You become its
owner, which carries every permission including org.delete.
Members are invited from Organization → Members with one of the seeded roles — owner, admin, developer, analyst, support, marketing, viewer — or a custom role you compose from the permission list.
3. Create an application
On the organization page (/o/<org>), use the New application panel:
| Field | Notes |
|---|---|
| Name | Shown in the switcher and in reports |
| Slug | Appears in the URL: /o/<org>/apps/<app>/… |
| Platform | web, mobile, backend or other |
| URL | Your application's public address, used for links |
| Reporting timezone | Day boundaries for every rollup |
Production, staging and development environments are created for you. Every event, key and dashboard is scoped to one of them, and the environment selector in the top bar decides which one you are looking at.
On the free plan that first application is the only one, and it comes with
10,000 events a month across all three environments, two members including
pending invitations, 30 days of retention, and the analytics, errors, metrics
and flags modules. Ingest stops at 100% of the quota rather than billing you
for the overage, and the console warns at 80% first. Organization → Plan and
usage (/o/<org>/billing) shows the month against the limit and moves you up
the ladder. The pricing page lists every rung.
4. Mint an ingest key
Open Settings → Keys (/o/<org>/apps/<app>/settings/keys), pick an
environment and create a key.
| Kind | Looks like | Can do |
|---|---|---|
| Public | spm_pub_prod_xxxxxxxxxxxxxxxxxxxxxx |
Send events, evaluate flags. Safe in a browser bundle. |
| Secret | spm_sec_prod_xxxxxxxxxxxxxxxxxxxxxx |
The same, plus server-sent context.ip and context.userAgent. Server only. |
The full value is shown once, at creation. Only a prefix, the last four characters and a sha256 hash are stored, so a lost key is revoked and replaced, never recovered.
If your site is served from a fixed set of origins, list them under Settings → Data; ingest then rejects browser events from anywhere else.
5. Install the SDK
The fastest path, with no build step:
<script defer src="https://saaspro.dev/spm.js" data-key="spm_pub_prod_xxxxxxxx"></script>
That starts a session, sends a $pageview, follows client-side route changes,
captures uncaught errors and web vitals, and exposes window.spm. See
script tag for every data- attribute.
React and Next.js:
npm install @saaspro/react
import { 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>
);
}
Your server, worker or CLI:
npm install @saaspro/node
import { 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" });
await spm.flush();
Full references: browser, react, node, and the recipes for Next.js, Vite, plain HTML, Express and Hono.
6. Watch the events arrive
Open Analytics → Live (/o/<org>/apps/<app>/analytics/live) and load a page
in your application. A visitor appears within a couple of seconds.
Nothing showing up? In order:
- Check the key's environment matches the environment selector.
- Check the browser network tab for a
202from/api/v1/ingest. - Turn on
debug: true(ordata-debug) and watch the browser console — every queued event and every request is logged. - Check Settings → Data if you have restricted allowed origins.
The Events page (/o/<org>/apps/<app>/events) is the raw feed: every event
name, its properties, and the person and session it belongs to.
7. Turn modules on
Settings → Modules (/o/<org>/apps/<app>/settings/modules) decides which
dashboards exist for this application. New applications start with analytics,
people, errors, metrics and flags.
| Module key | What it adds |
|---|---|
analytics |
Visitors, sources, pages, funnels, retention, live view, the event explorer |
people |
Person profiles, timelines, segments, lifecycle stages, tags and notes |
errors |
Grouped exception issues with stack traces, breadcrumbs and releases |
metrics |
Counters, gauges, histograms, web vitals, uptime monitors, alert rules |
flags |
Boolean and multivariate flags with rollouts and property rules |
evals |
Prompt, model, retrieval, tool and voice evaluations with quality gates |
communications |
Campaigns to segments, with approvals and delivery records |
destinations |
Server-side conversion forwarding to ad platforms and webhooks |
revenue |
Read-only MRR, ARR, churn and subscriptions from a billing provider |
connector |
Your own application's users, over the signed Ed25519 connector |
ai |
The "Ask" assistant over your own data |
A module that is off is off: its navigation entry disappears and its route says so rather than teasing an upsell.
Settings → Navigation (/o/<org>/apps/<app>/settings/navigation) is the
weaker filter next to it: clear an entry and it leaves the sidebar for everyone
in the organization, while the page stays enabled and reachable from More at
the bottom of the sidebar and from search. Changing it needs apps.write and is
recorded in the audit log.
Public reports live under Settings → Public sharing. Overview and each
funnel are separate switches, off by default. A published report is available at
/s/<slug> and as an embed at /embed/<slug>. Aggregates only.
8. Connect an agent
Everything the console can read, an agent can read — through the same permission-filtered query layer, never raw SQL.
Mint an access token first: Account → Personal access tokens for one that
acts as you, or Organization → Tokens for one that carries the developer
role. Scopes are read, write and admin; take the smallest one that does
the job.
Then point the MCP server at your instance:
{
"mcpServers": {
"saaspromax": {
"command": "npx",
"args": ["-y", "@saaspro/mcp"],
"env": { "SPM_TOKEN": "spm_pat_xxxxxxxx", "SPM_HOST": "https://saaspro.dev" }
}
}
}
That gives Claude Code, Claude Desktop or Cursor thirty-odd tools — analytics,
people, errors, metrics, flags, revenue and the assistant — plus your
documentation as resources and three prompts (integrate_app, weekly_report,
investigate_error). See MCP server for the full tool list and what
each scope unlocks.
For an agent that writes code rather than answers questions, install the
agent skills: saaspromax-integrate walks an SDK installation
end to end, and saaspromax-analyze knows how to ask your data a question.
9. Automate with the Management API
The same token is a bearer credential for /api/v1:
curl -H "authorization: Bearer $SPM_TOKEN" \
"https://saaspro.dev/api/v1/apps/<org>/<app>/analytics/overview?range=7d"
Applications, keys, events, people, errors, metrics, monitors, alerts, flags,
funnels, revenue and destinations are all reachable, {app} is either an
application id or orgSlug/appSlug, and every list answers
{ data, nextCursor }. The full reference is in the
Management API, and the machine-readable contract is
openapi.json, also served live at /api/v1/openapi.json.
Where to go next
- SDK overview — which package for which runtime, and the event envelope every one of them posts.
- Connector — read and act on your own application's users from the console without sharing a database.
- Management API — every endpoint, with scopes and cursors.
- MCP server and agent skills — the agent surface.
- Charts — the chart primitives the console renders, if you are extending it.