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 / Logout & reset
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

MCP server

On this page

On this page

  • When to call resetUser()
  • SPA pattern (client session hook)
  • Server-rendered apps
  • Quick reference
  • Next step
DocsGetting StartedLogout & reset

Logout & reset

Last updated July 22, 2026

Call resetUser() only on real sign-out — never on anonymous page loads. Covers SPA guards and server-rendered logout handlers.

resetUser() clears the cached identity and generates a fresh anonymous $device_id on the next event. Use it only on real sign-out — when someone who was logged in is no longer the active user.

Important

Never call resetUser() on every page load just because user is null. Anonymous visitors must keep their persisted $device_id. See Common mistakes.

#When to call resetUser()

Call resetUser() only when all three are true:

  1. Auth/session loading has finished (loading === false).
  2. Your app has no signed-in user (user is null — they signed out or the session expired).
  3. The SDK still holds the previous login: vt.getUserState() === 'identified'.

If (1)–(2) hold but (3) is false, the visitor was never logged in — do nothing.

#SPA pattern (client session hook)

// WRONG — wipes anonymous visitors on every reload
useEffect(() => {
  if (!user) window.vt?.resetUser()
}, [user])

// CORRECT — reset only after real sign-out
useEffect(() => {
  if (authLoading) return

  const vt = window.vt
  if (!vt) return

  if (user?.id) {
    vt.identify(user.id, { email: user.email, name: user.name })
  } else if (vt.getUserState() === 'identified') {
    vt.resetUser()
  }
}, [authLoading, user])
typescript

In an explicit logout button handler, you may call vt.resetUser() directly — the reactive guard above covers session expiry without a dedicated navigation.

#Server-rendered apps

When the layout reads the session on the server and passes currentUser to the client:

  • Identify after vt.init() from window.__currentUser or a server-passed prop on every page load.
  • Reset in the logout handler only — never in a reactive effect when user is null.

#Quick reference

How the app knows the userWhere to identify()When to resetUser()
Server renders user on every HTML responseAfter vt.init() from server-passed userLogout handler only
Client session hook (Clerk, Supabase, …)useEffect after loading === falseloading === false and user is null and getUserState() === 'identified'
Login handler only (anti-pattern)—Never rely on this alone

Stack-specific examples: Identify users → Real-world examples.

#Next step

Verify events after wiring identify and logout.

PreviousTrack eventsGetting StartedNextVerify eventsGetting Started