Ask your analyticsanything
Product analytics and engagement for mobile and web, with an AI assistant on every page that answers from your own numbers and drafts the next step — on your own infrastructure, or free in our cloud.

Of 709 visits, only 36.8% get past the first intro screen — the biggest loss. Overall conversion is 16.8%, down 3.8 pts.




From a question to the next step, with you in charge
Ask in plain words. It reads the same routes the pages do, with your own permissions, answers with charts you can drill into, and drafts segments, funnels and campaigns as cards — nothing changes until you approve.
Try it on your dataI drafted a journey: Pro customers wait until 7 days before plan_renews_on, then get the renewal push in their own language. Quiet hours and your message limits apply.
- Your numbers, not its guessesEvery figure comes from the platform’s own routes, called with your token — no back door.
- Nothing runs unseenSegments, funnels, templates and campaigns arrive as cards with their exact request; approving runs it as you.
- Click to dig deeperClick any value on a chart for drill-downs, or “Ask about this”.
- Your model, your dataA self-hosted model sees what you allow; one someone else runs never sees a property marked sensitive.
- While you are awayDigests and watches run on their own and mail you the answer. Claude Code and Claude Desktop can ask the same questions over MCP.
One product, from a bank’s data centre to a solo developer’s first app
The same features everywhere. What changes is where it runs and who runs it.
Analytics that stays inside your walls
Measure onboarding, product use and retention, and send policy renewals, price alerts and order updates — without a customer’s data leaving the infrastructure you control.
- Your infrastructureThe same images run on your own servers. No managed service sits in the data path.
- Less personal dataLocation comes from the IP address at ingestion; the address itself is never stored.
- Your model, your rulesRun the assistant on a self-hosted model; properties marked sensitive never reach one someone else runs.
- Every action on recordOwners, admins and members per workspace, and every assistant action logged.
Everything, free, from your first install
Add the SDK, ship, and see which levels lose players and which pushes bring them back.

- One workspace free, with every feature
- SDKs for Android, iOS and Flutter
- Funnels, retention and push from day one
From a tap in your app to a chart in seconds
Each event is checked against your catalog on the way in, buffered in Kafka and stored in ClickHouse — the same proven parts whether we run it or you do.
- Your app or siteAn SDK, or the HTTP API on the web
- IngestionChecked against your catalog
- KafkaBuffered on the way in
- ClickHouseEvery event, queried in place
- DashboardPages, segments and the assistant
See what people do, counted once per person
Overview, events, funnels, retention, flows and sessions. A customer is one person across every device and sign-in, so someone who switches phones is never counted twice.
Start with one workspace
Any event, in depth
Its trend against the previous period, a breakdown by any property, device or city, and every page narrowed to a segment of people in one click.
Live, as it arrives
The Realtime page refreshes every 15 seconds, with a dot for every city on the map.
instrument_viewedsymbol: stringAcceptedorder_createdsymbol, direction, priceAcceptedorder_placednot in the catalogHeld asideClean data by design
Every event is declared before it is sent. An undeclared one is held aside to fix, never mixed in.
One person, every device
Anonymous visits join the account they sign in to, and traits keep their history, so “was on Pro 30 days ago” is a question you can ask.
One platform, from the first event to the last message
Reach customers, then see what it changed
Push campaigns and multi-step journeys over your own segments, with quiet hours, message limits and topics customers choose — and a control group to prove it worked.
Build your first journeyJourneys on a canvas
Start on an event, a segment, a schedule or a call from your backend; wait for a time or for a date on the customer — a renewal, a policy end — then split, loop and send.
AAPL reached your $190 alert.
Topic: price alerts · opted in
Messages customers asked for
Each customer’s time zone, quiet hours, a cap across campaigns, and topics they can opt out of.
A report of what moved
A control group is held back from every campaign; the report compares its goal with everyone else’s.
POST /v1/transactional/order_filled/send Authorization: Bearer ana_send_… {"idempotency_key": "order_filled:4471", "recipients": [{"user_id": "8812", "params": {"symbol": "AAPL", "qty": 10}}]} → 202 8812: found · 2 devices
Send from your core systems
Order filled, payment received, policy issued: your own services send a saved message by customer id with a send key, through a fast lane that skips the campaign rules — and learn at once who has a device to reach.
A few lines in your app. Or one call from the web.
Sessions, screen views, installs and push are tracked by the SDK; your own events are one call each. Offline events wait on the device and send when it reconnects. On the web, your code posts the same JSON with the app’s web ingest key.
Analytics.initialize(this, AnalyticsConfig( apiKey = BuildConfig.ANALYTICS_API_KEY, endpoint = "https://ingest.funnel-base.com", )) Analytics.track("instrument_viewed", mapOf("symbol" to "AAPL"))
Analytics.initialize(AnalyticsConfig( apiKey: key, endpoint: "https://ingest.funnel-base.com" )) Analytics.track("instrument_viewed", properties: ["symbol": "AAPL"])
await Analytics.initialize(const AnalyticsConfig( apiKey: key, endpoint: 'https://ingest.funnel-base.com', )); Analytics.track('instrument_viewed', {'symbol': 'AAPL'});
// the HTTP API every SDK uses, with your app's web ingest key await fetch('https://ingest.funnel-base.com/v1/events', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Api-Key': webKey }, body: JSON.stringify({ sdk_name, sdk_version, sent_at, events: [{ event_id, event_name: 'instrument_viewed', occurred_at, properties: { symbol: 'AAPL' }, session_id, anonymous_id, device_id, device: { platform: 'web', … }, }] }), })
Runs where your data has to stay
The same images in every case: no feature is cloud-only, and nothing managed sits in the data path.
Cloud
We run it for you. Start free with one workspace — the way most indie apps begin.
Dedicated
Your own stack, run by us, for teams that need their data kept apart from everyone else’s.
On-prem
The same images in your own data centre, for banks and insurers whose data must never leave it.
Ask your first question today
Add the SDK, send your first events and ask the assistant what they say — free in our cloud, or on your own servers.