The SDK version is exported as
SDK_VERSION and flows into the User-Agent header on every request — the backend can flag outdated clients.- latest
- beta
This page mirrors
packages/sdk/CHANGELOG.md — the npm package’s CHANGELOG.md is the canonical record.Changed
- Breaking:
users.trialExpiring(userId, { trialDays })— the property was renamed fromdaysLefttotrialDays. The livetrial_expiringtrigger readsproperties.trialDays; the previousdaysLeftwas silently ignored, so the helper never actually drove the trigger. TypeScript callers passing{ daysLeft }get a compile error and must rename to{ trialDays }. In practice you rarely need this helper — the trigger is derived automatically from the most recenttrial_startedevent’strialDays, so callingtrialStarted(userId, { trialDays })once is enough.
- The README and an internal
events.tscomment described “canonical 9” lifecycle events; corrected to 10 to matchpackage.jsonandSTANDARD_EVENT_NAMES. (The 10th helper,usageThresholdReached, shipped in 1.2.0; the prose lagged.)
- “Importing existing customers from Stripe”: founders with billing in Stripe can paste a read-only restricted key in the dashboard (Import → Stripe) for a one-time backfill of customers and subscription/invoice history as canonical lifecycle events, with welcome emails suppressed — a dashboard integration, not an SDK call.
2.0.0 is reserved for removing the deprecated AIFollowups alias, and the break is confined to one rarely-used helper (flagged above).Added
events.batch({ suppressTriggers: true })— opt-in trigger suppression for historical seeding. EveryTrackedUsertouched by a suppressed batch getssuppressTriggersUntilset to a far-future date server-side, so trigger rules (welcome, onboarding_stall, etc.) won’t fire retroactively when you’re migrating customers into Vibefollow from an existing user base. The watermark dissolves automatically the first time the user emits a normal (non-suppressed) event — one-batch switch back to live mode.POST /api/v1/events/batchrequest body now documents the optionalsuppressTriggersfield with a “seeding historical users” cURL example.
fire_welcome_emails: false; this brings the realtime API in line.Backwards compatibilityFully additive. Calling events.batch() with no options (or with the prior { maxSize, maxAgeMs } shape) sends suppressTriggers: false and behaves identically to 1.2.x. The server defaults missing field values to false, so older SDK versions remain compatible.Changed
package.jsondescriptionnow explicitly names the 10 typed lifecycle helpers, thechunk()utility, automatic retries, the typed error hierarchy, and edge-runtime support. The previous wording understated v1.2.0 by stopping at “identify users, emit lifecycle events, bulk-backfill from existing data, and verify webhook signatures” — accurate but missing half the surface a discovery search would care about.keywordsextended withwebhooks,ai,claude,revenue-managerfor npm discovery.
User-Agent header bumps from vibefollow-sdk/1.2.0 → vibefollow-sdk/1.2.1 so backend logs reflect the new patch.Added
users.identifyBulk(records)— upsert up to 1,000 users in one POST. ReturnsBulkIngestResponsewith per-record validation errors so a single bad row never sinks the batch. Idempotent via the existing(project_id, external_user_id)unique ontracked_users; chunks that 429 or 5xx are safe to retry.events.bulk(records)— same shape for events. Idempotent via the server-sideevents_dedupe_uniquepartial index; reimporting the same backfill twice is a no-op.chunk(input, size)— exported generator that slices large arrays into ≤size slices for backfills > 1,000 records. Doesn’t materialise the source twice, so 5M-row backfills stay flat-memory.- New bulk types:
BulkUserRecord,BulkEventRecord,BulkIngestError,BulkIngestResponse, plus theBULK_INGEST_MAX_RECORDS = 1000constant. - New API reference pages:
POST /api/v1/users/bulkandPOST /api/v1/events/bulk.
identify() / track() for live writes and events.batch()’s in-memory buffer for high-volume streaming — both made backfills awkward. Bulk closes the gap: one POST per 1,000 records, partial-success error reporting, and chunk() so a 50k backfill is a 50-iteration for loop with predictable memory.Backwards compatibilityFully additive. The legacy events.batch() in-memory buffer and the /api/v1/events/batch endpoint behind it remain supported.Added
users.usageThresholdReached(userId, { usagePercent, meter?, limit? })— 10th typed lifecycle helper. Emitsusage_threshold_reached, the canonical event consumed by the backend’splan_limit_upselltrigger rule.STANDARD_EVENT_NAMESnow contains 10 entries (was 9);StandardEventNametype updated transparently.
Changed
package.jsonhomepagerepointed fromhttps://vibefollow.comtohttps://docs.vibefollow.com/sdk/overviewnow that the docs site is live.bugs.urlremainshttps://vibefollow.comuntil thesupport@vibefollow.commailbox is provisioned.
Fixed
package.jsondescriptionbrand casing:VibeFollow→Vibefollow(the SDK class identifierVibeFollowstays unchanged; only marketing prose was corrected).package.jsonhomepagewashttps://docs.vibefollow.com/sdk(DNS unresolvable at publish time) — nowhttps://vibefollow.com.- Explicit
bugs.urlpointing athttps://vibefollow.comso npm’s auto-derivation no longer produces agitlab.com/.../issuesURL that leads to a sign-in wall. - README prose now uses
Vibefollowconsistently; code identifiers, env var names, and class names are unchanged. - Header literal corrected from
X-VibeFollow-SignaturetoX-Vibefollow-Signatureto match what the emission backend actually sends. HTTP headers are case-insensitive on read, so this is a documentation correction — verification continues to work for clients on1.0.0.
Added
VibeFollowclass withusers,events, andwebhooksresources.- 9 typed lifecycle helpers on
vf.users.*(signedUp,trialStarted, …). events.track()for custom events andevents.batch()for buffered emission.webhooks.constructEvent()for signed delivery verification.- Typed error hierarchy:
AuthError,ValidationError,RateLimitError,ServerError,NetworkError,WebhookSignatureError. - Auto-retry with exponential backoff plus jitter on transient failures.
- Auto-
Idempotency-Keyon every POST. - Edge-runtime support: Node 20+, Cloudflare Workers (with
nodejs_compat), Vercel Edge, Deno.
POST /api/v1/users— upsert userPOST /api/v1/events— track eventPOST /api/v1/events/batch— batch track events