Core concepts
Projects, apps, write keys, and events. The mental model behind Brekky.
Projects
A project is your product: one SaaS app, one marketing site, or both under the same roof. Each project has its own settings, team, and analytics data.
Apps
Within a project you can have multiple apps, one per platform. Common setups:
- Website (
web): tracked withbrekky.js - iOS (
ios): Swift or React Native - Android (
android): Kotlin or React Native / Flutter
Switch apps in the dashboard sidebar to filter live stats, events, and charts to that surface.
Write keys
Every app gets a unique write key (e.g. bm_abc123...). Events sent with that key land in the right app. Keep keys in your install snippet or SDK init, not in public repos if you can avoid it.
Visitors, sessions, and users
- Visitor ID: anonymous ID stored in local storage (web) or device storage (mobile). Each browser and phone gets its own id until you identify.
- Session ID: one visit. Expires after 30 minutes of inactivity on web.
- User ID: set with
Brekky.identify()when someone logs in. The same string on web and apps is the same person in Visitors. - Handoff ID: stamped when someone hops from one app to another via
Brekky.handoffUrl(). Sessions stay per device. The dashboard pairs the two visits. See cross-app handoffs.
Sessions in the dashboard is visit-level: open a session to see its event timeline. Visitors groups by person. Identified accounts collapse across devices. Anonymous traffic stays one row per browser or phone.
Funnels
A funnel is an ordered path of checkpoints. Example: land on pricing → start signup → finish signup. Brekky measures how many people reach each step and where they drop off.
- Each checkpoint is an event (like
add_to_cart) or a page view on a path. You can pick which app that event comes from, so a mobile sign-in can convert on the website. - You set how long they have to finish (same visit, 1 day, 7 days, 30 days, or no time limit).
- Count each person once, or signed-in people only.
- Optional filters narrow a step (e.g. plan = pro).
Track the events in your funnel before you build it so data is ready. Reports use live data for your selected date range. When the goal step carries amount and currency, the report also shows total sales. See Dashboard → Funnels for the builder and templates.
Revenue
Sales are not a separate data source. They come from payment events you send with an amount attached.
- Counted events:
checkout_completedandpurchase - Required properties for rollups:
amount(number) andcurrency(string) - Fire from your server when payment clears (Stripe webhook, etc.), not from the browser alone
- Stats shows a Sales total. Sessions shows per-event amounts. Funnels sums sales on the goal step.
Full setup: Revenue tracking.
Events
An event has a name (lowercase, underscores) and optional properties. Names are normalized to a-z0-9_ and capped at 64 characters.
page_view(web, automatic)app_open(mobile, automatic after SDK init)- Product events like
cta_click,feature_used,screen_view - Account and sales events like
login_completed,plan_selected,checkout_completed(usually server-side) - Problem events like
signup_failed,payment_failed,error_occurred
The dashboard Events tab groups these into categories and includes setup guides for full flows like signup and checkout. Read Track custom events for the full catalog and naming tips.
Context attached to every event
On web, each event includes URL, path, title, referrer, locale, timezone, viewport, UTM params when present, and parsed device info (browser and OS, e.g. Chrome on macOS).
Project roles (summary)
| Role | Can do |
|---|---|
| Owner | Everything, including billing (when live) |
| Admin | Settings, invites, roles, tracking snippet |
| Member | Dashboard and tracking snippet |
| Viewer | Read-only dashboard |
Full matrix: Team & roles.