For events that aren’t part of the canonical lifecycle set, useDocumentation Index
Fetch the complete documentation index at: https://docs.vibefollow.com/llms.txt
Use this file to discover all available pages before exploring further.
events.track(). The name is accepted as-is — the backend validates only that it’s a non-empty string.
Single events
The 9 canonical lifecycle names work through
track() as well, but prefer the typed helpers in vf.users.* for autocomplete and type safety.Naming conventions
Event names: snake_case
Event names: snake_case
Use
dashboard_created, not DashboardCreated. Stable across audience filters and triggers.Use stable identifiers, not labels
Use stable identifiers, not labels
Renaming an event breaks any audience filter that already references the old name. Treat event names like database column names — pick once, live with it.
Properties: camelCase keys
Properties: camelCase keys
Use
workspaceId, not workspace_id. The backend normalises both to the same column, but consistency in your own code is worth holding the line on.Batch tracking
For high-volume work — backfilling historical events, syncing from a data warehouse, replaying a Segment export — useevents.batch() to amortise HTTP overhead:
- The queue reaches
maxSizeevents (default100), or maxAgeMshas elapsed since the first queued event (default5000), or- You call
flush()explicitly.
Trade-offs
events.track() | events.batch() | |
|---|---|---|
| Latency | Per-event POST | Buffered, drains in one POST |
| Failure mode | Single event fails | Full batch retried |
| Use when | Real-time interactive flow | Backfills, sync jobs, write-heavy paths |
Batches are not idempotent across drains — if the POST fails midway through retries, the batch may be partially accepted server-side. Re-emit conservatively or set a retention-policy filter on your end to dedupe by event ID.
Reserved names
Reserved-name routing is an API-side concern, not the SDK’s. Custom names that happen to collide with a future reserved name will be rejected at validation with
ValidationError — you’ll know immediately.