# Lina's Channel ROMI &mdash; Chapter 3 Worked Example

> The five-channel marketing-attribution dataset behind Lina's clustered-column failure vs the single-encoding Big Idea rebuild in Chapter 3 of *The Defensible Decision*. Five channels, four metrics each, one audience question &mdash; and one chart shape that answers it in three seconds.

**Wholly synthetic.** Any resemblance to a specific real B2B marketing-attribution dashboard is coincidental; the numbers are constructed so ROMI produces a clean sort with a clear top and bottom.

## Files

- [`lina-channel-romi.csv`](lina-channel-romi.csv) &mdash; flat rows: five channels &times; four metrics
- [`lina-channel-romi.json`](lina-channel-romi.json) &mdash; canonical scenario contract with source hash

## What it represents

The B2B marketing-attribution snapshot Lina is looking at on Monday afternoon. Five channels (Paid Social, Email, Search, Content, Display) each carry four metrics: leads, cost per lead, conversion rate, and return on marketing investment (ROMI). The VP wants to know where to spend the Q4 budget. Chapter 3 uses the dataset to contrast Lina's first-draft clustered column (five channels &times; three series &times; three axes to read) with the single-encoding sorted bar of ROMI (Paid Social top, Display bottom, both accented, ROMI dollars annotated) that answers the VP's question in three seconds.

## Invariants (locked)

The scenario carries executable invariants that Chapter 3's release contract enforces:

- Exactly five channels: Paid Social, Email, Search, Content, Display.
- Every channel carries all four metrics (`leads`, `cost_per_lead_usd`, `conversion_rate_pct`, `romi_ratio`).
- ROMI produces a clean sort with a clear top and bottom: Paid Social `$3.40` top, Display `$0.80` bottom.
- The Big Idea text names both channels and both ROMI values verbatim: *"Paid Social returns $3.40 per marketing dollar; reallocate Q4 spend from Display, which returns $0.80."*
- The clustered-column state carries three series across five channels (`series_count: 3`), and the argument is <em>not</em> visible in three seconds.
- The focused-bar state carries one series (`series_count: 1`, ROMI ratio), sorted descending, with the argument visible in three seconds and the Big Idea in the title.

## Why the invariants matter

Chapter 3's pedagogical point is that the Big Idea &mdash; written before the chart &mdash; determines the chart's encoding, its sort order, its accents, and its title. If ROMI produced a muddy sort (e.g., two channels tied at the top), the sorted-bar rebuild would need a tiebreaker, and the Big Idea would need a compound sentence. If Display were not the clean bottom, the reallocation half of the Big Idea would need to name a different source channel. The numbers are locked to keep the three-second read intact.

## What it does NOT represent

- Actual marketing-attribution data from any real company.
- The full clustered-column chart's third-axis units (leads, cost per lead, conversion rate are on incompatible axes; that is the point of the failure, not a modelling target).
- Q4 spend levels (the chapter's arc closes at the Big Idea; the reallocation math is left to the reader's discipline).

## Reproducibility

The dataset ships from the book source at `AlexBooks/applied-ai/ai-directed-viz/data/lina-channel-romi.json` and is re-emitted here by `AlexBooks/applied-ai/ai-directed-viz/scripts/generate-lina-channel.mjs --site-root <site-root>`. The generator writes the source SHA-256 into `lina-channel-romi.json` so drift between the book and this site is detectable.

## License

Released for teaching use alongside *The Defensible Decision*. Use freely.
