datatomcp

@datatomcp/charts · open source

Charts that state the takeaway

52 charts from 41 types, built for finance and business reporting. Each takes one JSON spec, draws as SVG or HTML on a server or in a browser, and comes with a table view and CSV and PNG export. The same library draws the charts in datatomcp.

npm install @datatomcp/charts
Charts in

Headline figures

KpiRow

The four or five numbers a page is about, each with its change and trend.

Revenue is up 18% on last year with margin holding
Revenue, year to date
$48.2M
▲ +18% vs last year
Gross margin
62%
▲ +0.4% pts
Active customers
12,840
▲ +7.0% vs last year
Churn, monthly
2.1%
▼ −12% vs last year
Source: illustrative data
As of 30 Oct 2026

Avoid when: More than five figures; past that nothing stands out (use a TableChart).

Spec type: "kpi"
{
  "type": "kpi",
  "title": "Revenue is up 18% on last year with margin holding",
  "source": "Source: illustrative data",
  "asOf": "2026-10-30",
  "items": [
    {
      "label": "Revenue, year to date",
      "value": 48200000,
      "format": "currency",
      "delta": 0.18,
      "deltaLabel": "vs last year",
      "trend": [4.24, 4.22, 4.26, 4.5, 4.61, 4.54, 4.61, 4.81, 4.82, 4.75]
    },
    {
      "label": "Gross margin",
      "value": 0.624,
      "format": "percent",
      "delta": 0.004,
      "deltaLabel": "pts",
      "trend": [0.61, 0.61, 0.61, 0.62, 0.62, 0.62, 0.62, 0.62, 0.62, 0.62]
    },
    {
      "label": "Active customers",
      "value": 12840,
      "delta": 0.07,
      "deltaLabel": "vs last year",
      "trend": [
        11960.9, 12014.04, 12089.81, 12254.94, 12364.58, 12388.03, 12478.51, 12629.4, 12692.69,
        12717.63
      ]
    },
    {
      "label": "Churn, monthly",
      "value": 0.021,
      "format": "percent",
      "delta": -0.12,
      "invert": true,
      "deltaLabel": "vs last year",
      "trend": [0.03, 0.03, 0.02, 0.03, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
    }
  ]
}
StatTile

One number on its own, with the period it covers and how it moved.

Net revenue retention
112%
▲ +3.0% vs Q2

Avoid when: When the number needs a comparison the tile can't show; use a chart.

Spec type: "kpi"
{
  "type": "kpi",
  "items": [
    {
      "label": "Net revenue retention",
      "value": 1.12,
      "format": "percent",
      "delta": 0.03,
      "deltaLabel": "vs Q2",
      "trend": [1.05, 1.05, 1.06, 1.08, 1.09, 1.09, 1.1, 1.12]
    }
  ]
}
Sparkline

A word-sized trend beside a figure, with the stretch the figure states highlighted.

Avoid when: When the reader needs values or dates; it has no axis.

Spec type: "sparkline"
{
  "type": "sparkline",
  "values": [
    20.81, 20.85, 21.2, 22.75, 23.57, 23.24, 23.82, 25.22, 25.46, 25.2, 26.31, 27.71, 27.85,
    28.25, 30.07, 31.47
  ],
  "highlightFrom": 12
}
LineChart · forecast

A trend with the forecast shaded, its range, and the moments that moved it annotated.

Revenue should pass $6M a month by October
Monthly revenue, $, with the forecast from August
$0.0$2.0M$4.0M$6.0M$8.0MJan 2025Apr 2025Jul 2025Oct 2025Jan 2026Apr 2026Jul 2026Oct 2026ForecastAnnual plans launchPrice changeRevenue $6.1M
Source: illustrative data
As of 30 Oct 2026

Avoid when: More than about three annotations; the line stops reading as a story.

Spec type: "line"
{
  "type": "line",
  "title": "Revenue should pass $6M a month by October",
  "subtitle": "Monthly revenue, $, with the forecast from August",
  "source": "Source: illustrative data",
  "asOf": "2026-10-30",
  "format": "currency",
  "x": [
    "2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06", "2025-07", "2025-08",
    "2025-09", "2025-10", "2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04",
    "2026-05", "2026-06", "2026-07", "2026-08", "2026-09", "2026-10"
  ],
  "forecastFrom": "2026-08",
  "series": [
    {
      "name": "Revenue",
      "values": [
        3133832.01, 3283138.67, 3435080.4, 3611756.28, 3724544.58, 3757881.37, 3808339.19,
        3891178.35, 3945935.79, 4018701.68, 4197634.33, 4436304.55, 4656715.93, 4898617.91,
        5184025.47, 5414425.12, 5547093.98, 5665754.09, 5794532.32, 5876253.77, 5956837.95,
        6145485.65
      ],
      "highlight": true
    }
  ],
  "band": {
    "lower": [
      null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
      null, null, null, null, 5758728.694599999, 5718564.432, 5776756.511
    ],
    "upper": [
      null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
      null, null, null, null, 5993778.8454, 6195111.468, 6514214.789000001
    ]
  },
  "annotations": [{"x": "2025-09", "label": "Annual plans launch"},{"x": "2026-03", "label": "Price change"}]
}
LineChart · highlight

One series in focus, the rest as grey context.

Asia Pacific is the fastest-growing region
New customers per month, 2026
North AmericaEuropeAsia PacificLatin America
0200400600Jan 2026Mar 2026May 2026Jul 2026Oct 2026North America 436Europe 332Asia Pacific 243Latin America 118
Source: illustrative data

Avoid when: When every series matters equally; use small multiples.

Spec type: "line"
{
  "type": "line",
  "title": "Asia Pacific is the fastest-growing region",
  "subtitle": "New customers per month, 2026",
  "source": "Source: illustrative data",
  "x": [
    "2026-01", "2026-02", "2026-03", "2026-04", "2026-05", "2026-06", "2026-07", "2026-08",
    "2026-09", "2026-10"
  ],
  "series": [
    {
      "name": "North America",
      "values": [414, 415, 417, 424, 429, 427, 430, 437, 438, 436],
      "highlight": false
    },
    {"name": "Europe", "values": [301,304,311,315,315,318,325,327,326,332], "highlight": false},
    {
      "name": "Asia Pacific",
      "values": [150, 161, 171, 176, 186, 198, 207, 215, 228, 243],
      "highlight": true
    },
    {
      "name": "Latin America",
      "values": [122, 123, 120, 120, 122, 120, 118, 119, 120, 118],
      "highlight": false
    }
  ]
}
LineChart · rates

Rates and ratios, where a zero baseline would flatten the story.

Margins keep widening in both product lines
Gross margin, % of revenue
SubscriptionsServices
30%40%50%60%70%80%Jan 2025Apr 2025Jul 2025Oct 2025Jan 2026Apr 2026Jul 2026Oct 2026Subscriptions 76%Services 45%
Source: illustrative data

Avoid when: Totals or counts, which should start at zero.

Spec type: "line"
{
  "type": "line",
  "title": "Margins keep widening in both product lines",
  "subtitle": "Gross margin, % of revenue",
  "source": "Source: illustrative data",
  "format": "percent",
  "x": [
    "2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06", "2025-07", "2025-08",
    "2025-09", "2025-10", "2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04",
    "2026-05", "2026-06", "2026-07", "2026-08", "2026-09", "2026-10"
  ],
  "series": [
    {
      "name": "Subscriptions",
      "values": [
        0.71, 0.71, 0.72, 0.72, 0.72, 0.72, 0.72, 0.73, 0.72, 0.73, 0.73, 0.73, 0.73, 0.74, 0.74,
        0.74, 0.74, 0.75, 0.75, 0.75, 0.76, 0.76
      ]
    },
    {
      "name": "Services",
      "values": [
        0.39, 0.38, 0.39, 0.39, 0.39, 0.39, 0.4, 0.4, 0.4, 0.4, 0.41, 0.42, 0.42, 0.42, 0.43, 0.43,
        0.43, 0.44, 0.44, 0.44, 0.44, 0.45
      ]
    }
  ]
}
LineChart · index

Growth compared from one starting point, every series rebased to 100.

Services grew twice as fast as subscriptions since January 2025
Revenue indexed to January 2025 = 100
SubscriptionsServicesHardware
0100200300Jan 2025Apr 2025Jul 2025Oct 2025Jan 2026Apr 2026Jul 2026Oct 2026Start = 100Services 211Subscriptions 145Hardware 101
Source: illustrative data

Avoid when: When the reader needs the actual sizes.

Spec type: "line"
{
  "type": "line",
  "title": "Services grew twice as fast as subscriptions since January 2025",
  "subtitle": "Revenue indexed to January 2025 = 100",
  "source": "Source: illustrative data",
  "index": true,
  "x": [
    "2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06", "2025-07", "2025-08",
    "2025-09", "2025-10", "2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04",
    "2026-05", "2026-06", "2026-07", "2026-08", "2026-09", "2026-10"
  ],
  "series": [
    {
      "name": "Subscriptions",
      "values": [
        2220299.2, 2245881.2, 2279461.06, 2343301.14, 2389124.79, 2406707.82, 2447140.71,
        2508222.41, 2540634.99, 2560799.68, 2615420.22, 2677549.11, 2708627.02, 2746271.81,
        2819522.07, 2882870.23, 2918077.78, 2974035.8, 3054861.24, 3109083.91, 3144547.19,
        3209794.01
      ]
    },
    {
      "name": "Services",
      "values": [
        613532.8, 626387.47, 644920.24, 683994.53, 711448.71, 720490.49, 745205.03, 784150.94,
        804476.69, 817158.04, 853360.32, 895149.3, 916850.88, 943577.1, 994721.94, 1039983.43,
        1067240.51, 1109126.8, 1168428.16, 1210874.11, 1241738.36, 1293429.5
      ],
      "highlight": true
    },
    {
      "name": "Hardware",
      "values": [
        306766.4, 312329.73, 317967.63, 329281.26, 329467.06, 315713.09, 306801.92, 304445.22,
        294688.38, 284859.79, 291246.65, 304246.49, 309201.68, 316137.11, 332177.43, 340243.71,
        333509.39, 328896.02, 329613.47, 321069.47, 308484.23, 309983.48
      ]
    }
  ]
}
LineChart · seasonal

The same months year over year, the current year highlighted.

2026 is running ahead of every past year since March
Orders per month, thousands
2023202420252026
253035404550JanFebMarAprMayJunJulAugSepOctNovDec2026 402025 392024 352023 33
Source: illustrative data

Avoid when: Fewer than two full years.

Spec type: "line"
{
  "type": "line",
  "title": "2026 is running ahead of every past year since March",
  "subtitle": "Orders per month, thousands",
  "source": "Source: illustrative data",
  "x": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  "series": [
    {
      "name": "2023",
      "values": [31.41, 33.31, 34.9, 36.22, 36.14, 34.57, 32.88, 31.55, 30.14, 29.39, 30.4, 32.52]
    },
    {
      "name": "2024",
      "values": [34.13, 36.39, 38.73, 39.76, 39.09, 37.85, 36.4, 34.33, 32.54, 32.44, 33.67, 35.33]
    },
    {
      "name": "2025",
      "values": [36.99, 40.14, 42.36, 42.98, 42.81, 41.94, 39.81, 37.36, 36.19, 36.26, 37.02, 39.1]
    },
    {
      "name": "2026",
      "values": [39.45, 42.61, 44.65, 46.05, 46.55, 45.26, 42.96, 41.25, 40.32, 39.97, null, null],
      "highlight": true
    }
  ]
}
StepLine

A value that holds until the next change: prices, rates, headcount.

The Pro plan price changed twice in two years
List price per seat, monthly, $
ProTeam
$0$10$20$30$40Jan 2025Apr 2025Jul 2025Oct 2025Jan 2026Apr 2026Jul 2026Oct 2026Pro $32Team $15
Source: illustrative data

Avoid when: Continuous measures such as revenue; a step implies nothing moved in between.

Spec type: "line"
{
  "type": "line",
  "step": true,
  "title": "The Pro plan price changed twice in two years",
  "subtitle": "List price per seat, monthly, $",
  "source": "Source: illustrative data",
  "format": "currency",
  "x": [
    "2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06", "2025-07", "2025-08",
    "2025-09", "2025-10", "2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04",
    "2026-05", "2026-06", "2026-07", "2026-08", "2026-09", "2026-10"
  ],
  "series": [
    {
      "name": "Pro",
      "values": [24, 24, 24, 24, 24, 24, 24, 24, 29, 29, 29, 29, 29, 29, 29, 32, 32, 32, 32, 32, 32, 32],
      "highlight": true
    },
    {
      "name": "Team",
      "values": [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]
    }
  ]
}
EventLine

One measure with the launches, incidents and changes that moved it, marked where they happened.

Sign-ups stepped up after each launch; the outage cost two weeks
Weekly sign-ups, with plan
PlanSign-ups
1,5002,0002,5003,0002 Mar23 Mar13 Apr4 May25 May15 Jun6 Jul27 Jul17 Aug7 SeptFree tier launchOutageEU regionSign-ups 2,726Plan 2,556
Source: illustrative data
As of 30 Oct 2026

Avoid when: More than about six events.

Spec type: "line"
{
  "type": "line",
  "title": "Sign-ups stepped up after each launch; the outage cost two weeks",
  "subtitle": "Weekly sign-ups, with plan",
  "source": "Source: illustrative data",
  "asOf": "2026-10-30",
  "x": [
    "2026-03-02", "2026-03-09", "2026-03-16", "2026-03-23", "2026-03-30", "2026-04-06",
    "2026-04-13", "2026-04-20", "2026-04-27", "2026-05-04", "2026-05-11", "2026-05-18",
    "2026-05-25", "2026-06-01", "2026-06-08", "2026-06-15", "2026-06-22", "2026-06-29",
    "2026-07-06", "2026-07-13", "2026-07-20", "2026-07-27", "2026-08-03", "2026-08-10",
    "2026-08-17", "2026-08-24", "2026-08-31", "2026-09-07"
  ],
  "series": [
    {
      "name": "Plan",
      "values": [
        1800, 1828, 1856, 1884, 1912, 1940, 1968, 1996, 2024, 2052, 2080, 2108, 2136, 2164, 2192,
        2220, 2248, 2276, 2304, 2332, 2360, 2388, 2416, 2444, 2472, 2500, 2528, 2556
      ]
    },
    {
      "name": "Sign-ups",
      "values": [
        1700, 1770, 1783, 1765, 1789, 1864, 2046, 2050, 2035, 2069, 2147, 2200, 1776, 2006, 2230,
        2309, 2353, 2343, 2339, 2482, 2561, 2594, 2579, 2583, 2645, 2720, 2743, 2726
      ],
      "highlight": true
    }
  ],
  "events": [
    {"x": "2026-04-13", "label": "Free tier launch"},
    {"x": "2026-05-25", "label": "Outage"},
    {"x": "2026-07-13", "label": "EU region"}
  ]
}
SmallMultiples

One panel per region or product, on one shared scale, the others in grey behind.

Growth is broad-based; only Latin America is flat on the year
Revenue, $M per month, 2026
North America+5%02.55Jan 2026Oct 2026Europe+10%02.55Jan 2026Oct 2026Asia Pacific+62%02.55Jan 2026Oct 2026Latin America−3%02.55Jan 2026Oct 2026
Source: illustrative data

Avoid when: Independent scales, unless sizes truly differ and each panel says so.

Spec type: "smallMultiples"
{
  "type": "smallMultiples",
  "title": "Growth is broad-based; only Latin America is flat on the year",
  "subtitle": "Revenue, $M per month, 2026",
  "source": "Source: illustrative data",
  "x": [
    "2026-01", "2026-02", "2026-03", "2026-04", "2026-05", "2026-06", "2026-07", "2026-08",
    "2026-09", "2026-10"
  ],
  "series": [
    {"name": "North America", "values": [4.14,4.15,4.17,4.24,4.29,4.27,4.3,4.37,4.38,4.36]},
    {"name": "Europe", "values": [3.01,3.04,3.11,3.15,3.15,3.18,3.25,3.27,3.26,3.32]},
    {"name": "Asia Pacific", "values": [1.5,1.61,1.71,1.76,1.86,1.98,2.07,2.15,2.28,2.43]},
    {"name": "Latin America", "values": [1.22,1.23,1.2,1.2,1.22,1.2,1.18,1.19,1.2,1.18]}
  ],
  "format": "number"
}
AreaChart · stacked

A total over time and what it is made of, when the total matters most.

Revenue is up 60% since January 2025, with subscriptions adding the most
Revenue by product line, $ per month
SubscriptionsServicesHardware
$0.0$2.0M$4.0M$6.0MJan 2025Apr 2025Jul 2025Oct 2025Jan 2026Apr 2026Jul 2026Oct 2026ForecastHardware $310.0KServices $1.1MSubscriptions $3.2M
Source: illustrative data

Avoid when: More than about five parts, or when one part's own trend is the point.

Spec type: "area"
{
  "type": "area",
  "title": "Revenue is up 60% since January 2025, with subscriptions adding the most",
  "subtitle": "Revenue by product line, $ per month",
  "source": "Source: illustrative data",
  "format": "currency",
  "x": [
    "2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06", "2025-07", "2025-08",
    "2025-09", "2025-10", "2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04",
    "2026-05", "2026-06", "2026-07", "2026-08", "2026-09", "2026-10"
  ],
  "forecastFrom": "2026-08",
  "series": [
    {
      "name": "Subscriptions",
      "values": [
        2220299.2, 2245881.2, 2279461.06, 2343301.14, 2389124.79, 2406707.82, 2447140.71,
        2508222.41, 2540634.99, 2560799.68, 2615420.22, 2677549.11, 2708627.02, 2746271.81,
        2819522.07, 2882870.23, 2918077.78, 2974035.8, 3054861.24, 3109083.91, 3144547.19,
        3209794.01
      ]
    },
    {
      "name": "Services",
      "values": [
        613532.8, 622187.47, 636238.84, 670536.14, 692902.91, 696531.35, 715490.45, 748321.9,
        762156.51, 767951.57, 796853.17, 830906.94, 844417.77, 862475.77, 904452.02, 940020.64,
        957035.64, 988104.58, 1035986.16, 1066381.54, 1084534.83, 1122823.78
      ]
    },
    {
      "name": "Hardware",
      "values": [
        306766.4, 312329.73, 317967.63, 329281.26, 329467.06, 315713.09, 306801.92, 304445.22,
        294688.38, 284859.79, 291246.65, 304246.49, 309201.68, 316137.11, 332177.43, 340243.71,
        333509.39, 328896.02, 329613.47, 321069.47, 308484.23, 309983.48
      ]
    }
  ]
}
AreaChart · 100%

How the mix shifts over time, each period adding up to 100%.

Card payments overtook invoices this spring
Share of revenue by payment method
CardInvoiceMarketplace
0%100%Jan 2025Apr 2025Jul 2025Oct 2025Jan 2026Apr 2026Jul 2026Oct 2026Marketplace 12%Invoice 33%Card 55%
Source: illustrative data

Avoid when: When the total changes a lot; shares hide it.

Spec type: "area"
{
  "type": "area",
  "mode": "percent",
  "title": "Card payments overtook invoices this spring",
  "subtitle": "Share of revenue by payment method",
  "source": "Source: illustrative data",
  "x": [
    "2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06", "2025-07", "2025-08",
    "2025-09", "2025-10", "2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04",
    "2026-05", "2026-06", "2026-07", "2026-08", "2026-09", "2026-10"
  ],
  "series": [
    {
      "name": "Card",
      "values": [
        40.34, 41.1, 42.02, 43.45, 44.59, 45.28, 46.36, 47.81, 48.79, 49.58, 50.97, 52.49, 53.52,
        54.67, 56.44, 58.06, 59.24, 60.77, 62.75, 64.3, 65.57, 67.35
      ],
      "highlight": true
    },
    {
      "name": "Invoice",
      "values": [
        50.34, 49.6, 49, 48.89, 48.47, 47.57, 47.05, 46.86, 46.19, 45.3, 44.98, 44.78, 44.04,
        43.41, 43.36, 43.13, 42.43, 42.06, 42.09, 41.67, 40.92, 40.65
      ]
    },
    {
      "name": "Marketplace",
      "values": [
        10.2, 10.26, 10.4, 10.84, 11.09, 11.06, 11.25, 11.64, 11.75, 11.73, 12.05, 12.44, 12.52,
        12.66, 13.15, 13.54, 13.64, 13.95, 14.5, 14.78, 14.87, 15.26
      ]
    }
  ]
}
Chart · actual, plan and forecast

Actuals as bars, the plan as a line, the forecast with its range.

Bookings beat plan in seven of nine months; Q4 should land near plan
Bookings, $M per month, 2026
BookingsPlanForecast range
02468Jan 2026Mar 2026May 2026Jul 2026Sept 2026Dec 2026ForecastPlan 6.3Bookings 6.4
Source: illustrative data
As of 30 Oct 2026

Avoid when: More than one bar series and two lines.

Spec type: "combo"
{
  "type": "combo",
  "title": "Bookings beat plan in seven of nine months; Q4 should land near plan",
  "subtitle": "Bookings, $M per month, 2026",
  "source": "Source: illustrative data",
  "asOf": "2026-10-30",
  "x": [
    "2026-01", "2026-02", "2026-03", "2026-04", "2026-05", "2026-06", "2026-07", "2026-08",
    "2026-09", "2026-10", "2026-11", "2026-12"
  ],
  "forecastFrom": 9,
  "bars": {"name": "Bookings", "values": [4.1,4.3,4.9,4.6,5,5.2,4.8,5.4,5.6,5.7,5.9,6.4]},
  "lines": [{"name": "Plan", "values": [4,4.2,4.5,4.6,4.8,5,5.1,5.2,5.3,5.5,5.8,6.3]}],
  "range": {
    "lower": [null, null, null, null, null, null, null, null, null, 5.4, 5.4, 5.7],
    "upper": [null, null, null, null, null, null, null, null, null, 6, 6.4, 7.1],
    "label": "Forecast range"
  }
}
FanChart

A forecast with its uncertainty: the central path and widening bands.

Cash should stay above $20M through 2027 in nine runs out of ten
Cash balance, $M, forecast from November 2026
ActualForecast90%50%
1520253035Jan 2026Apr 2026Jul 2026Oct 2026Jan 2027Apr 2027Jul 2027Dec 2027Forecast90% 3350% 29Forecast 26
Source: illustrative data
Note: Bands from 1,000 simulated paths of revenue and costs.

Avoid when: When the bands aren't modelled; an invented range misleads.

Spec type: "fan"
{
  "type": "fan",
  "title": "Cash should stay above $20M through 2027 in nine runs out of ten",
  "subtitle": "Cash balance, $M, forecast from November 2026",
  "source": "Source: illustrative data",
  "note": "Bands from 1,000 simulated paths of revenue and costs.",
  "x": [
    "2026-01", "2026-02", "2026-03", "2026-04", "2026-05", "2026-06", "2026-07", "2026-08",
    "2026-09", "2026-10", "2026-11", "2026-12", "2027-01", "2027-02", "2027-03", "2027-04",
    "2027-05", "2027-06", "2027-07", "2027-08", "2027-09", "2027-10", "2027-11", "2027-12"
  ],
  "actual": [
    31.2, 30.69, 30.26, 30.12, 29.8, 29.2, 28.82, 28.64, 28.18, 27.58, 27.33, null, null, null,
    null, null, null, null, null, null, null, null, null, null
  ],
  "forecast": [
    null, null, null, null, null, null, null, null, null, null, 27.4, 27.29, 27.18, 27.07,
    26.96, 26.86, 26.75, 26.64, 26.54, 26.43, 26.32, 26.22, 26.11, 26.01
  ],
  "bands": [
    {
      "label": "90%",
      "lower": [
        null, null, null, null, null, null, null, null, null, null, 27.4, 26.689999999999998,
        25.98, 25.27, 24.560000000000002, 23.86, 23.15, 22.44, 21.74, 21.03, 20.32,
        19.619999999999997, 18.91, 18.21
      ],
      "upper": [
        null, null, null, null, null, null, null, null, null, null, 27.4, 27.84, 28.28, 28.72,
        29.16, 29.61, 30.05, 30.490000000000002, 30.939999999999998, 31.38, 31.82,
        32.269999999999996, 32.71, 33.160000000000004
      ]
    },
    {
      "label": "50%",
      "lower": [
        null, null, null, null, null, null, null, null, null, null, 27.4, 27.04, 26.68, 26.32,
        25.96, 25.61, 25.25, 24.89, 24.54, 24.18, 23.82, 23.47, 23.11, 22.76
      ],
      "upper": [
        null, null, null, null, null, null, null, null, null, null, 27.4, 27.509999999999998,
        27.62, 27.73, 27.84, 27.96, 28.07, 28.18, 28.3, 28.41, 28.52, 28.64, 28.75, 28.87
      ]
    }
  ]
}
PacingChart

Progress through a period against the straight-line pace to target.

October bookings are 6% ahead of pace, projected at 105% of target
Cumulative bookings, $, October 2026
ActualPace to targetLast time
$0.0$2.0M$4.0M$6.0M1 Oct5 Oct9 Oct13 Oct17 Oct21 Oct25 Oct31 Oct$4.1M so far · +6% vs paceProjected (106%) $5.8MTarget $5.5M
Source: illustrative data
As of 30 Oct 2026

Avoid when: Seasonal periods where a straight pace is wrong; use last year's curve as the prior.

Spec type: "pacing"
{
  "type": "pacing",
  "title": "October bookings are 6% ahead of pace, projected at 105% of target",
  "subtitle": "Cumulative bookings, $, October 2026",
  "source": "Source: illustrative data",
  "asOf": "2026-10-30",
  "format": "currency",
  "x": [
    "2026-10-01", "2026-10-02", "2026-10-03", "2026-10-04", "2026-10-05", "2026-10-06",
    "2026-10-07", "2026-10-08", "2026-10-09", "2026-10-10", "2026-10-11", "2026-10-12",
    "2026-10-13", "2026-10-14", "2026-10-15", "2026-10-16", "2026-10-17", "2026-10-18",
    "2026-10-19", "2026-10-20", "2026-10-21", "2026-10-22", "2026-10-23", "2026-10-24",
    "2026-10-25", "2026-10-26", "2026-10-27", "2026-10-28", "2026-10-29", "2026-10-30",
    "2026-10-31"
  ],
  "target": 5500000,
  "actual": [
    186496, 374496, 564000, 755008, 947520, 1118976, 1310736, 1504000, 1698768, 1895040,
    2051456, 2246976, 2444000, 2642528, 2842560, 2983936, 3183216, 3384000, 3586288, 3790080,
    3916416, 4119456, null, null, null, null, null, null, null, null, null
  ],
  "prior": [
    160000, 320000, 480000, 640000, 800000, 960000, 1120000, 1280000, 1440000, 1600000,
    1760000, 1920000, 2080000, 2240000, 2400000, 2560000, 2720000, 2880000, 3040000, 3200000,
    3360000, 3520000, 3680000, 3840000, 4000000, 4160000, 4320000, 4480000, 4640000, 4800000,
    4960000
  ]
}
VarianceTrend

Actual against plan over time, the gap coloured ahead or behind.

Behind plan in spring, ahead since July
Revenue, $M per month, 2026
ActualPlanAhead of planBehind plan
44.555.56Jan 2026Mar 2026May 2026Jul 2026Sept 2026Oct 2026VarianceActual 5.8Plan 5.5
Source: illustrative data

Avoid when: When plan changed mid-period; show the re-forecast instead.

Spec type: "varianceTrend"
{
  "type": "varianceTrend",
  "title": "Behind plan in spring, ahead since July",
  "subtitle": "Revenue, $M per month, 2026",
  "source": "Source: illustrative data",
  "x": [
    "2026-01", "2026-02", "2026-03", "2026-04", "2026-05", "2026-06", "2026-07", "2026-08",
    "2026-09", "2026-10"
  ],
  "actual": [4, 4.1, 4.3, 4.4, 4.6, 4.9, 5.3, 5.5, 5.6, 5.8],
  "plan": [4, 4.2, 4.5, 4.7, 4.8, 5, 5.1, 5.2, 5.3, 5.5]
}

Comparison

BarChart · CAGR

Annual values with the compound growth rate called out.

Revenue has compounded at 21% a year since 2022
Revenue, $M, fiscal year
$0.0$20.0M$40.0M$60.0M20222023202420252026$23.5M$28.1M$34.6M$41.9M$50.4M+21.0% CAGR
Source: illustrative data

Avoid when: Fewer than three periods, or when a single year's jump is the story.

Spec type: "columns"
{
  "type": "columns",
  "cagr": true,
  "title": "Revenue has compounded at 21% a year since 2022",
  "subtitle": "Revenue, $M, fiscal year",
  "source": "Source: illustrative data",
  "format": "currency",
  "x": ["2022", "2023", "2024", "2025", "2026"],
  "series": [{"name": "Revenue", "values": [23500000,28100000,34600000,41900000,50400000]}]
}
BarChart · ranked

A ranking, with the items that matter highlighted.

Lisbon is growing fastest of our five largest cities
Revenue growth, % year on year, Q3 2026
Berlin31%Lisbon27%Madrid22%Paris19%London18%Warsaw16%Milan12%Dublin11%Vienna9%Prague8%Oslo5%Zurich4%
Source: illustrative data

Avoid when: More than about 15 items; show the top and group the rest.

Spec type: "bar"
{
  "type": "bar",
  "title": "Lisbon is growing fastest of our five largest cities",
  "subtitle": "Revenue growth, % year on year, Q3 2026",
  "source": "Source: illustrative data",
  "format": "percent",
  "highlight": ["Lisbon"],
  "categories": [
    "Berlin", "Lisbon", "Madrid", "Paris", "London", "Warsaw", "Milan", "Dublin", "Vienna",
    "Prague", "Oslo", "Zurich"
  ],
  "values": [0.31, 0.27, 0.22, 0.19, 0.18, 0.16, 0.12, 0.11, 0.09, 0.08, 0.05, 0.04]
}
BarChart · stacked

Totals per period and their parts, when both matter.

Services grew every quarter; hardware is flat
Revenue by product line, $M per quarter
SubscriptionsServicesHardware
051015Q1 25Q2 25Q3 25Q4 25Q1 26Q2 26Q3 269101112121314Hardware 9%Services 22%Subscriptions 69%
Source: illustrative data

Avoid when: Comparing the middle parts; only the bottom one shares a baseline.

Spec type: "columns"
{
  "type": "columns",
  "title": "Services grew every quarter; hardware is flat",
  "subtitle": "Revenue by product line, $M per quarter",
  "source": "Source: illustrative data",
  "x": ["Q1 25", "Q2 25", "Q3 25", "Q4 25", "Q1 26", "Q2 26", "Q3 26"],
  "series": [
    {"name": "Subscriptions", "values": [6.7,7,7.4,7.9,8.3,8.8,9.2]},
    {"name": "Services", "values": [1.8,2,2.2,2.5,2.7,3,3.3], "highlight": true},
    {"name": "Hardware", "values": [0.9,1,0.9,1.1,0.9,1,1]}
  ]
}
Dumbbell

Before and after for each item, the gap as the story.

Every team cut response time; support halved it
Median first response, hours, Q1 to Q3 2026
Q1Q3
051015Support−4.8Sales−1.1Billing−1.8Onboarding−1.1Security−1.7
Source: illustrative data

Avoid when: When the in-between path matters; use a line chart.

Spec type: "dumbbell"
{
  "type": "dumbbell",
  "title": "Every team cut response time; support halved it",
  "subtitle": "Median first response, hours, Q1 to Q3 2026",
  "source": "Source: illustrative data",
  "labels": ["Q1", "Q3"],
  "highlight": ["Support"],
  "categories": ["Support", "Sales", "Billing", "Onboarding", "Security"],
  "from": [9.2, 6.1, 7.4, 5.2, 12.5],
  "to": [4.4, 5, 5.6, 4.1, 10.8]
}
SlopeChart

How each item moved between two points in time, rank changes included.

Mobile overtook desktop as the top sign-up source
Share of sign-ups by source, 2024 and 2026
20242026Desktop 36%Mobile 24%Partners 18%Events 12%Referral 10%38% Mobile29% Desktop17% Partners9% Referral7% Events
Source: illustrative data

Avoid when: More than about ten items, or more than two time points.

Spec type: "slope"
{
  "type": "slope",
  "title": "Mobile overtook desktop as the top sign-up source",
  "subtitle": "Share of sign-ups by source, 2024 and 2026",
  "source": "Source: illustrative data",
  "format": "percent",
  "labels": ["2024", "2026"],
  "items": [
    {"name": "Mobile", "from": 0.24, "to": 0.38, "highlight": true},
    {"name": "Desktop", "from": 0.36, "to": 0.29},
    {"name": "Partners", "from": 0.18, "to": 0.17},
    {"name": "Events", "from": 0.12, "to": 0.07},
    {"name": "Referral", "from": 0.1, "to": 0.09}
  ]
}
BumpChart

Rank over time: who moved up and who fell back.

Lisbon climbed from seventh to second in a year
Rank by quarterly revenue among our seven largest cities
Q3 25Q4 25Q1 26Q2 26Q3 26Berlin1 BerlinParis3 ParisLondon4 LondonMadrid5 MadridMilan6 MilanDublin7 Dublin76422Lisbon2 Lisbon
Source: illustrative data

Avoid when: When the gaps between ranks matter; ranks hide them.

Spec type: "bump"
{
  "type": "bump",
  "title": "Lisbon climbed from seventh to second in a year",
  "subtitle": "Rank by quarterly revenue among our seven largest cities",
  "source": "Source: illustrative data",
  "x": ["Q3 25", "Q4 25", "Q1 26", "Q2 26", "Q3 26"],
  "series": [
    {"name": "Berlin", "values": [1,1,1,1,1]},
    {"name": "Paris", "values": [2,2,3,3,3]},
    {"name": "London", "values": [3,3,2,4,4]},
    {"name": "Madrid", "values": [4,5,5,5,5]},
    {"name": "Milan", "values": [5,4,6,6,6]},
    {"name": "Dublin", "values": [6,7,7,7,7]},
    {"name": "Lisbon", "values": [7,6,4,2,2], "highlight": true}
  ]
}
Butterfly

Two groups side by side across the same categories.

Enterprise customers use reports twice as much as small teams
Weekly sessions per account, by feature
Small teamsEnterprise12Dashboards219Reports186Alerts154Exports113API72Integrations5
Source: illustrative data

Avoid when: More than two groups.

Spec type: "butterfly"
{
  "type": "butterfly",
  "title": "Enterprise customers use reports twice as much as small teams",
  "subtitle": "Weekly sessions per account, by feature",
  "source": "Source: illustrative data",
  "left": {"name": "Small teams", "values": [12,9,6,4,3,2]},
  "right": {"name": "Enterprise", "values": [21,18,15,11,7,5]},
  "categories": ["Dashboards", "Reports", "Alerts", "Exports", "API", "Integrations"]
}
Pareto

The few causes that make most of the total.

Four reasons account for 80% of refunds
Refunds by reason, Q3 2026
The vital few: 4 of 8 make 87%Cumulative share
02004006000%50%100%Duplicate cha…Not as descri…Late deliveryCancelled orderDamagedWrong sizeFraudOther80% of total
Source: illustrative data

Avoid when: When the items are evenly sized; there are no vital few.

Spec type: "pareto"
{
  "type": "pareto",
  "title": "Four reasons account for 80% of refunds",
  "subtitle": "Refunds by reason, Q3 2026",
  "source": "Source: illustrative data",
  "categories": [
    "Duplicate charge", "Not as described", "Late delivery", "Cancelled order", "Damaged",
    "Wrong size", "Fraud", "Other"
  ],
  "values": [412, 288, 201, 156, 61, 44, 31, 27]
}
DotPlot

Several measures per item on one scale, without the weight of bars.

Satisfaction rose in every region; Asia Pacific most
Customer satisfaction score, 0–100
202420252026
6065707580North AmericaEuropeAsia PacificLatin America
Source: illustrative data

Avoid when: When values must be read from a zero baseline.

Spec type: "dotPlot"
{
  "type": "dotPlot",
  "title": "Satisfaction rose in every region; Asia Pacific most",
  "subtitle": "Customer satisfaction score, 0–100",
  "source": "Source: illustrative data",
  "categories": ["North America", "Europe", "Asia Pacific", "Latin America"],
  "series": [
    {"name": "2024", "values": [71,68,61,64]},
    {"name": "2025", "values": [73,70,66,65]},
    {"name": "2026", "values": [76,74,72,67], "highlight": true}
  ]
}
TileMap

A value per country or state, each the same size, so small places count.

Growth is strongest in the south and east
Revenue growth, % year on year, 2026
ISNO3%SE4%FI6%IE9%GB3%DK5%EE12%NL5%DE6%PL19%LV10%FR8%BE4%CZ16%SK13%LT14%PT24%ES21%CH2%LU1%AT7%HU15%UAIT14%SI11%HR17%RO22%MTBARSBG20%ALMKGR18%CY1%24%
Source: illustrative data

Avoid when: When true geography matters (distances, borders).

Spec type: "tileMap"
{
  "type": "tileMap",
  "grid": "europe",
  "title": "Growth is strongest in the south and east",
  "subtitle": "Revenue growth, % year on year, 2026",
  "source": "Source: illustrative data",
  "format": "percent",
  "values": {
    "PT": 0.24,
    "ES": 0.21,
    "FR": 0.08,
    "IT": 0.14,
    "DE": 0.06,
    "NL": 0.05,
    "BE": 0.04,
    "GB": 0.03,
    "IE": 0.09,
    "PL": 0.19,
    "CZ": 0.16,
    "AT": 0.07,
    "CH": 0.02,
    "SE": 0.04,
    "NO": 0.03,
    "DK": 0.05,
    "FI": 0.06,
    "RO": 0.22,
    "HU": 0.15,
    "GR": 0.18,
    "SK": 0.13,
    "SI": 0.11,
    "HR": 0.17,
    "BG": 0.2,
    "EE": 0.12,
    "LV": 0.1,
    "LT": 0.14,
    "LU": 0.01
  }
}

Composition

Waffle

Parts of one whole as 100 squares, easy to count.

Two thirds of revenue comes from annual plans
Revenue by billing term, 2026
66% $32.0MAnnual23% $11.0MMonthly11% $5.2MMulti-year
Source: illustrative data

Avoid when: More than about five parts, or parts under 1%.

Spec type: "waffle"
{
  "type": "waffle",
  "title": "Two thirds of revenue comes from annual plans",
  "subtitle": "Revenue by billing term, 2026",
  "source": "Source: illustrative data",
  "format": "currency",
  "items": [
    {"name": "Annual", "value": 32000000},
    {"name": "Monthly", "value": 11000000},
    {"name": "Multi-year", "value": 5200000}
  ]
}
Waffle · one per item

The same rate across a few items, each read against its own 100.

Six in ten German customers pay yearly, under a third in Spain
Share of customers on annual plans, 2026
61%Germany47%France44%United Kingdom36%Italy29%Spain
Source: illustrative data

Avoid when: More than about six items; use a dot plot.

Spec type: "waffle"
{
  "type": "waffle",
  "perItem": true,
  "title": "Six in ten German customers pay yearly, under a third in Spain",
  "subtitle": "Share of customers on annual plans, 2026",
  "source": "Source: illustrative data",
  "format": "percent",
  "items": [
    {"name": "Germany", "value": 0.61, "highlight": true},
    {"name": "France", "value": 0.47},
    {"name": "United Kingdom", "value": 0.44},
    {"name": "Italy", "value": 0.36},
    {"name": "Spain", "value": 0.29}
  ]
}
DonutChart

One whole split into at most five parts, the total in the middle.

Engineering is 41% of operating expenses
Operating expenses by function, $, Q3 2026
$7.5MOperating expenses41% $3.1MEngineering29% $2.2MSales and marketing12% $900.0KCustomer success11% $800.0KGeneral and admin7% $500.0KOther
Source: illustrative data

Avoid when: Comparing parts across periods (use bars); more than five slices fold into Other.

Spec type: "donut"
{
  "type": "donut",
  "title": "Engineering is 41% of operating expenses",
  "subtitle": "Operating expenses by function, $, Q3 2026",
  "source": "Source: illustrative data",
  "format": "currency",
  "totalLabel": "Operating expenses",
  "items": [
    {"name": "Engineering", "value": 3100000},
    {"name": "Sales and marketing", "value": 2200000},
    {"name": "Customer success", "value": 900000},
    {"name": "General and admin", "value": 800000},
    {"name": "Facilities", "value": 300000},
    {"name": "Legal", "value": 200000}
  ]
}
Treemap

Many parts of a whole by size, grouped when there's a hierarchy.

Ten customers make a third of subscription revenue
Annual recurring revenue by customer segment and size, $
EnterpriseMid-marketSmall businessPublic sector
Enterprise A–J$9.8M · 31%Mid-market$7.4M · 23%Other enterprise$6.1M · 19%Small teams$4.2M · 13%Solo$1.6M · 5%Education$1.1M · 3%
Source: illustrative data

Avoid when: Precise comparison between similar sizes; areas are hard to compare.

Spec type: "treemap"
{
  "type": "treemap",
  "title": "Ten customers make a third of subscription revenue",
  "subtitle": "Annual recurring revenue by customer segment and size, $",
  "source": "Source: illustrative data",
  "format": "currency",
  "items": [
    {"name": "Enterprise A–J", "value": 9800000, "group": "Enterprise"},
    {"name": "Other enterprise", "value": 6100000, "group": "Enterprise"},
    {"name": "Mid-market", "value": 7400000, "group": "Mid-market"},
    {"name": "Mid-market trials", "value": 900000, "group": "Mid-market"},
    {"name": "Small teams", "value": 4200000, "group": "Small business"},
    {"name": "Solo", "value": 1600000, "group": "Small business"},
    {"name": "Education", "value": 1100000, "group": "Public sector"},
    {"name": "Non-profit", "value": 600000, "group": "Public sector"}
  ]
}
Marimekko

Two splits at once: column width for the market size, height for the mix inside.

Europe is our largest market and the most subscription-heavy
Revenue by region (width) and product line (height), 2026
SubscriptionsServicesHardware
61%27%12%North America$16.5M · 37%74%19%7%Europe$16.7M · 38%59%28%13%Asia Pacific$7.1M · 16%51%34%15%SubscriptionsServicesHardware
Source: illustrative data

Avoid when: More than about six columns or four parts.

Spec type: "marimekko"
{
  "type": "marimekko",
  "title": "Europe is our largest market and the most subscription-heavy",
  "subtitle": "Revenue by region (width) and product line (height), 2026",
  "source": "Source: illustrative data",
  "format": "currency",
  "columns": ["North America", "Europe", "Asia Pacific", "Latin America"],
  "series": [
    {"name": "Subscriptions", "values": [10100000,12400000,4200000,2100000]},
    {"name": "Services", "values": [4400000,3100000,2000000,1400000]},
    {"name": "Hardware", "values": [2000000,1200000,900000,600000]}
  ]
}
Funnel

Stages where each is a subset of the one before: conversion, pipeline, onboarding.

More than half of trials that invite a teammate never connect data
Trial accounts by furthest stage reached, Q3 2026
StepOf firstTrial started8,200–100%Teammate invited5,10062%62%Data connected2,30045%28%Biggest dropFirst dashboard1,90083%23%Converted to paid1,01053%12%
Source: illustrative data
Note: Grey shows the stage before; red marks the largest step loss.

Avoid when: Stages that aren't subsets of the one before.

Spec type: "funnel"
{
  "type": "funnel",
  "title": "More than half of trials that invite a teammate never connect data",
  "subtitle": "Trial accounts by furthest stage reached, Q3 2026",
  "source": "Source: illustrative data",
  "note": "Grey shows the stage before; red marks the largest step loss.",
  "stages": [
    {"name": "Trial started", "value": 8200},
    {"name": "Teammate invited", "value": 5100},
    {"name": "Data connected", "value": 2300},
    {"name": "First dashboard", "value": 1900},
    {"name": "Converted to paid", "value": 1010}
  ]
}

Finance

Waterfall

A bridge from one total to another through the changes that explain it.

Price and volume more than offset higher hosting costs
Operating profit bridge, $, Q3 2025 to Q3 2026
$2.1MQ3 2025+$620.0KVolume+$380.0KPrice+$110.0KMix−$290.0KHosting−$240.0KHeadcount−$60.0KFX$2.6MQ3 2026
Source: illustrative data

Avoid when: When the totals dwarf the steps; use the bridge with a break.

Spec type: "waterfall"
{
  "type": "waterfall",
  "title": "Price and volume more than offset higher hosting costs",
  "subtitle": "Operating profit bridge, $, Q3 2025 to Q3 2026",
  "source": "Source: illustrative data",
  "format": "currency",
  "steps": [
    {"name": "Q3 2025", "value": 2100000, "total": true},
    {"name": "Volume", "value": 620000},
    {"name": "Price", "value": 380000},
    {"name": "Mix", "value": 110000},
    {"name": "Hosting", "value": -290000},
    {"name": "Headcount", "value": -240000},
    {"name": "FX", "value": -60000},
    {"name": "Q3 2026", "value": 2620000, "total": true}
  ]
}
BridgeBreak

A waterfall whose axis is broken so small steps stay readable next to large totals.

Revenue grew $8.5M, two thirds of it from existing customers
Revenue bridge, $, 2025 to 2026
$41.9M2025+$5.9MExpansion+$4.6MNew customers+$1.2MPrice−$2.6MChurn−$600.0KContraction$50.4M2026
Source: illustrative data
Note: The axis starts at $38M; totals are cut.

Avoid when: When the totals are the story; a broken axis understates them.

Spec type: "waterfall"
{
  "type": "waterfall",
  "break": true,
  "title": "Revenue grew $8.5M, two thirds of it from existing customers",
  "subtitle": "Revenue bridge, $, 2025 to 2026",
  "source": "Source: illustrative data",
  "note": "The axis starts at $38M; totals are cut.",
  "format": "currency",
  "steps": [
    {"name": "2025", "value": 41900000, "total": true},
    {"name": "Expansion", "value": 5900000},
    {"name": "New customers", "value": 4600000},
    {"name": "Price", "value": 1200000},
    {"name": "Churn", "value": -2600000},
    {"name": "Contraction", "value": -600000},
    {"name": "2026", "value": 50400000, "total": true}
  ]
}
VarianceChart

Variance against plan or prior, by market or line item.

Three markets explain the miss outside Germany
Revenue vs plan, $, Q3 2026
Germany+$220.0K +4.8%France−$140.0K −4.3%United Kingdom−$90.0K −3.3%Spain+$60.0K +3.6%Italy−$70.0K −4.9%Poland+$60.0K +6.7%Netherlands−$50.0K −5.4%
Source: illustrative data

Avoid when: When the size of each line matters more than its miss.

Spec type: "variance"
{
  "type": "variance",
  "title": "Three markets explain the miss outside Germany",
  "subtitle": "Revenue vs plan, $, Q3 2026",
  "source": "Source: illustrative data",
  "format": "currency",
  "categories": ["Germany", "France", "United Kingdom", "Spain", "Italy", "Poland", "Netherlands"],
  "actual": [4820000, 3100000, 2660000, 1710000, 1350000, 960000, 880000],
  "plan": [4600000, 3240000, 2750000, 1650000, 1420000, 900000, 930000]
}
BulletChart

Attainment against a target, with qualitative bands behind.

Europe and Asia Pacific are pacing ahead of target
Bookings, $M, year to date vs target
ActualTarget
North America▼ 95% of targetEurope▲ 108% of targetAsia Pacific▲ 107% of targetLatin America▼ 86% of target
Source: illustrative data

Avoid when: When there's no target; use bars.

Spec type: "bullet"
{
  "type": "bullet",
  "title": "Europe and Asia Pacific are pacing ahead of target",
  "subtitle": "Bookings, $M, year to date vs target",
  "source": "Source: illustrative data",
  "items": [
    {"name": "North America", "value": 14.2, "target": 15, "ranges": [10,13,17]},
    {"name": "Europe", "value": 16.8, "target": 15.6, "ranges": [11,14,18]},
    {"name": "Asia Pacific", "value": 7.4, "target": 6.9, "ranges": [5,6.5,8]},
    {"name": "Latin America", "value": 3.1, "target": 3.6, "ranges": [2.5,3.2,4.2]}
  ]
}
Sankey

Flows from sources to uses: revenue to costs and profit, budgets to teams.

Of every dollar of revenue, 21 cents is operating profit
Where revenue goes, $M, 2026
Subscriptions29Revenue44Services11Hardware5Gross profit28Cost of revenue17Operating expenses18Operating profit9
Source: illustrative data

Avoid when: More than about 20 flows, or flows that loop back.

Spec type: "sankey"
{
  "type": "sankey",
  "title": "Of every dollar of revenue, 21 cents is operating profit",
  "subtitle": "Where revenue goes, $M, 2026",
  "source": "Source: illustrative data",
  "links": [
    {"source": "Subscriptions", "target": "Revenue", "value": 28.8},
    {"source": "Services", "target": "Revenue", "value": 10.9},
    {"source": "Hardware", "target": "Revenue", "value": 4.7},
    {"source": "Revenue", "target": "Gross profit", "value": 27.7},
    {"source": "Revenue", "target": "Cost of revenue", "value": 16.7},
    {"source": "Gross profit", "target": "Operating expenses", "value": 18.4},
    {"source": "Gross profit", "target": "Operating profit", "value": 9.3}
  ]
}
FootballField

Valuation ranges by method, with the offer or price marked.

The offer sits in the upper half of every method's range
Enterprise value, $M, by valuation method
30035040045050055052-week trading range318446Trading comparables352468Precedent transactions381512Discounted cash flow336489Analyst targets360430Offer 412
Source: illustrative data

Avoid when: When the ranges come from one method run with different inputs; show a sensitivity table.

Spec type: "footballField"
{
  "type": "footballField",
  "title": "The offer sits in the upper half of every method's range",
  "subtitle": "Enterprise value, $M, by valuation method",
  "source": "Source: illustrative data",
  "marker": {"value": 412, "label": "Offer"},
  "items": [
    {"name": "52-week trading range", "low": 318, "high": 446},
    {"name": "Trading comparables", "low": 352, "high": 468},
    {"name": "Precedent transactions", "low": 381, "high": 512},
    {"name": "Discounted cash flow", "low": 336, "high": 489},
    {"name": "Analyst targets", "low": 360, "high": 430}
  ]
}
Timeline

Projects or phases as bars in time, milestones as diamonds, today marked.

The EU data region ships before the audit closes
Plan for the second half of 2026
ProductPlatformGo to market
JunJulAugSeptOctNovDecJan 2027Pricing studyUsage-based billingEU data regionSOC 2 auditAudit reportPartner launchAnnual kickoffToday
Source: illustrative data

Avoid when: More than about 15 items; group them.

Spec type: "timeline"
{
  "type": "timeline",
  "title": "The EU data region ships before the audit closes",
  "subtitle": "Plan for the second half of 2026",
  "source": "Source: illustrative data",
  "today": "2026-10-30",
  "items": [
    {"name": "Pricing study", "start": "2026-06-01", "end": "2026-07-20", "group": "Product"},
    {
      "name": "Usage-based billing",
      "start": "2026-07-15",
      "end": "2026-11-30",
      "group": "Product",
      "highlight": true
    },
    {
      "name": "EU data region",
      "start": "2026-08-01",
      "end": "2026-11-15",
      "group": "Platform",
      "highlight": true
    },
    {"name": "SOC 2 audit", "start": "2026-09-01", "end": "2026-12-15", "group": "Platform"},
    {"name": "Audit report", "start": "2026-12-20", "group": "Platform"},
    {"name": "Partner launch", "start": "2026-10-01", "end": "2026-10-31", "group": "Go to market"},
    {"name": "Annual kickoff", "start": "2027-01-12", "group": "Go to market"}
  ]
}

Distribution

Histogram

How values spread, with the median and mean marked.

Most deals are small; a long tail pulls the mean up
First-year contract value, $, deals closed in 2026
50100$0$20,000$40,000$60,000median $7,051mean $15,302
Source: illustrative data

Avoid when: Fewer than about 30 values; show them as a strip.

Spec type: "histogram"
{
  "type": "histogram",
  "mean": true,
  "title": "Most deals are small; a long tail pulls the mean up",
  "subtitle": "First-year contract value, $, deals closed in 2026",
  "source": "Source: illustrative data",
  "format": "currency",
  "values": [
    5397, 4536, 31682, 32982, 18331, 4719, 2076, 61135, 21848, 29452, 3566, 3716, 11704, 4853,
    6411, 2740, 37255, 3080, 3339, 13193, 2000, 4086, 2777, 2311, 5078, 54137, 11953, 18896,
    3000, 10365, 6791, 16840, 2941, 2153, 34497, 2688, 5848, 9508, 41502, 30743, 25244, 50299,
    2567, 2363, 5915, 29555, 48913, 2242, 30911, 9570, 2037, 41163, 55915, 2207, 2546, 3225,
    2452, 58655, 9462, 19018, 2475, 57263, 9866, 57664, 6601, 28777, 23961, 12341, 3785, 31271,
    2000, 13396, 36784, 3153, 2711, 31347, 2042, 54551, 38187, 2086, 12780, 7013, 60764, 13434,
    13199, 2085, 24208, 20558, 2435, 5180, 24091, 16907, 4283, 55152, 44130, 58584, 2038,
    34852, 2110, 10097, 6507, 17814, 5478, 12909, 17061, 2945, 2000, 20987, 5192, 51372, 29061,
    4039, 6769, 2024, 7032, 7228, 19542, 27523, 2513, 27889, 24859, 26700, 3154, 21577, 4926,
    61307, 8370, 2076, 9580, 2000, 3233, 4501, 5864, 5770, 23212, 11164, 5890, 18733, 2050,
    3188, 2107, 12524, 2003, 6441, 27239, 12362, 6766, 26555, 39649, 15264, 2124, 21351, 24474,
    7411, 33073, 2002, 4647, 3900, 30107, 45527, 6676, 29102, 46234, 19279, 22751, 2000, 6733,
    25001, 4138, 2746, 2102, 6095, 59842, 7127, 8750, 7633, 3094, 19754, 2586, 4848, 23650,
    16863, 4549, 2053, 2000, 3828, 2057, 2002, 2359, 2625, 14033, 33561, 6160, 2472, 2003,
    41261, 8521, 26576, 54410, 35751, 2194, 18109, 5260, 18500, 8541, 2033, 2551, 2010, 11317,
    2981, 2222, 5945, 14490, 2001, 21695, 33836, 2189, 46716, 4575, 2838, 7913, 2152, 2000,
    4644, 14833, 4389, 2075, 2306, 5959, 56931, 2327, 14985, 7069, 15484, 2005, 6873, 2006,
    2033, 51593, 23589
  ]
}
StripPlot

Every value as a dot, per group, with the median.

Enterprise deals take three times longer to close
Days from first call to signature, deals closed in 2026
Median
050100150Small teamsMid-marketEnterpriseNorthwind
Source: illustrative data

Avoid when: Thousands of values; use a histogram or box plot.

Spec type: "strip"
{
  "type": "strip",
  "title": "Enterprise deals take three times longer to close",
  "subtitle": "Days from first call to signature, deals closed in 2026",
  "source": "Source: illustrative data",
  "highlight": ["Northwind"],
  "groups": [
    {
      "name": "Small teams",
      "values": [
        8, 23, 15, 30, 22, 14, 29, 14, 29, 21, 13, 28, 20, 35, 20, 12, 27, 19, 34, 26, 18, 26, 18,
        10, 25, 17, 32, 24, 9, 24, 16, 31, 23, 15, 30, 15, 30, 22, 14, 29
      ]
    },
    {
      "name": "Mid-market",
      "values": [
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
        48, 49, 50, 51, 52, 53, 54
      ]
    },
    {
      "name": "Enterprise",
      "values": [60, 113, 76, 129, 92, 145, 108, 71, 124, 87, 140, 103, 66, 119, 82, 135, 98, 61],
      "labels": ["", "", "", "", "", "", "", "Northwind", "", "", "", "", "", "", "", "", "", ""]
    }
  ]
}
BoxPlot

Spread compared across groups: median, middle half, range and outliers.

Support tickets in Asia Pacific vary the most
Hours to resolve, Q3 2026
Middle half (box) and medianRange without outliers
0204060North America9Europe12Asia Pacific16Latin America19
Source: illustrative data

Avoid when: Audiences who don't read box plots; show a strip plot.

Spec type: "box"
{
  "type": "box",
  "title": "Support tickets in Asia Pacific vary the most",
  "subtitle": "Hours to resolve, Q3 2026",
  "source": "Source: illustrative data",
  "groups": [
    {
      "name": "North America",
      "values": [
        34, 12.4, 10.6, 8.8, 7, 5.2, 13.6, 11.8, 10, 8.2, 6.4, 4.6, 13, 11.2, 9.4, 7.6, 5.8, 4,
        12.4, 10.6, 8.8, 7, 5.2, 13.6, 11.8, 10, 8.2, 6.4, 4.6, 43, 11.2, 9.4, 7.6, 5.8, 4, 12.4,
        10.6, 8.8, 7, 5.2, 13.6, 11.8, 10, 8.2, 6.4, 4.6, 13, 11.2, 9.4, 7.6, 5.8, 4, 12.4, 10.6,
        8.8, 7, 5.2, 13.6, 41.8, 10
      ]
    },
    {
      "name": "Europe",
      "values": [
        35.5, 8.9, 12.3, 15.7, 19.1, 8.1, 11.5, 14.9, 18.3, 7.2, 10.6, 14, 17.4, 6.4, 9.8, 13.2,
        16.5, 5.5, 8.9, 12.3, 15.7, 19.1, 8.1, 11.5, 14.9, 18.3, 7.2, 10.6, 14, 47.4, 6.4, 9.8,
        13.2, 16.5, 5.5, 8.9, 12.3, 15.7, 19.1, 8.1, 11.5, 14.9, 18.3, 7.2, 10.6, 14, 17.4, 6.4,
        9.8, 13.2, 16.5, 5.5, 8.9, 12.3, 15.7, 19.1, 8.1, 11.5, 44.9, 18.3
      ]
    },
    {
      "name": "Asia Pacific",
      "values": [
        37, 19.1, 12.5, 24.6, 18, 11.4, 23.5, 16.9, 10.3, 22.4, 15.8, 9.2, 21.3, 14.7, 8.1, 20.2,
        13.6, 7, 19.1, 12.5, 24.6, 18, 11.4, 23.5, 16.9, 10.3, 22.4, 15.8, 9.2, 51.3, 14.7, 8.1,
        20.2, 13.6, 7, 19.1, 12.5, 24.6, 18, 11.4, 23.5, 16.9, 10.3, 22.4, 15.8, 9.2, 21.3, 14.7,
        8.1, 20.2, 13.6, 7, 19.1, 12.5, 24.6, 18, 11.4, 23.5, 46.9, 10.3
      ]
    },
    {
      "name": "Latin America",
      "values": [
        38.5, 9.9, 11.2, 12.6, 13.9, 15.3, 16.6, 18, 19.3, 20.7, 22, 23.4, 24.7, 26.1, 27.4, 28.8,
        30.1, 8.5, 9.9, 11.2, 12.6, 13.9, 15.3, 16.6, 18, 19.3, 20.7, 22, 23.4, 54.7, 26.1, 27.4,
        28.8, 30.1, 8.5, 9.9, 11.2, 12.6, 13.9, 15.3, 16.6, 18, 19.3, 20.7, 22, 23.4, 24.7, 26.1,
        27.4, 28.8, 30.1, 8.5, 9.9, 11.2, 12.6, 13.9, 15.3, 16.6, 48, 19.3
      ]
    }
  ]
}
RangeChart

A low-to-high range per item with where it sits now.

Card fees are near the top of their 12-month range in four markets
Card processing fee, % of payment, last 12 months
12-month low to highOctober
1.2%1.4%1.6%1.8%2%2.2%Germany1.4%1.7%France1.5%1.7%United Kingdom1.4%1.7%Spain1.6%1.9%Italy1.6%1.8%Poland1.7%2%
Source: illustrative data

Avoid when: When the full distribution matters; use a box plot.

Spec type: "range"
{
  "type": "range",
  "title": "Card fees are near the top of their 12-month range in four markets",
  "subtitle": "Card processing fee, % of payment, last 12 months",
  "source": "Source: illustrative data",
  "format": "percent",
  "labels": ["12-month low", "high", "October"],
  "categories": ["Germany", "France", "United Kingdom", "Spain", "Italy", "Poland"],
  "low": [0.0141, 0.0152, 0.0138, 0.0161, 0.0158, 0.0172],
  "high": [0.0168, 0.0171, 0.0166, 0.0189, 0.0177, 0.0204],
  "current": [0.0166, 0.0169, 0.0142, 0.0187, 0.0175, 0.0181]
}
Beeswarm

Every value as a dot without overlap, so clusters and gaps show.

Most accounts log in weekly; a cluster has gone quiet
Days since last login, enterprise accounts
0102030405060Northwind
Source: illustrative data

Avoid when: More than a few hundred values.

Spec type: "beeswarm"
{
  "type": "beeswarm",
  "title": "Most accounts log in weekly; a cluster has gone quiet",
  "subtitle": "Days since last login, enterprise accounts",
  "source": "Source: illustrative data",
  "highlight": ["Northwind"],
  "points": [
    {"value": 1},
    {"value": 8},
    {"value": 10},
    {"value": 6},
    {"value": 8},
    {"value": 10},
    {"value": 6},
    {"value": 8},
    {"value": 15},
    {"value": 6},
    {"value": 8},
    {"value": 4},
    {"value": 6},
    {"value": 13},
    {"value": 4},
    {"value": 6},
    {"value": 13},
    {"value": 4},
    {"value": 11},
    {"value": 13},
    {"value": 4},
    {"value": 11},
    {"value": 2},
    {"value": 9},
    {"value": 11},
    {"value": 2},
    {"value": 9},
    {"value": 11},
    {"value": 7},
    {"value": 9},
    {"value": 11},
    {"value": 7},
    {"value": 9},
    {"value": 5},
    {"value": 7},
    {"value": 9},
    {"value": 5},
    {"value": 7},
    {"value": 14},
    {"value": 5},
    {"value": 7},
    {"value": 14},
    {"value": 5},
    {"value": 12},
    {"value": 3},
    {"value": 5},
    {"value": 12},
    {"value": 3},
    {"value": 10},
    {"value": 12},
    {"value": 3},
    {"value": 10},
    {"value": 12},
    {"value": 8},
    {"value": 10},
    {"value": 1},
    {"value": 8},
    {"value": 10},
    {"value": 6},
    {"value": 8},
    {"value": 10},
    {"value": 6},
    {"value": 8},
    {"value": 15},
    {"value": 6},
    {"value": 8},
    {"value": 4},
    {"value": 6},
    {"value": 13},
    {"value": 4},
    {"value": 6},
    {"value": 13},
    {"value": 4},
    {"value": 11},
    {"value": 13},
    {"value": 4},
    {"value": 11},
    {"value": 2},
    {"value": 9},
    {"value": 11},
    {"value": 2},
    {"value": 9},
    {"value": 11},
    {"value": 7},
    {"value": 9},
    {"value": 11},
    {"value": 7},
    {"value": 9},
    {"value": 5},
    {"value": 7},
    {"value": 9},
    {"value": 5},
    {"value": 7},
    {"value": 14},
    {"value": 5},
    {"value": 7},
    {"value": 14},
    {"value": 5},
    {"value": 12},
    {"value": 3},
    {"value": 5},
    {"value": 12},
    {"value": 3},
    {"value": 10},
    {"value": 12},
    {"value": 3},
    {"value": 10},
    {"value": 12},
    {"value": 8},
    {"value": 10},
    {"value": 42},
    {"value": 39},
    {"value": 36},
    {"value": 33},
    {"value": 50},
    {"value": 47},
    {"value": 44},
    {"value": 41},
    {"value": 38},
    {"value": 35},
    {"name": "Northwind", "value": 32},
    {"value": 49},
    {"value": 46},
    {"value": 43},
    {"value": 40},
    {"value": 37},
    {"value": 34},
    {"value": 51},
    {"value": 48},
    {"value": 45},
    {"value": 42},
    {"value": 39},
    {"value": 36},
    {"value": 33},
    {"value": 50},
    {"value": 47},
    {"value": 44},
    {"value": 41},
    {"value": 38},
    {"value": 35}
  ]
}

Relationship

Scatter

Two measures per item, split into quadrants, bubble size for a third.

Lisbon and Warsaw grow fast with healthy margins; Paris needs attention
Cities by revenue growth and margin, bubble size = revenue
5%10%15%20%25%30%0%5%10%15%20%25%30%↑ MarginRevenue growth →MATURESTARSFIXINVESTBerlinLondonMadridMilanDublinViennaPragueParisLisbonWarsaw
Source: illustrative data

Avoid when: When there's no relationship to show; a table reads faster.

Spec type: "scatter"
{
  "type": "scatter",
  "title": "Lisbon and Warsaw grow fast with healthy margins; Paris needs attention",
  "subtitle": "Cities by revenue growth and margin, bubble size = revenue",
  "source": "Source: illustrative data",
  "format": "percent",
  "xFormat": "percent",
  "xLabel": "Revenue growth",
  "yLabel": "Margin",
  "quadrants": {"x": 0.12, "y": 0.18, "labels": ["Mature", "Stars", "Fix", "Invest"]},
  "points": [
    {"name": "Berlin", "x": 0.08, "y": 0.26, "size": 9.1},
    {"name": "London", "x": 0.06, "y": 0.21, "size": 8.2},
    {"name": "Paris", "x": 0.04, "y": 0.09, "size": 7.4, "highlight": true},
    {"name": "Madrid", "x": 0.14, "y": 0.17, "size": 4.1},
    {"name": "Lisbon", "x": 0.27, "y": 0.22, "size": 2.3, "highlight": true},
    {"name": "Warsaw", "x": 0.21, "y": 0.24, "size": 1.9, "highlight": true},
    {"name": "Milan", "x": 0.11, "y": 0.15, "size": 3.3},
    {"name": "Dublin", "x": 0.16, "y": 0.29, "size": 1.6},
    {"name": "Vienna", "x": 0.07, "y": 0.19, "size": 1.4},
    {"name": "Prague", "x": 0.18, "y": 0.12, "size": 1.1}
  ]
}

Grids and tables

Heatmap

A grid of markets by weeks, coloured around plan, with totals in the margins.

France has missed plan for six straight weeks
Revenue vs plan, % by week, W33–W44 2026
W33W34W35W36W37W38W39W40W41W42W43W44GermanyGermany, W33: 1.2%1.2%Germany, W34: 2.1%2.1%Germany, W35: 3%3%Germany, W36: 3.6%3.6%Germany, W37: 2.4%2.4%Germany, W38: 0.7%0.7%Germany, W39: −1.8%−1.8%Germany, W40: −2.7%−2.7%Germany, W41: 1.2%1.2%Germany, W42: 2.6%2.6%Germany, W43: 3.6%3.6%Germany, W44: 2.9%2.9%FranceFrance, W33: 1.6%1.6%France, W34: 2.9%2.9%France, W35: 3.4%3.4%France, W36: 3%3%France, W37: 0.8%0.8%France, W38: −1.4%−1.4%France, W39: −2.8%−2.8%France, W40: −3.3%−3.3%France, W41: −7%−7%France, W42: −5%−5%France, W43: −3.3%−3.3%France, W44: −1.7%−1.7%United KingdomUnited Kingdom, W33: −1.2%−1.2%United Kingdom, W34: −2.9%−2.9%United Kingdom, W35: −3.4%−3.4%United Kingdom, W36: −3.5%−3.5%United Kingdom, W37: −1.4%−1.4%United Kingdom, W38: 0.6%0.6%United Kingdom, W39: 2.5%2.5%United Kingdom, W40: 3.4%3.4%United Kingdom, W41: 2.8%2.8%United Kingdom, W42: 1.7%1.7%United Kingdom, W43: 0.5%0.5%United Kingdom, W44: −2.3%−2.3%SpainSpain, W33: −3.1%−3.1%Spain, W34: −1.5%−1.5%Spain, W35: −0.4%−0.4%Spain, W36: 2.4%2.4%Spain, W37: 3.6%3.6%Spain, W38: 3.9%3.9%Spain, W39: 2.8%2.8%Spain, W40: 0.7%0.7%Spain, W41: −1.7%−1.7%Spain, W42: −3.3%−3.3%Spain, W43: −3.3%−3.3%Spain, W44: −2.3%−2.3%ItalyItaly, W33: 2.6%2.6%Italy, W34: 1.6%1.6%Italy, W35: −0.5%−0.5%Italy, W36: −2.6%−2.6%Italy, W37: −3.1%−3.1%Italy, W38: −2.6%−2.6%Italy, W39: −1.9%−1.9%Italy, W40: 0.6%0.6%Italy, W41: 2%2%Italy, W42: 3.4%3.4%Italy, W43: 3.3%3.3%Italy, W44: 2.3%2.3%PolandPoland, W33: −2%−2%Poland, W34: −3.5%−3.5%Poland, W35: −3.5%−3.5%Poland, W36: −1.9%−1.9%Poland, W37: −0.2%−0.2%Poland, W38: 2.2%2.2%Poland, W39: 3.3%3.3%Poland, W40: 3.4%3.4%Poland, W41: 2.3%2.3%Poland, W42: 0.6%0.6%Poland, W43: −1.8%−1.8%Poland, W44: −2.9%−2.9%
Source: illustrative data

Avoid when: When exact values matter more than the pattern.

Spec type: "heatmap"
{
  "type": "heatmap",
  "diverging": true,
  "title": "France has missed plan for six straight weeks",
  "subtitle": "Revenue vs plan, % by week, W33–W44 2026",
  "source": "Source: illustrative data",
  "format": "percent",
  "rows": ["Germany", "France", "United Kingdom", "Spain", "Italy", "Poland"],
  "columns": ["W33", "W34", "W35", "W36", "W37", "W38", "W39", "W40", "W41", "W42", "W43", "W44"],
  "values": [
    [0.012, 0.021, 0.03, 0.036, 0.024, 0.007, -0.018, -0.027, 0.012, 0.026, 0.036, 0.029],
    [0.016, 0.029, 0.034, 0.03, 0.008, -0.014, -0.028, -0.033, -0.07, -0.05, -0.033, -0.017],
    [-0.012, -0.029, -0.034, -0.035, -0.014, 0.006, 0.025, 0.034, 0.028, 0.017, 0.005, -0.023],
    [-0.031, -0.015, -0.004, 0.024, 0.036, 0.039, 0.028, 0.007, -0.017, -0.033, -0.033, -0.023],
    [0.026, 0.016, -0.005, -0.026, -0.031, -0.026, -0.019, 0.006, 0.02, 0.034, 0.033, 0.023],
    [-0.02, -0.035, -0.035, -0.019, -0.002, 0.022, 0.033, 0.034, 0.023, 0.006, -0.018, -0.029]
  ]
}
TableChart

A table that is also a chart: inline bars, deltas, sparklines and bullets, sortable by any column.

Six of eight markets are ahead of plan; France and Italy are behind
Revenue, $, January to October 2026; click a column to sort
Germany
$12.1M
▲ +14%
103%
31%
France
$8.4M
▲ +5.0%
94%
24%
United Kingdom
$7.2M
▲ +9.0%
103%
27%
Spain
$4.6M
▲ +21%
105%
22%
Italy
$3.9M
▲ +4.0%
95%
20%
Poland
$2.6M
▲ +19%
104%
26%
Netherlands
$2.4M
▲ +7.0%
102%
29%
Sweden
$1.9M
▲ +11%
103%
30%
Total$43.1M▲ +11%
100%
27%
Source: illustrative data
Note: Total growth and margin are weighted by revenue.
As of 30 Oct 2026

Avoid when: More than about 15 rows without a scroll, or when one trend is the whole story.

Spec type: "table"
{
  "type": "table",
  "title": "Six of eight markets are ahead of plan; France and Italy are behind",
  "subtitle": "Revenue, $, January to October 2026; click a column to sort",
  "source": "Source: illustrative data",
  "note": "Total growth and margin are weighted by revenue.",
  "asOf": "2026-10-30",
  "highlight": ["France", "Italy"],
  "columns": [
    {"key": "market", "label": "Market"},
    {"key": "revenue", "label": "Revenue YTD", "kind": "bar", "format": "currency"},
    {"key": "growth", "label": "YoY", "kind": "delta"},
    {"key": "trend", "label": "Monthly", "kind": "sparkline"},
    {"key": "actual", "label": "vs plan", "kind": "bullet", "target": "plan"},
    {"key": "margin", "label": "Margin", "kind": "number", "format": "percent"}
  ],
  "rows": [
    {
      "market": "Germany",
      "revenue": 12100000,
      "growth": 0.14,
      "trend": [1.02, 1.03, 1.04, 1.08, 1.11, 1.11, 1.12, 1.16, 1.17, 1.17],
      "actual": 12.1,
      "plan": 11.8,
      "margin": 0.31
    },
    {
      "market": "France",
      "revenue": 8400000,
      "growth": 0.05,
      "trend": [0.91, 0.9, 0.92, 0.92, 0.89, 0.88, 0.89, 0.88, 0.85, 0.85],
      "actual": 8.4,
      "plan": 8.9,
      "margin": 0.24
    },
    {
      "market": "United Kingdom",
      "revenue": 7200000,
      "growth": 0.09,
      "trend": [0.68, 0.7, 0.71, 0.7, 0.71, 0.73, 0.72, 0.71, 0.73, 0.74],
      "actual": 7.2,
      "plan": 7,
      "margin": 0.27
    },
    {
      "market": "Spain",
      "revenue": 4600000,
      "growth": 0.21,
      "trend": [0.41, 0.43, 0.42, 0.43, 0.45, 0.45, 0.45, 0.47, 0.49, 0.49],
      "actual": 4.6,
      "plan": 4.4,
      "margin": 0.22
    },
    {
      "market": "Italy",
      "revenue": 3900000,
      "growth": 0.04,
      "trend": [0.42, 0.4, 0.4, 0.41, 0.4, 0.38, 0.39, 0.39, 0.38, 0.37],
      "actual": 3.9,
      "plan": 4.1,
      "margin": 0.2
    },
    {
      "market": "Poland",
      "revenue": 2600000,
      "growth": 0.19,
      "trend": [0.22, 0.23, 0.24, 0.24, 0.24, 0.25, 0.26, 0.27, 0.27, 0.29],
      "actual": 2.6,
      "plan": 2.5,
      "margin": 0.26
    },
    {
      "market": "Netherlands",
      "revenue": 2400000,
      "growth": 0.07,
      "trend": [0.23, 0.24, 0.23, 0.23, 0.23, 0.24, 0.24, 0.23, 0.24, 0.25],
      "actual": 2.4,
      "plan": 2.35,
      "margin": 0.29
    },
    {
      "market": "Sweden",
      "revenue": 1900000,
      "growth": 0.11,
      "trend": [0.19, 0.18, 0.18, 0.18, 0.19, 0.19, 0.18, 0.19, 0.2, 0.2],
      "actual": 1.9,
      "plan": 1.85,
      "margin": 0.3
    }
  ],
  "total": {
    "market": "Total",
    "revenue": 43100000,
    "growth": 0.11,
    "actual": 43.1,
    "plan": 42.9,
    "margin": 0.27
  }
}
Scorecard

Actual against target per measure, with a status chip and trend.

Five of seven company goals are on track
Q4 2026 goals, quarter to date
MeasureActualTargetvs targetStatusTrend
Revenue$15.4M$15.0M▲ +2.7%On track
Gross margin62%62%▼ −0.3%Watch
New customers1,2101,150▲ +5.2%On track
Net revenue retention109%112%▼ −2.7%Off track
Churn, monthly1.9%2.2%▼ −14%On track
Support first response, h4.44▲ +10%Off track
Uptime100%100%▲ +0.1%On track
Source: illustrative data
As of 30 Oct 2026

Avoid when: Measures without agreed targets.

Spec type: "scorecard"
{
  "type": "scorecard",
  "title": "Five of seven company goals are on track",
  "subtitle": "Q4 2026 goals, quarter to date",
  "source": "Source: illustrative data",
  "asOf": "2026-10-30",
  "rows": [
    {
      "name": "Revenue",
      "actual": 15400000,
      "target": 15000000,
      "format": "currency",
      "trend": [1.63, 1.64, 1.66, 1.73, 1.77, 1.77, 1.8, 1.86]
    },
    {
      "name": "Gross margin",
      "actual": 0.618,
      "target": 0.62,
      "format": "percent",
      "trend": [0.61, 0.61, 0.61, 0.61, 0.62, 0.61, 0.61, 0.62]
    },
    {
      "name": "New customers",
      "actual": 1210,
      "target": 1150,
      "trend": [124.06, 123.66, 124.76, 131.81, 135.17, 132.78, 134.86, 140.96]
    },
    {
      "name": "Net revenue retention",
      "actual": 1.09,
      "target": 1.12,
      "format": "percent",
      "trend": [1.1, 1.1, 1.09, 1.09, 1.09, 1.08, 1.08, 1.08],
      "tolerance": 0.02
    },
    {
      "name": "Churn, monthly",
      "actual": 0.019,
      "target": 0.022,
      "format": "percent",
      "invert": true,
      "trend": [0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
    },
    {
      "name": "Support first response, h",
      "actual": 4.4,
      "target": 4,
      "invert": true,
      "trend": [6.14, 5.8, 5.53, 5.46, 5.27, 4.9, 4.69, 4.61]
    },
    {
      "name": "Uptime",
      "actual": 0.9995,
      "target": 0.999,
      "format": "percent",
      "trend": [1, 1, 1, 1, 1, 1, 1, 1]
    }
  ]
}
CalendarHeatmap

Daily patterns across a year: day-of-week rhythm, holidays, outages.

Tuesdays are the busiest day; the August outage shows as a two-day gap
Orders per day, 1 January to 29 October 2026
2026-01-01: 1000Jan2026-01-02: 10532026-01-03: 5692026-01-04: 6232026-01-05: 10562026-01-06: 11342026-01-07: 10092026-01-08: 10592026-01-09: 9562026-01-10: 6292026-01-11: 6772026-01-12: 9592026-01-13: 12002026-01-14: 10642026-01-15: 9612026-01-16: 10222026-01-17: 6802026-01-18: 5772026-01-19: 10262026-01-20: 12532026-01-21: 9672026-01-22: 10302026-01-23: 10722026-01-24: 5802026-01-25: 6452026-01-26: 10752026-01-27: 11582026-01-28: 10392026-01-29: 10782026-01-30: 9762026-01-31: 6512026-02-01: 6872026-02-02: 979Feb2026-02-03: 12342026-02-04: 10832026-02-05: 9822026-02-06: 10522026-02-07: 6902026-02-08: 5892026-02-09: 10562026-02-10: 12762026-02-11: 9882026-02-12: 10612026-02-13: 10912026-02-14: 5932026-02-15: 6662026-02-16: 10942026-02-17: 11842026-02-18: 10692026-02-19: 10962026-02-20: 9972026-02-21: 6722026-02-22: 6972026-02-23: 10002026-02-24: 12692026-02-25: 11022026-02-26: 10042026-02-27: 10822026-02-28: 7002026-03-01: 6022026-03-02: 1086Mar2026-03-03: 12992026-03-04: 10102026-03-05: 10912026-03-06: 11092026-03-07: 6062026-03-08: 6872026-03-09: 11122026-03-10: 12102026-03-11: 10992026-03-12: 11142026-03-13: 10192026-03-14: 6932026-03-15: 7062026-03-16: 10232026-03-17: 13032026-03-18: 11192026-03-19: 10262026-03-20: 11122026-03-21: 7092026-03-22: 6152026-03-23: 11162026-03-24: 13212026-03-25: 10322026-03-26: 11212026-03-27: 11272026-03-28: 6192026-03-29: 7082026-03-30: 11292026-03-31: 12372026-04-01: 11292026-04-02: 11322026-04-03: 10422026-04-04: 7142026-04-05: 7152026-04-06: 1046Apr2026-04-07: 13372026-04-08: 11372026-04-09: 10492026-04-10: 11422026-04-11: 7172026-04-12: 6302026-04-13: 11462026-04-14: 13422026-04-15: 10562026-04-16: 11502026-04-17: 11442026-04-18: 6342026-04-19: 7292026-04-20: 11462026-04-21: 12642026-04-22: 11582026-04-23: 11492026-04-24: 10662026-04-25: 7342026-04-26: 7232026-04-27: 10692026-04-28: 13702026-04-29: 11542026-04-30: 10732026-05-01: 11712026-05-02: 7252026-05-03: 6452026-05-04: 1175May2026-05-05: 13632026-05-06: 10802026-05-07: 11792026-05-08: 11612026-05-09: 6492026-05-10: 7492026-05-11: 11632026-05-12: 12932026-05-13: 11872026-05-14: 11662026-05-15: 10902026-05-16: 7542026-05-17: 7312026-05-18: 10942026-05-19: 14032026-05-20: 11702026-05-21: 10982026-05-22: 11992026-05-23: 7332026-05-24: 6612026-05-25: 12032026-05-26: 13842026-05-27: 11052026-05-28: 12072026-05-29: 11772026-05-30: 6662026-05-31: 7682026-06-01: 1180Jun2026-06-02: 13222026-06-03: 12152026-06-04: 11822026-06-05: 11162026-06-06: 7732026-06-07: 7382026-06-08: 11192026-06-09: 14352026-06-10: 11872026-06-11: 11232026-06-12: 12272026-06-13: 7402026-06-14: 6782026-06-15: 12312026-06-16: 14052026-06-17: 11312026-06-18: 12352026-06-19: 11942026-06-20: 6832026-06-21: 7872026-06-22: 11962026-06-23: 13532026-06-24: 12432026-06-25: 11982026-06-26: 11422026-06-27: 7922026-06-28: 7462026-06-29: 11462026-06-30: 14672026-07-01: 12032026-07-02: 11492026-07-03: 12552026-07-04: 7482026-07-05: 6952026-07-06: 1258Jul2026-07-07: 14252026-07-08: 11572026-07-09: 12622026-07-10: 12102026-07-11: 7002026-07-12: 8052026-07-13: 12122026-07-14: 13842026-07-15: 12702026-07-16: 12152026-07-17: 11692026-07-18: 8102026-07-19: 7532026-07-20: 11732026-07-21: 14982026-07-22: 12192026-07-23: 11772026-07-24: 12812026-07-25: 7552026-07-26: 7132026-07-27: 12852026-07-28: 14462026-07-29: 11842026-07-30: 12892026-07-31: 12262026-08-01: 7192026-08-02: 8232026-08-03: 1229Aug2026-08-04: 14152026-08-05: 12962026-08-06: 12312026-08-07: 11962026-08-08: 8272026-08-09: 7602026-08-10: 12002026-08-11: 15282026-08-12: 02026-08-13: 02026-08-14: 13072026-08-15: 7632026-08-16: 7322026-08-17: 13112026-08-18: 14662026-08-19: 12122026-08-20: 13142026-08-21: 12432026-08-22: 7382026-08-23: 8392026-08-24: 12452026-08-25: 14482026-08-26: 13222026-08-27: 12472026-08-28: 12242026-08-29: 8442026-08-30: 7682026-08-31: 12292026-09-01: 15572026-09-02: 12522026-09-03: 12332026-09-04: 13322026-09-05: 7702026-09-06: 7522026-09-07: 1336Sept2026-09-08: 14872026-09-09: 12412026-09-10: 13392026-09-11: 12592026-09-12: 7582026-09-13: 8552026-09-14: 12622026-09-15: 14802026-09-16: 13462026-09-17: 12642026-09-18: 12532026-09-19: 8592026-09-20: 7762026-09-21: 12572026-09-22: 15862026-09-23: 12692026-09-24: 12622026-09-25: 13572026-09-26: 7782026-09-27: 7722026-09-28: 13602026-09-29: 15082026-09-30: 12702026-10-01: 13632026-10-02: 12762026-10-03: 7782026-10-04: 8702026-10-05: 1279Oct2026-10-06: 15142026-10-07: 13702026-10-08: 12812026-10-09: 12822026-10-10: 8742026-10-11: 7842026-10-12: 12872026-10-13: 16142026-10-14: 12862026-10-15: 12912026-10-16: 13802026-10-17: 7872026-10-18: 7932026-10-19: 13832026-10-20: 15292026-10-21: 12992026-10-22: 13862026-10-23: 12942026-10-24: 7992026-10-25: 8842026-10-26: 12962026-10-27: 15482026-10-28: 13932026-10-29: 1299AverageMon 1,168Tue 1,378Wed 1,142Thu 1,140Fri 1,165Sat 721Sun 724MonWedFri
Source: illustrative data

Avoid when: Fewer than about eight weeks of days.

Spec type: "calendar"
{
  "type": "calendar",
  "byWeekday": true,
  "title": "Tuesdays are the busiest day; the August outage shows as a two-day gap",
  "subtitle": "Orders per day, 1 January to 29 October 2026",
  "source": "Source: illustrative data",
  "from": "2026-01-01",
  "to": "2026-10-29",
  "days": [
    {"date": "2026-01-01", "value": 1000},
    {"date": "2026-01-02", "value": 1053},
    {"date": "2026-01-03", "value": 569},
    {"date": "2026-01-04", "value": 623},
    {"date": "2026-01-05", "value": 1056},
    {"date": "2026-01-06", "value": 1134},
    {"date": "2026-01-07", "value": 1009},
    {"date": "2026-01-08", "value": 1059},
    {"date": "2026-01-09", "value": 956},
    {"date": "2026-01-10", "value": 629},
    {"date": "2026-01-11", "value": 677},
    {"date": "2026-01-12", "value": 959},
    {"date": "2026-01-13", "value": 1200},
    {"date": "2026-01-14", "value": 1064},
    {"date": "2026-01-15", "value": 961},
    {"date": "2026-01-16", "value": 1022},
    {"date": "2026-01-17", "value": 680},
    {"date": "2026-01-18", "value": 577},
    {"date": "2026-01-19", "value": 1026},
    {"date": "2026-01-20", "value": 1253},
    {"date": "2026-01-21", "value": 967},
    {"date": "2026-01-22", "value": 1030},
    {"date": "2026-01-23", "value": 1072},
    {"date": "2026-01-24", "value": 580},
    {"date": "2026-01-25", "value": 645},
    {"date": "2026-01-26", "value": 1075},
    {"date": "2026-01-27", "value": 1158},
    {"date": "2026-01-28", "value": 1039},
    {"date": "2026-01-29", "value": 1078},
    {"date": "2026-01-30", "value": 976},
    {"date": "2026-01-31", "value": 651},
    {"date": "2026-02-01", "value": 687},
    {"date": "2026-02-02", "value": 979},
    {"date": "2026-02-03", "value": 1234},
    {"date": "2026-02-04", "value": 1083},
    {"date": "2026-02-05", "value": 982},
    {"date": "2026-02-06", "value": 1052},
    {"date": "2026-02-07", "value": 690},
    {"date": "2026-02-08", "value": 589},
    {"date": "2026-02-09", "value": 1056},
    {"date": "2026-02-10", "value": 1276},
    {"date": "2026-02-11", "value": 988},
    {"date": "2026-02-12", "value": 1061},
    {"date": "2026-02-13", "value": 1091},
    {"date": "2026-02-14", "value": 593},
    {"date": "2026-02-15", "value": 666},
    {"date": "2026-02-16", "value": 1094},
    {"date": "2026-02-17", "value": 1184},
    {"date": "2026-02-18", "value": 1069},
    {"date": "2026-02-19", "value": 1096},
    {"date": "2026-02-20", "value": 997},
    {"date": "2026-02-21", "value": 672},
    {"date": "2026-02-22", "value": 697},
    {"date": "2026-02-23", "value": 1000},
    {"date": "2026-02-24", "value": 1269},
    {"date": "2026-02-25", "value": 1102},
    {"date": "2026-02-26", "value": 1004},
    {"date": "2026-02-27", "value": 1082},
    {"date": "2026-02-28", "value": 700},
    {"date": "2026-03-01", "value": 602},
    {"date": "2026-03-02", "value": 1086},
    {"date": "2026-03-03", "value": 1299},
    {"date": "2026-03-04", "value": 1010},
    {"date": "2026-03-05", "value": 1091},
    {"date": "2026-03-06", "value": 1109},
    {"date": "2026-03-07", "value": 606},
    {"date": "2026-03-08", "value": 687},
    {"date": "2026-03-09", "value": 1112},
    {"date": "2026-03-10", "value": 1210},
    {"date": "2026-03-11", "value": 1099},
    {"date": "2026-03-12", "value": 1114},
    {"date": "2026-03-13", "value": 1019},
    {"date": "2026-03-14", "value": 693},
    {"date": "2026-03-15", "value": 706},
    {"date": "2026-03-16", "value": 1023},
    {"date": "2026-03-17", "value": 1303},
    {"date": "2026-03-18", "value": 1119},
    {"date": "2026-03-19", "value": 1026},
    {"date": "2026-03-20", "value": 1112},
    {"date": "2026-03-21", "value": 709},
    {"date": "2026-03-22", "value": 615},
    {"date": "2026-03-23", "value": 1116},
    {"date": "2026-03-24", "value": 1321},
    {"date": "2026-03-25", "value": 1032},
    {"date": "2026-03-26", "value": 1121},
    {"date": "2026-03-27", "value": 1127},
    {"date": "2026-03-28", "value": 619},
    {"date": "2026-03-29", "value": 708},
    {"date": "2026-03-30", "value": 1129},
    {"date": "2026-03-31", "value": 1237},
    {"date": "2026-04-01", "value": 1129},
    {"date": "2026-04-02", "value": 1132},
    {"date": "2026-04-03", "value": 1042},
    {"date": "2026-04-04", "value": 714},
    {"date": "2026-04-05", "value": 715},
    {"date": "2026-04-06", "value": 1046},
    {"date": "2026-04-07", "value": 1337},
    {"date": "2026-04-08", "value": 1137},
    {"date": "2026-04-09", "value": 1049},
    {"date": "2026-04-10", "value": 1142},
    {"date": "2026-04-11", "value": 717},
    {"date": "2026-04-12", "value": 630},
    {"date": "2026-04-13", "value": 1146},
    {"date": "2026-04-14", "value": 1342},
    {"date": "2026-04-15", "value": 1056},
    {"date": "2026-04-16", "value": 1150},
    {"date": "2026-04-17", "value": 1144},
    {"date": "2026-04-18", "value": 634},
    {"date": "2026-04-19", "value": 729},
    {"date": "2026-04-20", "value": 1146},
    {"date": "2026-04-21", "value": 1264},
    {"date": "2026-04-22", "value": 1158},
    {"date": "2026-04-23", "value": 1149},
    {"date": "2026-04-24", "value": 1066},
    {"date": "2026-04-25", "value": 734},
    {"date": "2026-04-26", "value": 723},
    {"date": "2026-04-27", "value": 1069},
    {"date": "2026-04-28", "value": 1370},
    {"date": "2026-04-29", "value": 1154},
    {"date": "2026-04-30", "value": 1073},
    {"date": "2026-05-01", "value": 1171},
    {"date": "2026-05-02", "value": 725},
    {"date": "2026-05-03", "value": 645},
    {"date": "2026-05-04", "value": 1175},
    {"date": "2026-05-05", "value": 1363},
    {"date": "2026-05-06", "value": 1080},
    {"date": "2026-05-07", "value": 1179},
    {"date": "2026-05-08", "value": 1161},
    {"date": "2026-05-09", "value": 649},
    {"date": "2026-05-10", "value": 749},
    {"date": "2026-05-11", "value": 1163},
    {"date": "2026-05-12", "value": 1293},
    {"date": "2026-05-13", "value": 1187},
    {"date": "2026-05-14", "value": 1166},
    {"date": "2026-05-15", "value": 1090},
    {"date": "2026-05-16", "value": 754},
    {"date": "2026-05-17", "value": 731},
    {"date": "2026-05-18", "value": 1094},
    {"date": "2026-05-19", "value": 1403},
    {"date": "2026-05-20", "value": 1170},
    {"date": "2026-05-21", "value": 1098},
    {"date": "2026-05-22", "value": 1199},
    {"date": "2026-05-23", "value": 733},
    {"date": "2026-05-24", "value": 661},
    {"date": "2026-05-25", "value": 1203},
    {"date": "2026-05-26", "value": 1384},
    {"date": "2026-05-27", "value": 1105},
    {"date": "2026-05-28", "value": 1207},
    {"date": "2026-05-29", "value": 1177},
    {"date": "2026-05-30", "value": 666},
    {"date": "2026-05-31", "value": 768},
    {"date": "2026-06-01", "value": 1180},
    {"date": "2026-06-02", "value": 1322},
    {"date": "2026-06-03", "value": 1215},
    {"date": "2026-06-04", "value": 1182},
    {"date": "2026-06-05", "value": 1116},
    {"date": "2026-06-06", "value": 773},
    {"date": "2026-06-07", "value": 738},
    {"date": "2026-06-08", "value": 1119},
    {"date": "2026-06-09", "value": 1435},
    {"date": "2026-06-10", "value": 1187},
    {"date": "2026-06-11", "value": 1123},
    {"date": "2026-06-12", "value": 1227},
    {"date": "2026-06-13", "value": 740},
    {"date": "2026-06-14", "value": 678},
    {"date": "2026-06-15", "value": 1231},
    {"date": "2026-06-16", "value": 1405},
    {"date": "2026-06-17", "value": 1131},
    {"date": "2026-06-18", "value": 1235},
    {"date": "2026-06-19", "value": 1194},
    {"date": "2026-06-20", "value": 683},
    {"date": "2026-06-21", "value": 787},
    {"date": "2026-06-22", "value": 1196},
    {"date": "2026-06-23", "value": 1353},
    {"date": "2026-06-24", "value": 1243},
    {"date": "2026-06-25", "value": 1198},
    {"date": "2026-06-26", "value": 1142},
    {"date": "2026-06-27", "value": 792},
    {"date": "2026-06-28", "value": 746},
    {"date": "2026-06-29", "value": 1146},
    {"date": "2026-06-30", "value": 1467},
    {"date": "2026-07-01", "value": 1203},
    {"date": "2026-07-02", "value": 1149},
    {"date": "2026-07-03", "value": 1255},
    {"date": "2026-07-04", "value": 748},
    {"date": "2026-07-05", "value": 695},
    {"date": "2026-07-06", "value": 1258},
    {"date": "2026-07-07", "value": 1425},
    {"date": "2026-07-08", "value": 1157},
    {"date": "2026-07-09", "value": 1262},
    {"date": "2026-07-10", "value": 1210},
    {"date": "2026-07-11", "value": 700},
    {"date": "2026-07-12", "value": 805},
    {"date": "2026-07-13", "value": 1212},
    {"date": "2026-07-14", "value": 1384},
    {"date": "2026-07-15", "value": 1270},
    {"date": "2026-07-16", "value": 1215},
    {"date": "2026-07-17", "value": 1169},
    {"date": "2026-07-18", "value": 810},
    {"date": "2026-07-19", "value": 753},
    {"date": "2026-07-20", "value": 1173},
    {"date": "2026-07-21", "value": 1498},
    {"date": "2026-07-22", "value": 1219},
    {"date": "2026-07-23", "value": 1177},
    {"date": "2026-07-24", "value": 1281},
    {"date": "2026-07-25", "value": 755},
    {"date": "2026-07-26", "value": 713},
    {"date": "2026-07-27", "value": 1285},
    {"date": "2026-07-28", "value": 1446},
    {"date": "2026-07-29", "value": 1184},
    {"date": "2026-07-30", "value": 1289},
    {"date": "2026-07-31", "value": 1226},
    {"date": "2026-08-01", "value": 719},
    {"date": "2026-08-02", "value": 823},
    {"date": "2026-08-03", "value": 1229},
    {"date": "2026-08-04", "value": 1415},
    {"date": "2026-08-05", "value": 1296},
    {"date": "2026-08-06", "value": 1231},
    {"date": "2026-08-07", "value": 1196},
    {"date": "2026-08-08", "value": 827},
    {"date": "2026-08-09", "value": 760},
    {"date": "2026-08-10", "value": 1200},
    {"date": "2026-08-11", "value": 1528},
    {"date": "2026-08-12", "value": 0},
    {"date": "2026-08-13", "value": 0},
    {"date": "2026-08-14", "value": 1307},
    {"date": "2026-08-15", "value": 763},
    {"date": "2026-08-16", "value": 732},
    {"date": "2026-08-17", "value": 1311},
    {"date": "2026-08-18", "value": 1466},
    {"date": "2026-08-19", "value": 1212},
    {"date": "2026-08-20", "value": 1314},
    {"date": "2026-08-21", "value": 1243},
    {"date": "2026-08-22", "value": 738},
    {"date": "2026-08-23", "value": 839},
    {"date": "2026-08-24", "value": 1245},
    {"date": "2026-08-25", "value": 1448},
    {"date": "2026-08-26", "value": 1322},
    {"date": "2026-08-27", "value": 1247},
    {"date": "2026-08-28", "value": 1224},
    {"date": "2026-08-29", "value": 844},
    {"date": "2026-08-30", "value": 768},
    {"date": "2026-08-31", "value": 1229},
    {"date": "2026-09-01", "value": 1557},
    {"date": "2026-09-02", "value": 1252},
    {"date": "2026-09-03", "value": 1233},
    {"date": "2026-09-04", "value": 1332},
    {"date": "2026-09-05", "value": 770},
    {"date": "2026-09-06", "value": 752},
    {"date": "2026-09-07", "value": 1336},
    {"date": "2026-09-08", "value": 1487},
    {"date": "2026-09-09", "value": 1241},
    {"date": "2026-09-10", "value": 1339},
    {"date": "2026-09-11", "value": 1259},
    {"date": "2026-09-12", "value": 758},
    {"date": "2026-09-13", "value": 855},
    {"date": "2026-09-14", "value": 1262},
    {"date": "2026-09-15", "value": 1480},
    {"date": "2026-09-16", "value": 1346},
    {"date": "2026-09-17", "value": 1264},
    {"date": "2026-09-18", "value": 1253},
    {"date": "2026-09-19", "value": 859},
    {"date": "2026-09-20", "value": 776},
    {"date": "2026-09-21", "value": 1257},
    {"date": "2026-09-22", "value": 1586},
    {"date": "2026-09-23", "value": 1269},
    {"date": "2026-09-24", "value": 1262},
    {"date": "2026-09-25", "value": 1357},
    {"date": "2026-09-26", "value": 778},
    {"date": "2026-09-27", "value": 772},
    {"date": "2026-09-28", "value": 1360},
    {"date": "2026-09-29", "value": 1508},
    {"date": "2026-09-30", "value": 1270},
    {"date": "2026-10-01", "value": 1363},
    {"date": "2026-10-02", "value": 1276},
    {"date": "2026-10-03", "value": 778},
    {"date": "2026-10-04", "value": 870},
    {"date": "2026-10-05", "value": 1279},
    {"date": "2026-10-06", "value": 1514},
    {"date": "2026-10-07", "value": 1370},
    {"date": "2026-10-08", "value": 1281},
    {"date": "2026-10-09", "value": 1282},
    {"date": "2026-10-10", "value": 874},
    {"date": "2026-10-11", "value": 784},
    {"date": "2026-10-12", "value": 1287},
    {"date": "2026-10-13", "value": 1614},
    {"date": "2026-10-14", "value": 1286},
    {"date": "2026-10-15", "value": 1291},
    {"date": "2026-10-16", "value": 1380},
    {"date": "2026-10-17", "value": 787},
    {"date": "2026-10-18", "value": 793},
    {"date": "2026-10-19", "value": 1383},
    {"date": "2026-10-20", "value": 1529},
    {"date": "2026-10-21", "value": 1299},
    {"date": "2026-10-22", "value": 1386},
    {"date": "2026-10-23", "value": 1294},
    {"date": "2026-10-24", "value": 799},
    {"date": "2026-10-25", "value": 884},
    {"date": "2026-10-26", "value": 1296},
    {"date": "2026-10-27", "value": 1548},
    {"date": "2026-10-28", "value": 1393},
    {"date": "2026-10-29", "value": 1299}
  ]
}
CohortChart

Retention by sign-up cohort, with the size-weighted average underneath.

Cohorts since May keep more customers: month-3 retention is up from 61% to 70%
Share of customers still paying, by month of sign-up
M1M2M3M4M5M6M7M8SizeJan 202641086%79%71%64%56%49%41%34%Feb 202638086%79%71%64%56%49%41%Mar 202645286%79%71%64%56%49%Apr 202643186%79%71%64%56%May 202649889%82%75%68%Jun 202652089%82%75%Jul 202654789%82%Aug 202656689%Sep 2026602Weighted average88%80%73%65%56%49%41%33%
Source: illustrative data

Avoid when: Fewer than about four cohorts.

Spec type: "cohort"
{
  "type": "cohort",
  "title": "Cohorts since May keep more customers: month-3 retention is up from 61% to 70%",
  "subtitle": "Share of customers still paying, by month of sign-up",
  "source": "Source: illustrative data",
  "format": "percent",
  "cohorts": [
    "Jan 2026", "Feb 2026", "Mar 2026", "Apr 2026", "May 2026", "Jun 2026", "Jul 2026",
    "Aug 2026", "Sep 2026"
  ],
  "periods": ["M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8"],
  "sizes": [410, 380, 452, 431, 498, 520, 547, 566, 602],
  "values": [
    [0.86, 0.785, 0.71, 0.635, 0.56, 0.485, 0.41, 0.335],
    [0.86, 0.785, 0.71, 0.635, 0.56, 0.485, 0.41, null],
    [0.86, 0.785, 0.71, 0.635, 0.56, 0.485, null, null],
    [0.86, 0.785, 0.71, 0.635, 0.56, null, null, null],
    [0.89, 0.821, 0.752, 0.683, null, null, null, null],
    [0.89, 0.821, 0.752, null, null, null, null, null],
    [0.89, 0.821, null, null, null, null, null, null],
    [0.89, null, null, null, null, null, null, null],
    [null, null, null, null, null, null, null, null]
  ]
}
DivergingBar

Survey or sentiment answers on an ordered scale, negatives left of the centre line.

Teams back next year's plan, except Hardware and Field sales
Budget owners asked: is next year's plan achievable?
Strongly disagreeDisagreeNeutralAgreeStrongly agree
Engineering14%48%27%11%75%Customer success10%16%45%25%14%70%Marketing12%20%43%20%17%63%Finance9%18%50%21%11%71%Hardware14%31%22%25%45%33%Field sales11%28%24%28%9%39%37%
Source: illustrative data

Avoid when: Scales without a natural middle.

Spec type: "divergingBar"
{
  "type": "divergingBar",
  "title": "Teams back next year's plan, except Hardware and Field sales",
  "subtitle": "Budget owners asked: is next year's plan achievable?",
  "source": "Source: illustrative data",
  "scale": ["Strongly disagree", "Disagree", "Neutral", "Agree", "Strongly agree"],
  "categories": ["Engineering", "Customer success", "Marketing", "Finance", "Hardware", "Field sales"],
  "values": [
    [0.03, 0.08, 0.14, 0.48, 0.27],
    [0.04, 0.1, 0.16, 0.45, 0.25],
    [0.05, 0.12, 0.2, 0.43, 0.2],
    [0.02, 0.09, 0.18, 0.5, 0.21],
    [0.14, 0.31, 0.22, 0.25, 0.08],
    [0.11, 0.28, 0.24, 0.28, 0.09]
  ]
}