travel agents
You’ve opened this hotel twice and checked the reviews both times. The thing most guests mention is noise from the street. Want me to find quieter alternatives nearby?
Turn session behaviour into live context your agent can read at any point, and subscribe to the cues that tell it when to act. Its replies stay connected to what the user just did, and land at the right moment.
“Customers don't resent AI. They resent wasted effort. When AI loops, blocks access to a human, or forces people to repeat themselves, trust erodes.”
Gladly + Wakefield Research, 2026
contextune works best for customer-facing AI agents inside an existing UI. It reads what a real person is doing in the browser, so it earns its keep wherever a human is on the other side of the agent.
You’ve opened this hotel twice and checked the reviews both times. The thing most guests mention is noise from the street. Want me to find quieter alternatives nearby?
Hi - it seems your cart may have expired while you were checking out. Want me to restore it and keep the same items?
Looks like the payment went through, but the confirmation page didn’t load. Would you like me to check whether the order was created?
You’ve switched back to the Retention dashboard three times this week without changing the date range. Want me to show what moved for that segment since your last visit?
Call init() with your analytics source (GA4, Segment, or Mixpanel) and the snapshot fills from events you already send. Runs entirely in the browser, no collector to deploy.
Pull a snapshot when your agent replies, or subscribe to a cue and push the moment it lands. Same profile, your call on the timing.
Drop the snapshot into your system prompt. Your agent now sees what the user was doing.
import { Contextune } from '@contextune/sdk'
// Initialize — tap your existing analytics stream
Contextune.init({ source: 'ga4' }) // or 'segment' | 'mixpanel'
// Pull: read a snapshot whenever your agent replies
const snapshot = Contextune.getSnapshot()
// Push: or fire the moment a cue lands
Contextune.subscribe(e => e.name === 'rage_click', reachOut)
// Inject into your system prompt
const systemPrompt = `
You are a helpful shopping assistant.
Live behavioral context:
${JSON.stringify(snapshot, null, 2)}
Use this context to understand the user's intent.
`It runs client-side with no round trip. getSnapshot() is a synchronous read from in-memory state, sub-millisecond on a populated engine.
Nothing leaves the browser when you read the snapshot. The behavioural profile is maintained in the user's session, and you inject it into the system prompt at the moment you call your model. There is no collector hop and no network round trip between the behaviour and the decision.
MIT-licensed, with no account to create and nothing metered. Drop it into your own app and keep the data where it already lives.
Today it runs entirely in your application, with nothing to provision and nothing to bill. The hosted state layer is the paid product later; you opt in when you need it. Until then the integration is an install and one call to init().
In an open benchmark, the same agent solved 15 of 16 tasks when it could read the user's behaviour, and 5 of 16 when it could only see the current page.
We held the model fixed and changed only what it could see: the full behavioural snapshot, the current page alone, or nothing. The behavioural agent answered the tasks that depend on what the user did over time, the ones a page-aware agent has no way to reach.
No. Zero network egress from the SDK itself. The behavioural profile is built and maintained in memory in the user's session, and getSnapshot() is a synchronous read with no fetch and no beacon.
If you bring your own event source (Segment, GA4), that source will keep making its own network calls. The contextune SDK does not.
It intercepts, it doesn't replace. Point the SDK at your existing source (source: 'ga4', 'segment', or 'mixpanel') and it taps that provider's traffic, normalises the events you're already firing, and folds them into the snapshot.
Your dashboards keep working. The agent gets the same cues, structured.
The SDK is a bundled dependency, not a remote script. It doesn't inject <script> tags or make cross-origin requests of its own, so strict CSPs pass.
If you've wired in an external event source, allow that source's domain in your CSP. That part isn't ours.
Not yet. The capture surface depends on browser-only APIs such as visibilitychange and AbortController. A React Native build would be a separate target with a different cue set.
Mobile web works the same as desktop web. If you're shipping a PWA, you're covered today.
~13KB minified, ~4–5KB gzipped. No peer dependencies. The ESM build tree-shakes, so source plugins you don't use don't ship.
A typical snapshot in the prompt runs 1–3KB of JSON. Configurable per block, and you can serialise it as TOON ↗ instead for fewer tokens if you're token-sensitive.
Any evergreen browser. The SDK needs fetch, sendBeacon, and XMLHttpRequest; each capture patch is installed only when its API is present and skipped when it isn't.
Older browsers fail silently. Your app keeps working and the snapshot is just empty.