Not just triggers and templates. Each workflow decides what to say, when to say it, and learns what converts.
Every workflow adapts to the user, the context, and what's worked before.
Copy adapts to user behavior, history, and what's converted before. Not the same template for everyone.
Timing adjusts to timezone, engagement patterns, and urgency. High-value users get faster follow-up.
Thompson Sampling surfaces winners automatically. Losers phase out without manual intervention.
Track which variation, channel, and timing drove the conversion. Revenue tied to the exact decision.
Type-safe intents with structured signals. Each workflow knows exactly what data it needs.
User has completed signup
SIGNUP_COMPLETEDActivation4 signals · 1 requiredUser started onboarding flow
ONBOARDING_STARTEDActivation3 signals · 2 requiredUser completed onboarding
ONBOARDING_COMPLETEDActivation2 signalsUser started a trial
TRIAL_STARTEDConversion3 signals · 1 requiredTrial is about to expire
TRIAL_ENDINGConversion5 signals · 1 requiredTrial has expired
TRIAL_EXPIREDConversion3 signals · 1 requiredUser selected a plan to upgrade
PLAN_SELECTEDExpansion1 signal · 1 requiredUser started checkout but didn't complete
CHECKOUT_STARTEDExpansion5 signals · 2 requiredPayment failed and needs recovery
PAYMENT_FAILEDRecovery7 signals · 2 requiredSubscription renewal approaching
SUBSCRIPTION_ENDINGChurn7 signals · 1 requiredUser cancelled their subscription
SUBSCRIPTION_CANCELLEDChurn7 signals · 1 requiredUser downgraded their plan
SUBSCRIPTION_DOWNGRADEDChurn5 signals · 2 requiredType-safe workflow triggers with structured signals and automatic attribution.
Each intent has structured payload fields with compile-time validation
Activation, Conversion, Expansion, Recovery, and Churn paths
Each workflow defines success criteria for attribution tracking
Resolve conversions back to the workflow that drove them
Structured signals with compile-time type checking. No more stringly-typed events.
import { Fourbyfour } from '@fourbyfour/sdk'; const client = new Fourbyfour({ apiKey: process.env.FOURBYFOUR_API_KEY!,}); // Type-safe intent with structured signalsawait client.start('PAYMENT_FAILED', { userId: 'user_123', signals: { invoiceId: 'inv_abc123', amount: 99.00, },}); // Other intents with their typed signalsawait client.start('TRIAL_STARTED', { userId: 'user_456', signals: { planId: 'pro', trialDays: 14, },}); // Resolve conversion for attributionawait client.resolve({ userId: 'user_123', amount: 99.00,});Deploy your first workflow in 5 minutes. No credit card required.