Track custom events
Name events clearly, attach useful properties, and wire them where the action happens. The dashboard Events tab walks you through common setups.
Events in the dashboard
Open Dashboard → Events after your tracker is installed. You will see today's counts for events you are already sending, plus a catalog of things you can add.
- What you're tracking: tiles for events with counts today, including automatic ones like
page_view(web) orapp_open(mobile). - Add more tracking: browse by category on the left, pick an event or setup guide on the right.
- Setup wizards: fill in details (button name, plan, amount, etc.), copy a snippet tailored to your app, then trigger the event once while the wizard listens to confirm it landed.
- Connect visits to accounts: if you have traffic but no
identifyevents yet, the dashboard prompts you to wire up identity. See Identify users.
Setup guides
Some flows span multiple steps. Setup guides bundle them so you wire the whole journey, not just one event.
| Guide | Steps | Best for |
|---|---|---|
| Track signups from start to finish | signup_started → signup_completed → identify | SaaS, apps with account creation |
| Track sales from cart to payment | add_to_cart → checkout_started → checkout_completed | E-commerce, paid plans with a cart flow |
| Track onboarding from start to finish | onboarding_started → onboarding_step_completed → onboarding_completed | SaaS, apps with a post-signup setup flow |
| Track invites from send to join | invite_sent → invite_accepted | B2B, team products, referral flows |
checkout_completed, trial_started, subscription_cancelled, plan_changed, and refund_issued should fire from your server (Stripe webhook, etc.) when billing confirms the change. The wizard includes a server snippet tab for those events.Event catalog
The catalog is filtered to your selected app (web, iOS, or Android). Categories group related events so you only see what applies to your product.
People joining & coming back
| Event | When to fire |
|---|---|
login_completed | After a successful login |
Signup events (signup_started, signup_completed) live in the signup setup guide. Onboarding events live in the onboarding setup guide.
What people do in your app
| Event | When to fire | Notes |
|---|---|---|
app_open | App launch | Automatic on mobile after SDK init |
cta_click | Important button or link tap | Property: button |
feature_used | Key product action completes | Property: feature |
screen_view | Screen becomes visible | Mobile only. Property: screen |
Money & checkout
| Event | When to fire | Notes |
|---|---|---|
add_to_cart | Item added to cart | Property: product |
checkout_started | Checkout flow begins | Client-side is fine |
checkout_completed | Payment clears | Server-side only. Properties: plan, amount, currency |
purchase | One-off purchase completes | Same as checkout. Properties: amount, currency |
plan_selected | User picks a plan or billing option | Properties: plan, amount |
trial_started | Free trial begins | Best from Stripe webhook. Property: plan |
subscription_cancelled | Subscription ends | Stripe webhook recommended. Property: plan |
plan_changed | Plan upgrade or downgrade | Stripe webhook recommended. Properties: from_plan, to_plan |
remove_from_cart | Item removed from cart | Property: product |
refund_issued | Refund clears | Stripe webhook recommended. Properties: amount, currency |
Cart and checkout events are in the purchase setup guide. Fire checkout_completed and refund_issued from your server when money moves.
Revenue tracking
Brekky does not have a separate revenue integration. Sales come from the events you send. Attach a dollar amount when payment clears, and the dashboard rolls it up.
What counts as sales
- Event name:
checkout_completedorpurchase - Properties:
amount(number) andcurrency(e.g.USD) - Optional:
planorproductfor context in Sessions and filters in Funnels
// Server-side when Stripe confirms payment
Brekky.track("checkout_completed", {
plan: "Pro",
amount: 49,
currency: "USD",
});Where sales show up
| View | What you see |
|---|---|
| Stats | Sales card for the selected date range, with payment count underneath |
| Sessions | "Paid USD 49" on the event in the timeline when amount and currency are present |
| Funnels | Total sales on the goal step when people complete a funnel that ends on a payment event |
amount = 100 only narrow which events qualify for a step.Multi-currency
Stats groups payments by currency and does not mix them into one total. When more than one currency is recorded, pick it from the Sales card. Send currency on every payment event so formatting stays correct.
How you grow
| Event | When to fire |
|---|---|
invite_sent | Invite email sent or invite link copied |
form_submitted | Contact, demo, or waitlist form submits |
demo_requested | Demo booked or talk-to-sales requested |
invite_accepted | Invited person joins workspace or account |
newsletter_subscribed | Email newsletter signup confirms |
waitlist_joined | Early access or waitlist signup confirms |
invite_sent lives in the invite setup guide. Use that guide to track the full send-to-join flow.
What people look at
| Event | When to fire | Notes |
|---|---|---|
page_view | Page load or SPA navigation | Automatic on web |
pricing_viewed | Pricing page or screen loads | |
product_viewed | Product detail page or screen loads | Property: product |
file_downloaded | File download or export completes | Properties: file, kind (download or export) |
video_played | Video playback starts | Property: video. Fire on play, not every progress tick. |
search | Search submitted | Property: query. Not on every keystroke. |
When things go wrong
| Event | When to fire |
|---|---|
signup_failed | Signup fails after someone tries |
payment_failed | Payment or checkout fails |
error_occurred | Important user-facing action fails |
Use short reason or step properties. Do not send full error messages with personal data.
Naming
- Use lowercase with underscores:
signup_completed, notSignup Completed. - Stick to verbs or noun_verb:
cta_click,screen_view,feature_used. - Event names are normalized and capped at 64 characters.
Properties
Properties are a flat JSON object. Keep values strings, numbers, or booleans when possible. They show up in event detail and help you filter later. SDKs cap string values at 500 characters and drop unsupported types.
Events and funnels
Funnels chain the events you track here into conversion paths. In the dashboard, each checkpoint picks an event by its friendly name (e.g. "Add to cart") while matching the technical name (add_to_cart) under the hood.
When the goal step is a payment event with amount, the funnel report shows how many people converted and how much they paid. Track your key steps first, then open Dashboard → Funnels to build a path or clone a template.
Examples by platform
Brekky.track('cta_click', { button: 'hero_signup' });
Brekky.track('plan_selected', { plan: 'pro', amount: 49 });
Brekky.track('search', { query: 'pricing' });signup_completed. The signup setup guide includes an identify step.Avoid
- Tracking PII in event names (emails, full names).
- Firing the same event on every render (use click handlers or navigation hooks).
- Dozens of near-duplicate event names; prefer properties instead.
- Firing purchase events from the client only. Use a server webhook when money clears.