Adaptive Conversion Engine
A behavioural state system that changes how a website responds to visitor intent, engagement, and hesitation, instead of showing every visitor the same conversion path.
Most websites ask for the exact same thing from everyone.
Whether a visitor just discovered the site, is researching alternatives, or is ready to make a decision, traditional websites treat them identically: a static contact form demanding high-commitment data upfront.
The Blind Form
Demands Name, Email, Phone, and Project Brief immediately. When visitors hesitate or close the form, the website has no alternative path. Rejections are treated as binary bounces with zero recovery.
The Responsive State Layer
Observes engagement signals, establishes early intent with zero input friction, and dynamically modulates the interface. If friction occurs, it de-escalates to a minimal callback alternative instead of repeating the ask.
Behaviour becomes a signal.
The engine turns passive visitor telemetry into a structured state machine. Every click, dismissal, navigation, and pause informs what the interface should do next.
OBSERVE
Continuously listens to micro-interactions across the session without running heavy background compute or tracking cross-site cookies.
- Clicks, dismissals & overlay touches
- Cross-page navigation events
- Form engagement keystrokes
- 40-second inactivity deadlines
STATE
Maintains an explicit client-side finite state machine in sessionStorage. It
maps
where the user is in the decision funnel and remembers scheduled triggers across page changes.
- Active window & funnel step index
- Window status: active / dismissed / timed_out
- Absolute epoch fallback timers
- Cumulative dismissal counter
RESPONSE
Adapts the interface in real time based on observed resistance, promoting rich intake, deferring to a single-field callback, or pausing cleanly to prevent fatigue.
- Progresses on affirmative micro-actions
- De-escalates on rejection or dismissal
- Pauses when live chat is open
- Terminates on double dismissal
The four behavioural windows.
The engine operates through a coherent vertical progression of four distinct behavioural windows, each designed for a specific psychological threshold.
Categorize Problem Domain
Low-stakes qualification. Instead of asking who the visitor is, it asks what they are trying to solve. Selecting an option immediately captures high-level intent without asking for a single piece of contact data.
Establish Explicit Micro-Consent
Asks for permission before presenting input fields. If the visitor clicks "Yes, show me", they have made an active affirmative micro-commitment. If they decline, the system respects the choice and steps back.
Structured Requirement Collection
Only shown to visitors who gave affirmative consent in Window 02. Collects the requirement brief,
WhatsApp
contact, and optional email. Typing into any field immediately flags the session as form_engaged.
Friction-Adaptive Fallback
Triggered after a 25-second delay if the user declined Window 02, dismissed Window 02, or closed Window 03 without submitting. It drops form complexity down to a single phone input: "Prefer a quick call instead?"
The system doesn't just move forward. It can step back.
Static funnels are one-way streets: if a user says no, the interaction dies. The Adaptive Conversion Engine implements bi-directional routing based on observed hesitation.
Progressing on Affirmative Signals
When the visitor engages positively (selects intent, clicks "Yes, show me"), the system safely escalates from zero-effort questions to structured scope capture.
De-escalating on Resistance Signals
When the visitor closes or declines a modal, the system does not repeat the request. It steps back, initiates a delayed fallback timer (25s), and returns with a single-input callback option.
Client state machine to durable backend.
A resilient pipeline combining frontend session storage, beaconing webhooks, and a FastAPI backend with Airtable persistence and Resend alerting.
pendingActionAt),
surviving page
reloads and cross-page clicks without resetting.
actions
array) capturing
every view, click, dismissal, and engagement time.
Lead Alert Sent field in Airtable by Session ID formula
before triggering
alerts, preventing duplicate emails on retries.
What makes it truly adaptive.
The system does not adapt by hallucinating dynamic text, it adapts by modifying the structural friction and timing of the conversion funnel in response to visitor state.
Friction De-escalation
When a visitor hesitates on a 3-field requirement form, repeating that form will only guarantee a bounce. The engine de-escalates to a minimal 1-field phone callback after an intentional delay.
Intent-Informed Progression
Low-stakes problem categorization (0 inputs) → Explicit permission gate (1 click) → Comprehensive brief (form) → Fallback rescue (1 input). Cognitive resistance is reduced at each step.
Cross-Page Session Memory
Timers are not bound to a single DOM lifecycle. Navigating between Home, About, Work, and Blog pages preserves the exact remaining time until the next scheduled state trigger.
Fatigue Guardrails & Mutual Exclusion
Automatically suspends state triggers when the visitor opens the live system chat widget, and permanently shuts down the engine for the session after two dismissals or 40s of inactivity.
“The interface changes because the situation changes.”
Current implementation & system boundaries.
An accurate technical breakdown of what is genuinely live and running in the current codebase versus architectural boundaries.
-
✓
5-state client finite state machine in
state-engine.jswithsessionStoragebackup. - ✓ 4 distinct behavioural modal windows with friction-based fallback branching.
- ✓ Absolute epoch timestamp timer calculation surviving cross-page navigations.
-
✓
Mutual exclusion pausing when
system-chatis active. -
✓
Beacon webhook dispatch via
fetch('/api/track', { keepalive: true }). - ✓ Python FastAPI backend with Airtable session upserting and Resend email alerts.
- - Not an AI Text Generator: Intent categorization uses structured discrete categories, not real-time LLM text generation.
- - Airtable Store: Persistence runs on Airtable API via FastAPI (not direct PostgreSQL / Supabase connection).
-
-
Session Scoped: State continuity is isolated to active browser sessions (
sessionStorage), not persistent cross-device cookies. - - Strict Accuracy: No inflated conversion multiplier claims or unbuilt automated workflows.
A website doesn't have to show every visitor the same path.
Sometimes the right response is more information. Sometimes it's less friction. Sometimes it's simply knowing when to stop asking.