Gallery › Funnel chart

Funnel chart: From permit application to final inspection

Stage names and counts, in order.

From permit application to final inspectionResidential permits, 2026

Funnel chart of Permits through 5 stages, from Applied (640) to Final inspection passed (402). 62.8% of Applied reach Final inspection passed. The biggest drop is from Construction started to Final inspection passed, where 80.7% continue.

Applied640 · 100%Complete application588 · 91.9%Approved551 · 86.1%Construction started498 · 77.8%Final inspection passed402 · 62.8%
Applied640 · 100%Completeapplication588 · 91.9%Approved551 · 86.1%Constructionstarted498 · 77.8%Final inspectionpassed402 · 62.8%
Data for “From permit application to final inspection”
StagePermitsShare of AppliedShare of stage before
Applied640100%
Complete application58891.9%91.9%
Approved55186.1%93.7%
Construction started49877.8%90.4%
Final inspection passed40262.8%80.7%

Source: Halcyon County sample data (fictional, for the demo)

The spec

This is everything OSCharts needed to draw the chart above. The data is a table: named columns and rows, the way it sits in a spreadsheet.

{
  "id": "permit-funnel",
  "type": "funnel",
  "title": "From permit application to final inspection",
  "subtitle": "Residential permits, 2026",
  "source": "Halcyon County sample data (fictional, for the demo)",
  "data": {
    "columns": [
      "Stage",
      "Permits"
    ],
    "rows": [
      [
        "Applied",
        640
      ],
      [
        "Complete application",
        588
      ],
      [
        "Approved",
        551
      ],
      [
        "Construction started",
        498
      ],
      [
        "Final inspection passed",
        402
      ]
    ]
  }
}

Put it on a page

In a browser, load the two files and mount the chart:

<link rel="stylesheet" href="oscharts.css">
<script src="oscharts.js" defer></script>
<div id="chart"></div>
<script type="module">
  OSCharts.mount(document.getElementById("chart"), spec);
</script>

Or render it on a server or in a build step, so the chart is in the page before any JavaScript runs:

import { render } from "oscharts";
const html = render(spec);   // a complete, accessible <figure>

Command line: npx oscharts render spec.json > chart.html