vTilt
By roleFoundersKnow what to fix firstMarketersSee what happens after the clickCMOsSee what your budget really buys
By businessSaaSTurn signups into active usersEcommerceSee why shoppers abandon cartsAgenciesProve your work to clientsEnterpriseOne customer record for every team
MeasureWeb AnalyticsFind where buyers leaveSession ReplaySee why they left, not just that they didAdsKnow what paid visitors do nextIntegrationsOne snippet feeds your stack
ThinkPeopleOne profile per customerCustomer MemoryvTilt remembers every visitorSite KnowledgeAnswers and audits from your own pages
ActAsk AIAnswers from real behaviorAI ChatChat that knows the visitorEmail CampaignsEmail from real visits
PricingWhy vTiltDocs
Docs / Feature readiness
Getting Started
OverviewInstallInitializeIdentify usersTrack eventsLogout & resetVerify eventsCommon mistakes
Guides
Event forwardingReverse proxyRealtime dashboardSite knowledge
Frontend frameworks
Next.jsNuxt.jsVue.jsReactReact RouterRemixGatsbySvelte / SvelteKitAstroAngularTanStack StartDocusaurus
Backend frameworks
NestJSHonoCloudflare WorkersDjangoFlaskLaravelPhoenixRuby on Rails
Backend languages
PythonPHPRubyElixirGoJava.NET / C#Rust
Stack guides
Vue + PHP
API Reference
Browser SDK
Script bundlesAutocaptureWeb VitalsSession recordingChat widgetFeature readinessRemote configurationDebug logging
Node SDK
Install & setupCapture, identify & aliasContext & shutdownGlobal properties & opt-outError tracking
MCP server
Guides
OverviewAuthenticationOAuthAgent skills (prompts)AI intelligenceSite knowledgeGoogle AdsMeta Ads
Client setup
CursorClaude DesktopVS CodeCodex

Getting Started

OverviewInstallInitializeIdentify usersTrack eventsLogout & resetVerify eventsCommon mistakes

Guides

Event forwardingReverse proxyRealtime dashboardSite knowledge

API Reference

Script bundlesAutocaptureWeb VitalsSession recordingChat widgetFeature readinessRemote configurationDebug logging

MCP server

On this page

On this page

  • SDK initialised
  • Early calls are safe
  • How it works
DocsAPI ReferenceBrowser SDKFeature readiness

Feature readiness

Last updated July 22, 2026

SDK lifecycle — when features are ready, how calls queue, and how to wait for full initialisation.

Every SDK method is safe to call at any time after vt.init(). The SDK queues calls internally and applies them in order when each feature is ready. No timing hacks needed.

#SDK initialised

The sdk:initialized event fires after DOM boot, feature start, and the initial config load. This is the single lifecycle hook for "SDK is fully wired".

import { vt } from '@v-tilt/browser'

vt.init('YOUR_PROJECT_TOKEN', { api_host: 'https://www.vtilt.com' })

// Features are constructed during init(). sdk:initialized fires after boot + start.
vt.on('sdk:initialized', () => {
  console.log('SDK ready — features started')
})
typescript

#Early calls are safe

Feature methods like vt.openChat() and vt.showChat() queue internally before the feature is ready. They flush automatically in call order — no promises or await needed.

import { vt } from '@v-tilt/browser'

vt.init('YOUR_PROJECT_TOKEN', {
  api_host: 'https://www.vtilt.com',
  chat: { enabled: true, bubble: { visible: false } },
})

// Safe immediately after init — calls queue until the feature is ready.
vt.showChat()
vt.hideChat()
vt.openChat()
typescript

#How it works

Several internal layers queue work so public API calls never get lost:

  1. Boot gate — queues calls made before DOMContentLoaded.
  2. Feature deferral — queues calls until async initialisation completes (e.g. chat settings fetched).
  3. Lazy load — queues calls until the external script loads.
  4. Remote config + ingest — vt.capture() events buffer for HTTP until __remote_config_loaded (see Event tracking). Google Tag uses the same flag before installing gtag, with a capped pre-commit queue only; after that, dataLayer orders calls until gtag.js is ready.

Implementation details live in the repository under docs/patterns/tracker-feature-lifecycle.md.

PreviousChat widgetBrowser SDKNextRemote configurationBrowser SDK