// events

Every action in your product, captured cleanly

Autocapture covers the basics the moment you install an SDK. Then you add the handful of events that describe your product, with typed properties you can slice on for years.

Web, iOS, Android and server SDKsUp to 250 properties per eventQueryable in seconds
acme-production · eventsStreaming
// one call, typed propertiestrack('checkout_started', {  plan: 'pro',  billing_period: 'annual',  amount_cents: 27600,  currency: 'usd'})
signup_completedjust nowemail_verified2s agoproject_created5s agocheckout_started8s agopurchase_completed12s agoerror_occurred17s ago
The live stream is typically under two seconds behind your app.

Autocapture to start, explicit events to go deep

The two are not a choice. Autocapture fills the dashboard on day one; explicit events are what you build funnels and answers on six months later.

Autocapture, on by default

Page views, screen views, sessions, clicks on anything with a stable selector, and basic device and source context — all captured from the two lines that install the SDK. You get traffic, retention and source breakdowns before you have written a single custom event.

It is a switch, not a trap. Turn autocapture off per SDK, or block individual selectors and paths, and nothing is sent.

page_viewedsession_startedbutton_clicked
// install and goimport { init } from '@alitycs/browser'
init({  apiKey: 'pk_live_…',  autocapture: true,  maskSelectors: ['.pii']})

Explicit events, typed and yours

One call, one event, whatever properties describe it. Numbers stay numbers, so you can sum revenue and take a median without casting; strings become breakdown dimensions automatically.

Types are inferred the first time a property is seen and then enforced. If a release starts sending amount_cents as a string, the schema view flags the conflict instead of quietly coercing it and ruining the chart.

Server-side calls work the same way — same event names, same properties, one user identity across web, mobile and backend.

// one call, typed propertiestrack('checkout_started', {  plan: 'pro',  billing_period: 'annual',  amount_cents: 27600,  currency: 'usd',  seats: 12})
// 202 Accepted · queryable in ~2s

Properties are the whole game

An event name tells you something happened. Properties tell you who, on what, for how much — and that is what every question you will ask later is actually about.

What an event looks like on the wire

A name, an identity, a timestamp, and a flat bag of properties. Nothing else is required, and nothing else is inferred behind your back.

Name events after what happened, not where the click was: checkout_started, never pricing_page_cta_click. Use lower snake case, an object followed by a past-tense verb, and push the variable part into a property — one checkout_started with a plan property beats four events named after each plan.

Ten well-named events will answer more questions than two hundred accidental ones, and you only have to agree on them once.

// POST /v1/events{  "event": "checkout_started",  "user_id": "u_8f21c4",  "timestamp": "2026-08-04T09:12:41Z",  "properties": {    "plan": "pro",    "amount_cents": 27600,    "seats": 12  }}

A core event set worth stealing

These eight cover signup, activation and revenue for almost every product. Instrument them first, in this order, and the funnels build themselves.

Recommended core events, when to send each one, and the properties to attach
EventSend it whenKey properties
signup_completedThe moment the account exists, before any onboarding screensource, referrer, plan
email_verifiedWhen the verification link is used, not when it is senthours_since_signup
project_createdThe first real object a user makes in your productproject_id, template
teammate_invitedInvite sent — track acceptance as its own eventrole, invite_count
activatedYour own definition of value delivered, decided once and written downdays_since_signup, path
checkout_startedPlan picker submitted, before the payment processor takes overplan, billing_period, currency
purchase_completedPayment confirmed by the processor, sent from your serverplan, amount, currency
error_occurredAny failure a user can see, including handled onescode, screen, sdk_version

Tying those events to real accounts is a separate, one-line job — see identifying users.

Verify it while the deploy is still rolling

The slowest part of instrumentation is usually finding out whether it worked. The live stream removes that wait entirely.

The live stream, filtered to your own session

Open the events tab, filter to the event name you just shipped, and watch it arrive. Each row expands into the full payload — every property, the resolved user, the SDK and version that sent it, and the exact time it was received.

Filter by any property while the stream is running, so you can confirm not just that the event fires but that it fires with the right values. Add debug: true to the SDK init and events are tagged as debug traffic, visible in the stream but excluded from reports.

If nothing shows up, the troubleshooting guide walks the four usual causes in order.

Live streamLive
checkout_startedplan is setdebug
checkout_started · plan=projust nowcheckout_started · plan=team3s agocheckout_started · plan=pro11s agocheckout_started · plan=free24s ago

Volume, retention and limits

One meter: events ingested per month. Retention is how far back you can query them, and it is generous enough to see a year-long cohort on a startup budget.

Event volume, retention and overage by plan
PlanIncluded volumeRetentionLive stream historyAbove the cap
Free1M events / month30 daysLast 24 hoursStorage stops at the cap until the next period
Pro10M events / month12 monthsLast 7 days$3 per additional million
Team50M events / month24 monthsLast 30 days$3 per additional million
EnterpriseCustom volumeCustom, up to 7 yearsCustomCommitted volume, invoiced annually
The same per-event limits apply on every plan: up to 250 properties per event, 32 KB per event, 100 events per batch, and event names up to 64 characters. Nothing is silently truncated — oversized events are rejected with an error you can see in the stream.

Plan prices and the full comparison live on the pricing page.

Ship one event and watch it land

Install the SDK, send a single track() call, and the live stream will show it within seconds.

1M events a month on the free plan, no credit card.