# Funnel chart

A React component in [Beamline](https://beamline.io/)'s [Charts & data-vis](https://beamline.io/components/charts) category. Live demo: https://beamline.io/components/funnel-chart

People or deals moving through ordered steps, each step a bar narrowing from the first: the part lost between two steps stays beside the next as a fading ghost with its count, the step's conversion and the conversion from the start read between them, a previous period shows as a mark on each bar with its change, and a step never measured is hatched rather than read as zero.

## Use it for

- A sequence where each step keeps part of the one before: visit → signup → activation → paid, lead → deal → won, cart → checkout → order.
- Finding the step that loses the most, and whether it got better against last period.

## Not for

- Flows that branch or merge between stages ([sankey-chart](https://beamline.io/components/sankey-chart)).
- Independent categories without an order ([bar-chart](https://beamline.io/components/bar-chart) or [bar-list](https://beamline.io/components/bar-list)).
- Shares of one whole ([pie-chart](https://beamline.io/components/pie-chart) or [waffle-chart](https://beamline.io/components/waffle-chart)).

## Anatomy

- chart frame: title, description, table button (every step with value, step conversion, from start and previous)
- step row: name, value, the bar (centred, or from the start edge), the previous period's mark and change
- between steps: the step's conversion and the count lost, with the lost part kept as a ghost beside the next bar
- footer: conversion from the first step to the last

## Variants

- **0**: shape: centred (a funnel) · aligned (bars from the start edge, easier to compare lengths)
- **1**: previous: the same steps last period (marks and ▲ ▼ change)
- **2**: format and percent format

## States

- loading (bars of falling width waiting)
- empty
- not measured (a null step: hatched, its conversions read “not measured”)
- active step (hover, focus or pinned: others fade toward the card, its numbers lead)
- data changed (bars glide to their new widths, the lost parts drain)
- table view
- Loss and ghost width use the immediately previous measured step; an unknown boundary has no numeric loss or drop-off ghost.

## Keyboard

- Tab reaches the steps as one list; ↑ ↓ move between steps, Enter pins one, Escape unpins
- The table view carries every number for a screen reader

## Motion

Bars grow from the centre (or the start edge) in turn on first draw. New data glides every bar to its width over the chart duration; a step that loses people keeps the lost part as a ghost that drains, a step that gains arrives lit (the shared delta grammar). Pointing fades the other steps at once. Reduced motion shows the result at once; nothing runs at rest.

## Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `steps` (required) | `FunnelStep[]` | — | { key, label, value: number \| null } in order. |
| `previous` | `(number \| null)[]` | — | The same steps last period, in the same order. |
| `previousLabel` | `string` | — | What the previous period is called. Default "Previous period". |
| `shape` | `"centred" \| "aligned"` | — | Default centred. |
| `format` | `(value: number) => string` | — | How counts read. |
| `percent` | `(share: number) => string` | — | How conversions read; share is 0–1. Default one decimal. |
| `active / defaultActive / onActiveChange` | `string \| null` | — | The pinned step's key. |
| `title / hideTitle / description / table / loading / emptyLabel / actions` | `…` | — | The chart frame every chart shares. |
| `className / classNames / style / ref` | `string / ChartClassNames / CSSProperties / Ref<HTMLElement>` | — | The chart figure and its frame parts. |

## Dependencies

`motion`

## Import

```tsx
import { FunnelChart } from "@/components/funnel-chart/funnel-chart";
```

## Get it

Funnel chart is part of Beamline: 200+ components and 50+ complete screens for React that your coding agent (Claude Code, Codex, Cursor or any MCP client) installs into your app through Beamline's MCP server, as a ready-built package or as plain React source you can change. $49 launch price, one payment, no subscription, lifetime updates, one licence for your whole team. [Get Beamline](https://beamline.io/checkout?pack=complete) · [Connect your agent](https://beamline.io/connect)

## More in Charts & data-vis

- [Sankey chart](https://beamline.io/components/sankey-chart): Flows between stages as bands whose width is the amount: sources to pages to outcomes, budgets to teams; hovering or focusing a node lights its flows and…
- [Geo map](https://beamline.io/components/geo-map): Values by country as a choropleth on the system's own world outline (no map service): classes from a sequential or diverging ramp with a legend you can…
- [Streamgraph](https://beamline.io/components/streamgraph): Stacked flows over time around a centre baseline, with silhouette, wiggle, expand (shares) and zero offsets: a legend that turns layers on and off, a…
- [Ridgeline](https://beamline.io/components/ridgeline): Distributions per group as overlapping density ridges (response time by region, order size by plan): an overlap control, median and p95 readouts per row…
- [Treemap](https://beamline.io/components/treemap): Nested rectangles sized by value (spend by team, then service), squarified so tiles stay close to square: labels that fit or hide, hover and focus…
- [Gantt chart](https://beamline.io/components/gantt-chart): A plan as bars on a timeline: tasks grouped down the side, each bar from its start to its end with its progress, milestones as diamonds, arrows from each…
- [Activity heatmap](https://beamline.io/components/activity-heatmap): A calendar of daily counts, one cell per day on a sequential ramp: weeks across, weekdays down, month and weekday labels, a legend scale, hatched days…
- [Gauge](https://beamline.io/components/gauge): One value against a known range: a semicircle, a 270° dial or a full ring, filled or with a needle, coloured bands with their names (healthy, busy…
- [Radial chart](https://beamline.io/components/radial-chart): Progress of a few measures toward their targets as concentric rings, full or half circle, with a centre readout and a list of each ring's value, target…
- [Radar chart](https://beamline.io/components/radar-chart): A few series compared across the same five to eight dimensions as polygons on a polygon or circle grid; hover or arrow keys pick a dimension and read…
- [Scatter chart](https://beamline.io/components/scatter-chart): Two measures of many items against each other, one point per item, or a bubble chart when a third measure sizes the points: groups by colour and shape…
- [Area chart](https://beamline.io/components/area-chart): Amounts over time as filled areas: overlapping, stacked or as shares of 100%, five fills, two strokes, five curves, a range handle; gaps for missing…
- [Composed chart](https://beamline.io/components/composed-chart): Different measures on one time axis: bars, lines and areas per series, a left and a right value axis with their own formats, and reference lines.
- [Waffle chart](https://beamline.io/components/waffle-chart): Units of a whole as a grid of cells by category (seats used of a plan, tickets by channel): a 10×10 grid by default, hatched cells for units whose…
- [Slope chart](https://beamline.io/components/slope-chart): Change between two points in time per item, by value or by rank: labels on both sides that never collide, rising and falling told by the end marker (▲ ▼)…
- [Line chart](https://beamline.io/components/line-chart): Values over time as lines: curves, point markers, dashed series for forecasts, reference lines for limits and targets, an optional zero baseline and a…
- [Bar chart](https://beamline.io/components/bar-chart): Amounts by category as bars: columns or rows, grouped, stacked or as shares, reference lines, five looks (rounded, cells, trace, isometric, monospace), a…
- [Pie chart](https://beamline.io/components/pie-chart): A few shares of a whole as a pie or donut, with spaced slices, percent labels, a centre readout and a list of every slice with value and share; hovering…
- [Sparkline](https://beamline.io/components/sparkline): A compact trend beside its value: point along it or focus it and use ← → to read each point; nulls are gaps. TrendLine is the bare line.
