Library/ Data Viz/ Heatmap
Correlation · Matrix · Pick-the-winner-cell

Persona × channel heatmap.

Reply rate by persona-cohort and outbound channel. Darker orange means more meetings booked per touch. Useful for deciding what to scale, what to kill, and where the unexpected wins are.

Reply rate · 90-day rolling

7 personas · 6 channels · 42 cells
Top cell
22%
RIA Founder × Spotlight
Median cell
7%
across 42 cells
Winning channel
Spotlight
avg. 14%
Losing channel
Cold call
avg. 2%

Fork & ship

Inline SVG, no D3 dependency. Edit ROWS, COLS, and VALUES to repurpose for any 2-axis matrix — fund × strategy returns, custodian × admin coverage, deal-stage × sponsor heat, etc.

const ROWS = ["RIA Founder", "RIA Ops", "Family Office", ...];
const COLS = ["Cold email", "LinkedIn", "Spotlight", ...];
const VALUES = [
  [0.08, 0.12, 0.22, 0.05, 0.14, 0.02],
  [0.04, 0.07, 0.11, 0.03, 0.08, 0.01],
  // ... one row of values per persona
];

When to use this

You have a 2-axis matrix and the story is "which cell wins." Color encodes magnitude. Skip when you have >15 rows or >15 columns — the cells get small and the labels get noisy. Switch to a clustered bar or table.

Reading notes

Cell number is the reply rate; subscript is touch volume. Persona rows are sorted by total replies (descending). Channel columns are sorted by overall winrate. Hover a cell to read the absolute meeting count.