Product analytics · 3 min read · Updated 2026-09-21
Events and properties
Four kinds of call, one envelope, and a property bag you control. Naming is the only hard part.
There is no schema to design here and no pipeline to run. You make one of four calls, Talaria fills in the envelope, and the row lands in ClickHouse. The part that needs thought is not the plumbing — it is what you call things.
The four kinds
track— a named thing someone did. This is the one you will use most. The name is required.page— a web pageview. Defaults to the name$pageview.screen— a mobile or desktop screen view, defaulting to$screen. On the web it is mapped to a pageview for you.identify— binds the current anonymous visitor to a user id. Covered in Visitors, sessions, and identify.
Talaria.analytics.track('add_to_cart', {
sku: 'TR-900',
price: 129,
size: 'M',
});
Talaria.analytics.page(); // $pageview for the current URL
Talaria.analytics.page('Pricing'); // named pageview
Talaria.analytics.track('plan_upgraded', { from: 'team', to: 'business' });What every event carries for free
You pass a name and some properties. The SDK attaches the rest, which is why analytics events are useful long after you wrote the call:
- Identity —
anonymousId,sessionId, anduserIdonce the visitor has been identified. - Page context —
url,path,title, andreferrer, with sensitive query parameters already stripped. - First-touch campaign — the five UTM fields captured when the session began. See UTM and attribution.
- Build context —
platform,environment(stamped from the API key), andrelease(the version or SHA the SDK sends). - Correlation —
replayId,traceId, andspanIdfor whatever was in flight when the event fired. - Runtime — parsed browser name and major version, OS, device class, locale, timezone, and traffic class (
human,crawler,ai_crawler,ai_agent,automation). Country and region are added at ingest from GeoIP; the IP and raw User-Agent are discarded.
Event detail
storefront
Properties
{ sku: 'TR-900', price: 129, size: 'M' }
Identity
- anonymousId
- a7f3…c1
- sessionId
- s_9d2…4e
- userId
- user_123
What happened
- name
- add_to_cart
- kind
- track
- timestamp
- 2026-09-21T09:14:02Z
Page context
- path
- /products/trail-runner
- referrer
- https://google.com
- utmCampaign
- spring-sale
Correlation
- replayId
- rpl_4c8…
- traceId
- 4bf92f35…
- release
- 1.4.2
Naming that survives a year
Event names are effectively permanent. Once three dashboards, two funnels, and a quarterly report use Checkout Started, renaming it to checkout_started means a gap in your history. Pick a convention on day one and write it down.
- Use
object_verbin past tense:cart_updated,invite_sent,order_completed. It sorts sensibly and reads as a fact. - Keep names low-cardinality. The product id belongs in a property, never in the name —
product_viewedwith{ product_id }, notproduct_TR900_viewed. - Reserve the
$prefix for Talaria.$pageview,$screen, and$identifyare the built-in defaults. - Name the user intent, not the implementation.
signup_completedoutlives the component that fired it;submit_button_clickeddoes not.
Properties
Properties are a flat JSON map you attach to an event. Use them for the dimensions you will want to slice by later: plan, currency, variant, step, count. Keep values scalar — numbers, booleans, and short strings — because anything else is coerced to a string on the way in.
The limits are enforced on the server, not the client:
- At most 64 keys per event. Extra keys are dropped.
- String values longer than 1024 characters are truncated at 1024.
- If the whole property map exceeds 16 KB of JSON, the entire map is discarded — the event itself is still stored, without properties.
Oversized properties do not get partially trimmed; they get dropped whole. Do not put a serialized cart, a stack trace, or an HTML blob in a property.
What gets stripped before storage
Some keys never make it to disk, no matter what you pass. The server drops properties named password, passwd, secret, token, api_key, apikey, access_token, auth, authorization, cookie, email, credit_card, card_number, and ssn.
URLs get the same treatment on both sides: the browser replaces secret and click-id query parameters before sending, and the server redacts them again on arrival.
Related guides
Product analytics · 4 min
What product analytics actually isError tracking tells you what broke. Product analytics tells you what people were trying to do — and how many of them gave up.
Product analytics · 3 min
Visitors, sessions, and identifyThree ids doing three different jobs. Get them straight and every number downstream makes sense.
Product analytics · 4 min
Privacy and consentAnalytics is the part of observability most likely to end up in a privacy review. Here is exactly what Talaria stores, and what it refuses to.