Documentation menu

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:

  1. Check the key's environment matches the environment selector.
  2. Check the browser network tab for a 202 from /api/v1/ingest.
  3. Turn on debug: true (or data-debug) and watch the browser console — every queued event and every request is logged.
  4. 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.