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.2026-06-08 — `trial_expiring` property fix + 10-event doc consistency + Stripe import guide
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).2026-05-28 — `suppressTriggers` flag on `events.batch()`
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.2026-05-25 — npm description + keywords cover the 10th helper
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.2026-05-22 — bulk endpoints + chunk() helper for backfills
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.2026-05-19 — usage_threshold_reached canonical event
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.
2026-05-18 — homepage repointed to docs site
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.
2026-05-17 — metadata + prose casing fix
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.
2026-05-17 — initial public release
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