Skip to main content
Outlit builds a customer context graph from every customer interaction — website visits, product usage, billing events, and more. Here’s how data flows from collection to queryable context.

1. Collect

Data enters the graph from multiple sources: Browser SDK — The primary data source for most teams. Once installed, it automatically captures pageviews, form submissions, engagement time, UTM attribution, and company enrichment via IP lookup. No additional code needed for these basics. This is the only way to get website visitor tracking — anonymous visit capture, auto-identification from forms, and pre-signup journey attribution. Server SDK — For backend events where users are already authenticated: subscription lifecycle events, API usage, report generation, and anything that happens outside the browser.

Integrations

Stripe — Billing events sync automatically. Subscription status changes (trialing, active, canceled) update account billing status in real time. PostHog — Product usage sessions feed into the graph, contributing to automatic engagement and inactivity detection. If you already use PostHog for product analytics, this is a great complement to the Outlit browser SDK. However, PostHog alone won’t give you website visitor tracking — you need the Outlit browser SDK for anonymous visit capture, form auto-identification, and pre-signup attribution. Slack — Messages, reactions, and thread context from customer-facing channels. Gmail — Email threads, sender history, and attachment context. Fireflies.ai — Call transcripts, action items, and meeting summaries. Google Calendar — Meetings, attendees, and scheduling patterns. Supabase Auth / Clerk — User identity, sign-up source, org membership, and auth events. These complement the browser SDK’s auto-identification with server-side identity signals.
Browse all available integrations and connect them from your dashboard at app.outlit.ai/integrations.

2. Resolve

Most visitors browse your site anonymously before identifying themselves. Identity resolution bridges that gap:
  1. Anonymous phase — Outlit generates a visitor ID and tracks behavior from the first pageview
  2. Identification trigger — A visitor submits a form with their email, signs up, or logs in
  3. Profile linking — The anonymous visitor’s entire history is connected to their contact profile
  4. Cross-device merging — When the same person identifies on multiple devices, profiles merge automatically
This happens without code when forms contain an email field (auto-identify). For JavaScript-based auth, call identify() after login.
For details on the anonymous phase — what’s captured, how visitor IDs work, and company enrichment — see Website Visitors.

3. Build the Graph

As data flows in and identities resolve, Outlit structures it into three layers:

Entities and relationships

  • Visitors — Anonymous browsing sessions, identified by visitor ID or device fingerprint
  • Contacts — Known people, identified by email and/or user ID
  • Accounts — Companies, identified by domain, with billing status from Stripe
Visitors link to contacts via identity resolution. Contacts belong to accounts via email domain matching. All activity flows into a unified timeline per contact and account.

Activity timeline

Every interaction from every source is stored chronologically — pageviews, form submissions, SDK events, Stripe charges, Slack messages, email threads, call transcripts. The timeline shows what happened with full detail and original timestamps.

Facts

Facts are temporal assertions that Outlit maintains about each customer. While the activity timeline captures what happened, facts capture what it means — the reasoning layer that makes the graph intelligent. Outlit generates facts from three sources:
  • Behavioral facts — Automatically detected from activity patterns. When a customer’s core usage drops, an activation rate changes, or an expected activity pattern breaks, Outlit surfaces it as a fact with severity and context.
  • Extracted facts — Parsed from unstructured sources like Slack messages, email threads, and call transcripts. Outlit identifies signals like churn risk, expansion opportunities, competitive evaluations, champion changes, and timeline commitments.
  • Synthesized facts — Derived by correlating multiple observations. For example, a key contact going quiet + a competitor mention in Slack + declining product usage = a churn risk fact with full reasoning.
Every fact has temporal validity — a validFrom date and an optional expiration. As new activity flows in, facts are automatically validated or invalidated. A “contract renews in March” fact expires after March. A “customer is evaluating competitors” fact gets resolved when they renew. This temporal reasoning means the graph always reflects the current state of each customer relationship, not stale snapshots.

Journey stages

Journey stages are properties maintained on graph entities:
  • Contacts carry a journey stage: Discovered → Signed Up → Activated → Engaged → Inactive
  • Accounts carry a billing status: None → Trialing → Paying → Churned
The Outlit browser SDK auto-detects Discovered (email known, no userId) and Signed Up (both email and userId provided). Engaged and Inactive are auto-inferred from product activity via PostHog or your SDK. Activated is the one stage you call manually — user.activate() — because the definition of activation is specific to your product. Billing statuses update automatically when Stripe is connected.
For the full breakdown of journey stages and billing statuses, see Customer Journey.

4. Query

The complete graph is accessible through three interfaces:

CLI

# List paying customers sorted by revenue
outlit customers list --billing-status PAYING --sort mrr

# Get a customer profile with timeline
outlit customers get acme.com --include users,revenue,timeline

# Natural language search
outlit search "customers who signed up from Google Ads last month"

# SQL
outlit sql "SELECT domain, mrr_cents FROM customers WHERE billing_status = 'PAYING'"

AI Agents (MCP)

Configure your AI agent to query customer context directly:
outlit setup --yes
Then in Cursor, Claude Code, or VS Code, your AI agent can ask questions about customers, get timelines, search context, and run SQL — all powered by the same graph.

REST API

For custom integrations, the Ingest API accepts events from any source, and query endpoints expose the graph programmatically.

Privacy and Security

Form Sanitization

Sensitive fields (password, SSN, credit card) are automatically stripped from form submissions.

Domain Allowlist

Configure which domains can send events to prevent unauthorized tracking.

No PII in URLs

Query parameters with sensitive patterns are automatically redacted.

GDPR Ready

Built-in support for consent management, data deletion, and export requests.

Frequently Asked Questions

The browser SDK automatically captures pageviews, form submissions, engagement time, UTM attribution, and company enrichment. Identity is auto-detected from forms with email fields. You only need to manually call identify() for JavaScript-based auth (OAuth, magic links), user.activate() for activation milestones, and track() for custom business events.
Browser and server SDK events appear within seconds. Stripe webhooks process within minutes. PostHog syncs run on a configurable schedule.
Yes. The browser SDK alone gives you website tracking, identity resolution, and journey stages. Each integration adds more signal but none are required.

Next Steps

Quick Start

Install the CLI and add tracking in 5 minutes

Customer Context Graph

Deep dive into the unified data model

Identity Resolution

How profiles are linked across devices and sources

Customer Journey

Journey stages and billing statuses explained