Vol. XII · No. 04 · Apr 2026
Jake Cuth.

The leak in the
funnel.

An agent-based funnel simulation. Finds the one customer segment that's quietly killing conversion and fixes it without touching the three that already work.

An agent-based simulation of a marketing funnel. Hundreds of customers, four segments with different price sensitivities and fatigue tolerances, five stages from awareness to retention. Pull a lever, watch which segments respond, which don't, and where your "healthy" 3% conversion is actually hiding three dead funnels behind one great one.


Every marketing deck has the same chart: a tidy vertical funnel, awareness at the top, purchase at the bottom, a single conversion number stamped across it. The number is usually true. It's also usually useless.

A 3% conversion rate at the bottom might come from one segment converting at 20% and three others below 1%. A discount that looks like a win in aggregate might be silently training your loyalists to wait for the next promotion. A retention campaign that appears to be working might just be capturing agents who were going to stay anyway.

Static dashboards show outcomes. This page simulates the mechanism: a thousand dots, four different kinds of customer, moving stage by stage with per-segment transition probabilities. Every lever you touch modifies those probabilities. Every metric you see emerges from the agents themselves. No averages hiding anything.

The model math is derived and validated in the linked Python script: closed-form per-segment conversion matches a 50,000-agent simulation within 1%.


Agents enter at awareness, advance probabilistically, and exit when they drop off or retain. Colors mark segment. Move the levers on the right; the system responds in real time.

IAwareness
IIConsideration
IIITrial
IVPurchase
VRetention
Bargain
Loyalist
Skeptic
Impulse
Overall
conversion
CAC
LTV
LTV : CAC
revenue
payback (mo)
By segment · conversion rate
Same levers, four different responses. This is why aggregate conversion lies.

Fig. A

Agents, not averages

Every dot is an agent with a segment, a stage, and a fatigue counter. Each tick, each agent rolls for advance, drop, or stay — probabilities pulled from a 4 × 5 matrix (segment by stage), modulated by the lever settings. No equations of motion, no ML: just explicit transition probabilities you can derive on paper.

Fig. B

Heterogeneous response

Each segment has its own responsiveness vector to every lever. Bargain hunters double their trial rate when discount goes up; loyalists don't move. Skeptics need more ad exposure than anyone; impulse buyers fatigue faster than anyone. This is where the "average is the lie" effect lives.

Fig. C

Metrics as emergence

Conversion, CAC, LTV, and payback aren't computed from formulas after the fact — they emerge from the population as it moves. The closed-form math in the notebook confirms the live numbers are internally consistent to within 1%.


The same model under four preset lever configurations. Each scenario has a characteristic metric signature — learn the shape once and you'll spot it in a real dashboard the week after.



Engine

Pure JavaScript, HTML5 Canvas 2D, single preallocated agent pool of 1,500. All drawing in batched paths per segment color; no DOM nodes per agent, no SVG, no WebGL. 60fps on any device since ~2017.

Model spec

Four segments, five stages, a 4 × 5 matrix of per-(segment, stage) advance and drop probabilities. Levers modify those probabilities through per-segment responsiveness vectors. Exact definitions in notebooks/funnel_sim_model.py ↗ and mirrored verbatim in assets/js/funnel-sim-lab.js ↗.

Reading list

Epstein & Axtell · Growing Artificial Societies ↗
Rand & Rust · Agent-based modelling in marketing ↗
NetLogo · the canonical ABM sandbox ↗

Limitations

Segment membership is fixed at entry — no crossover. No network effects or word-of-mouth (a natural extension). No competitor dynamics; inflow rate is a function of ad spend only. Time is compressed (one sim-tick ≈ one customer-day), so payback figures are order-of-magnitude indicators, not forecasts.