The decision layer
on top of your events.
AI drafts the intervention, you approve it, your app renders it natively — and every one ships with a holdout control group, so you see the lift it actually caused. No injected widgets, no unverifiable dashboards.
Headless decisions API · Drop-in React components · No data team required
How it works
From events to the right nudge.
Connect events you already have
Forward from PostHog, drop in our browser SDK, or POST to the REST API. Folio reads what users do — no rip-and-replace of your analytics stack.
Describe what you want
Tell Folio your goal in plain English — "increase D7 retention," "get trial users to invite a teammate." Folio finds the cohorts at risk of failing it.
Approve and serve decisions
Review draft recommendations, approve the ones you like, then call `getDecision()` — Folio returns copy + a CTA for banner, modal, or dashboard card surfaces.
Shipped today
Three surfaces.
One decisions API.
Folio returns copy and CTAs — your app handles delivery. Push, email, and other channels are on the roadmap; we don't send messages for you yet.
Banners
Drop in `<FolioBanner />` or call the API. Users at risk see copy and a CTA Folio picked — you control the chrome, Folio supplies the decision.
Modals
Surface high-intent interventions with `<FolioModal />`. Same decisions API, different layout — right user, right message, right moment.
Dashboard cards
Embed recommendations inside your product UI. Folio returns title, body, and CTA; you render them as cards in the user's own dashboard.
For developers
Events in. Decisions out.
Keep PostHog for analytics. Folio owns the layer between cohorts and what your UI shows.
// Option A: forward from PostHog (webhook)
// Option B: Folio SDK in your app
folio.track("trial_started", { plan: "pro" });
folio.identify("user_123", { plan: "trial" });// Anywhere you render a surface
const decision = await folio.getDecision({
surface: "banner",
userId: "user_123",
});
if (decision) {
showBanner({
title: decision.title,
body: decision.body,
cta: { label: decision.ctaLabel, href: decision.ctaUrl },
});
}Flat pricing. No per-user fees.
Two transparent plans. Your costs don't scale with your user count.