Tech.euDisplay.dev raises €470K to power document collaboration for AI agentsDisplay.dev raises €470KRead coverage

Template

KPI report template

A KPI one-pager in self-contained HTML – four numbers, target vs actual, a status pill, and one line of why each moved. Publish it to a URL in one click, no account.

  • free – no account
  • a URL in seconds
  • yours if you claim it

Publishing this from your own stack? See display.dev for data dashboards.

Already chatting with an agent?
Or publish it as-is

What it looks like published

View live on display.dev →

Source – kpi-report.html
Open raw file
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>KPI one-pager – June 2026</title>
<style>
  :root {
    color-scheme: light dark;
    --bg: oklch(0.99 0.004 85);
    --card: oklch(1 0 0);
    --fg: oklch(0.16 0.006 85);
    --muted: oklch(0.5 0.008 85);
    --line: oklch(0.92 0.006 85);
    --accent: oklch(0.48 0.18 145);
    --warn: oklch(0.68 0.16 50);
  }
  @media (prefers-color-scheme: dark) {
    :root {
      --bg: oklch(0.15 0.005 85);
      --card: oklch(0.19 0.006 85);
      --fg: oklch(0.97 0.004 85);
      --muted: oklch(0.65 0.008 85);
      --line: oklch(0.3 0.006 85);
      --accent: oklch(0.68 0.18 145);
      --warn: oklch(0.75 0.15 50);
    }
  }
  * { box-sizing: border-box; }
  body {
    margin: 0; background: var(--bg); color: var(--fg);
    font-family: ui-sans-serif, system-ui, sans-serif;
    line-height: 1.5; padding: clamp(1.5rem, 4vw, 3rem);
  }
  .wrap { max-width: 840px; margin: 0 auto; }
  h1 { font-size: clamp(1.5rem, 3vw, 2rem); font-weight: 700; letter-spacing: -0.02em; margin: 0; }
  .meta { color: var(--muted); font-size: 0.9375rem; margin: 0.25rem 0 1.5rem; }
  .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0.75rem; }
  .kpi {
    background: var(--card); border: 1px solid var(--line);
    border-radius: 10px; padding: 1.125rem 1.25rem;
  }
  .kpi .label { font-size: 0.75rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; }
  .kpi .value { font-size: 1.875rem; font-weight: 700; letter-spacing: -0.02em; margin: 0.25rem 0 0.125rem; }
  .kpi .target { font-size: 0.8125rem; color: var(--muted); }
  .kpi .status { display: inline-block; font-size: 0.6875rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; margin-top: 0.5rem; padding: 0.125rem 0.5rem; border-radius: 999px; border: 1px solid var(--line); }
  .kpi .status.on { color: var(--accent); border-color: var(--accent); }
  .kpi .status.watch { color: var(--warn); border-color: var(--warn); }
  .kpi p { margin: 0.625rem 0 0; font-size: 0.875rem; color: var(--muted); line-height: 1.55; }
  .kpi p strong { color: var(--fg); font-weight: 600; }
  footer { color: var(--muted); font-size: 0.8125rem; margin-top: 1.5rem; }
</style>
</head>
<body>
<div class="wrap">
  <h1>KPI one-pager – June 2026</h1>
  <p class="meta">Monthly business review · four numbers, one line of context each · owner: Sara L.</p>

  <div class="grid">
    <div class="kpi">
      <div class="label">Monthly recurring revenue</div>
      <div class="value">€418k</div>
      <div class="target">Target €425k · +6.1% MoM</div>
      <span class="status on">On track</span>
      <p><strong>Why it moved:</strong> 14 upgrades from the June pricing
      change; churn flat. Gap to target closes if July upgrades hold rate.</p>
    </div>
    <div class="kpi">
      <div class="label">Net revenue retention</div>
      <div class="value">104%</div>
      <div class="target">Target 108% · −1 pt MoM</div>
      <span class="status watch">Watch</span>
      <p><strong>Why it moved:</strong> two mid-market downgrades at seat
      review. Churn interviews point at the seat-count step – fix scoped
      for v2.14.</p>
    </div>
    <div class="kpi">
      <div class="label">Weekly active teams</div>
      <div class="value">1,932</div>
      <div class="target">Target 1,900 · +9% MoM</div>
      <span class="status on">On track</span>
      <p><strong>Why it moved:</strong> onboarding rework lifted week-one
      activation from 34% to 41%; the cohort is carrying WAT with it.</p>
    </div>
    <div class="kpi">
      <div class="label">Gross margin</div>
      <div class="value">81%</div>
      <div class="target">Target 80% · flat MoM</div>
      <span class="status on">On track</span>
      <p><strong>Why it moved:</strong> stable. Compute renegotiation lands
      in August; expect +1–2 pts from September.</p>
    </div>
  </div>

  <footer>Definitions in the metrics handbook · numbers are sample data, replace with your own.</footer>
</div>
</body>
</html>

What this template is for

The monthly review page that answers the follow-up question before it's asked. Each of the four cards pairs the number with its target, an on-track or watch status, and one sentence on why it moved – the sentence that separates a report from a screenshot of a chart.

Four numbers is a constraint, not a limitation: if everything is a KPI, nothing is.

How teams use it

  • A monthly business review, assembled by an agent. The numbers come from the warehouse; the why-lines come from the month's actual events – the agent drafts both, the owner edits the narrative.
  • Gated to the org. Revenue and retention belong behind your company's Google or Microsoft sign-in. Publish once; the same URL serves every month's current version, with history intact.
  • A board-update building block. Four cards with honest statuses travel well into a board deck – or just send the link.

Publish your first artifact in 15 seconds.

Free tier. No credit card. One-time password auth on free, Google + Microsoft SSO on Pro (€49/month flat).