A self-contained simulation of a high-value direct-mail acquisition program showing what a targeting model is actually worth in dollars. A universe of 100,000 prospect households is scored, ranked into deciles, and mailed only where the expected incremental sales cover the postage. The result: 40% fewer pieces, $22K more profit, and ROI up from 45% to 102% — on the same file, with the same economics.
The point is not that models predict well. The point is that a decile ranking converts a prediction into a stopping rule: it tells you exactly where in the file to stop mailing, and prices out what every decile below the line would have lost.
Note on the data: The dataset is simulated from a known data-generating process, seeded for exact reproducibility. Working from a known ground truth means the economics can be checked end-to-end — the model has to rediscover the response pattern from mailed outcomes alone, exactly as it would in a live program.
Interactive version of this page →
A high-value acquisition program: each sale is worth $1,000, each mail piece costs $1.50. The file has 100,000 prospect households with four attributes a list vendor would realistically supply: income, net worth, a modeled cruise-ship likelihood, and prior direct-mail response frequency.
Two design choices mirror real programs:
Without a model, you mail all ~90,000 non-holdout households. With one, you mail only the deciles that pay.
| The trained model separates the file sharply: the top decile responds at 0.75%, eleven times the bottom decile’s 0.07%. The dashed line is breakeven — the response rate at which incremental sales just cover mail cost, about 0.18% at these economics. Deciles 1–6 clear it. Deciles 7–10 lose money on every piece mailed. |
Mailed response rate by model decile, with the breakeven line. Click to enlarge. |
| — | — |
| Translating each decile into dollars — incremental sales value minus mail cost — makes the stopping rule visible. The top decile alone contributes $41K net; each of the bottom four destroys $2K–$9K. Mailing decile 10 costs $13,449 in postage to generate about $4,900 in incremental value. |
Each decile’s net contribution. Green pays; red is postage burned. Click to enlarge. |
| — | — |
| Scenario | Pieces | Mailed sales | Incremental sales | Mail cost | Net | ROI |
|---|---|---|---|---|---|---|
| No model — mail everyone | 89,806 | 239 | 195 | $134,709 | $60,191 | 45% |
| With model — mail deciles 1–6 | 53,841 | 200 | 163 | $80,762 | $82,338 | 102% |
Mailing six deciles instead of ten gives up 32 incremental sales in the bottom four deciles — sales that cost more in postage than they returned. In exchange: 35,965 fewer pieces, $22,147 more net profit, and ROI more than doubled, while keeping 84% of the incremental sales.
Same file, same economics — fewer, smarter pieces. Click to enlarge.
| Decile | Pieces | Response | Incremental sales | Net $ | ROI |
|---|---|---|---|---|---|
| 1 | 8,936 | 0.75% | 54.7 | $41,296 | +308% |
| 2 | 8,999 | 0.39% | 28.5 | $15,002 | +111% |
| 3 | 8,987 | 0.39% | 28.5 | $15,020 | +111% |
| 4 | 8,976 | 0.25% | 17.9 | $4,436 | +33% |
| 5 | 8,979 | 0.26% | 18.8 | $5,332 | +40% |
| 6 | 8,964 | 0.20% | 14.7 | $1,254 | +9% |
| — cutoff — | |||||
| 7 | 9,030 | 0.16% | 11.4 | −$2,145 | −16% |
| 8 | 9,004 | 0.13% | 9.8 | −$3,706 | −27% |
| 9 | 8,965 | 0.08% | 5.7 | −$7,748 | −58% |
| 10 | 8,966 | 0.07% | 4.9 | −$8,549 | −64% |
Everything below the line loses money — the model prices out exactly where to stop. Incremental sales are mailed sales minus the sales the holdout shows would have happened anyway.
Data generation (01_dgp.py): builds the household universe — a latent affluence factor ties income, net worth, and cruise likelihood together, prior mail responsiveness runs on its own axis — and realizes sales from a hidden logistic propensity, with mail multiplying the odds of a sale ~6x. The intercept is solved numerically so the overall mailed response rate lands at a realistic 0.27%. Seeded with np.random.default_rng, so every figure reproduces exactly.
Modeling (02_model_deciles.py): fits a logistic regression on mailed households only, scores the full file, ranks it into deciles, and builds the decile lift table with holdout-based incremental sales.
Economics (03_roi_report.py): prices each decile (incremental value minus mail cost), finds the breakeven cutoff, and produces the no-model vs. with-model comparison, all charts, and a machine-readable summary.