Documentation

Up and running
before your coffee

Search the docs… ⌘K

Quickstart

Three steps, about five minutes. You need a project key, which lives in Settings → Sources in your workspace. Public keys start with pk_ and are safe to ship in client code; server keys start with sk_ and are not.

  • Add the snippet to your layout — auto-capture starts immediately
  • Call identify() once you know who the user is
  • Track the two or three events that define activation for your product
You do not need to instrument anything to see your first chart. Auto-capture records page views, clicks on interactive elements and session boundaries out of the box — custom events are for the things auto-capture can't know, like a plan upgrade.

Install the SDK

Pick whichever fits your stack. All four clients share the same queueing behaviour: events are batched every two seconds, persisted across reloads, and retried with backoff for up to 48 hours.

<!-- add to your <head>, above other scripts -->
<script
  src="https://cdn.cadence.dev/v2/c.js"
  data-key="pk_live_8f2c41d9e7"
  data-region="eu"
  async></script>

Identify users

Until you call identify(), Cadence tracks an anonymous ID stored in a first-party cookie. When you identify, every event that anonymous ID ever sent is stitched onto the real user — retroactively, including the sessions before signup.

cadence.identify('u_1842', {
  email: 'nora@northwind.co',   // hashed at the edge
  plan: 'team',
  company_id: 'org_204',
  signed_up_at: '2026-03-14'
})

// group calls attach the user to an account
cadence.group('org_204', { name: 'Northwind', seats: 180 })

Track events

An event is a name plus a flat object of properties. Keep names in the past tense and lower snake case; keep property values scalar. Nested objects are flattened one level and arrays are stored as JSON, which makes them awkward to break down by — so prefer a separate event.

good
cadence.track('checkout_completed', {
  plan: 'business',
  seats: 12,
  amount_cents: 18300,
  currency: 'GBP',
  trial: false
})
avoid
cadence.track('Checkout', {          // tense and case drift
  data: { plan: { id: 3 } },      // nested, hard to break down
  items: ['a', 'b', 'c'],         // array, stored as JSON
  ts: Date.now()                   // Cadence stamps this already
})

Naming conventions

This is the only part of setup that's genuinely worth arguing about, because renaming later is cheap in Cadence but expensive in everyone's head. The rules we suggest:

  • object_verb, past tenseboard_created, not create_board or Board Created
  • One event per meaning. If you need an if to read the chart, split it into two events
  • Properties describe the event, traits describe the person. Plan goes on the user; the plan they were on at purchase goes on the event
  • Never put a value in the name. plan_upgraded with plan: 'business' beats upgraded_to_business

Cadence flags near-duplicates automatically and offers to merge them. Merges apply to historical data too, so cleaning up in month three doesn't cost you month one.

Warehouse import

Connect Snowflake, BigQuery or Redshift read-only and Cadence will pull modelled tables on a schedule. This is how you get retention curves that start before your install date.

ColumnTypeRequiredNotes
event_namestringYesMapped through the same naming rules as SDK events
user_idstringYesMust match the ID you pass to identify()
occurred_attimestampYesUTC. Rows older than your retention window are skipped
propertiesvariant / jsonNoFlattened one level on ingest
_row_hashstringNoSupply it and re-syncs become idempotent

Sensitive data

Mark a property sensitive and it is hashed or dropped at the edge — before it is written to storage, not after. Session replay masks every input value by default; you opt individual fields in.

Cadence scans incoming properties for things that look like emails, card numbers and access tokens, and quarantines them automatically even if you forgot to mark the field. You get one notification, not a daily digest of shame.

Where to go next

Get started

Ship on Monday.
Understand it by Tuesday.

Free for 30 days on the full product. Five-minute install, no card, no onboarding call unless you want one.

  • SOC 2 Type II
  • EU & US data residency
  • Cancel in one click