Notes and actions

Notes and metadata

Add footnotes and a source note when a table's numbers need a caveat, a restatement, or an attribution that shouldn't crowd the column headers themselves.

What you can do

  • footnotes is an array of up to 50 entries, each requiring text; mark sets the marker manually, and an omitted mark auto-numbers footnotes ¹, ², ³ in the order they appear.
  • where.column attaches a footnote’s mark to a column’s header by field name; where.header attaches it by the header’s literal label text instead.
  • footnotes[].text and sourceNote are sanitized markdown, so they can carry basic emphasis and links but not raw HTML.
  • sourceNote is one string rendered below the table, typically attribution or a caveat about the data.
  • metadataSource names the fully-qualified table or view a warehouse_comment header source pulls its COMMENT text from.
  • A TableColumn.headerSource of warehouse_comment fetches that column’s header from the warehouse COMMENT at view time and never persists it into the spec; description instead sets a fixed tooltip text on the column.

Set on TableSpec (footnotes, sourceNote, metadataSource) and per TableColumn (headerSource, description) on a table panel; no chart:* panel has footnotes or a metadata source.

Spec

View spec
{
  "id": "rep-performance-table",
  "type": "table",
  "title": "Rep performance",
  "data": {
    "rows": [
      {
        "rep": "A. Chen",
        "quota": 500000,
        "attainment": 92,
        "region": "West"
      },
      {
        "rep": "B. Ortiz",
        "quota": 450000,
        "attainment": 88,
        "region": "East"
      }
    ]
  },
  "spec": {
    "columns": [
      {
        "field": "rep",
        "label": "Rep",
        "description": "Sales rep of record for the account."
      },
      {
        "field": "quota",
        "label": "Quota",
        "headerSource": "warehouse_comment",
        "format": {
          "type": "currency",
          "currency": "USD",
          "compact": true
        },
        "align": "right"
      },
      {
        "field": "attainment",
        "label": "Attainment",
        "format": {
          "type": "percentage"
        },
        "align": "right"
      },
      {
        "field": "region",
        "label": "Region"
      }
    ],
    "footnotes": [
      {
        "text": "Restated after the Q3 close.",
        "mark": "*",
        "where": {
          "column": "attainment"
        }
      },
      {
        "text": "West includes the newly merged Southwest territory.",
        "where": {
          "header": "Region"
        }
      }
    ],
    "sourceNote": "Source: sales.rep_performance, refreshed nightly at 02:00 UTC.",
    "metadataSource": "analytics.sales.rep_performance"
  }
}

The first footnote sets an explicit mark and targets attainment by where.column; the second omits mark (so it auto-numbers) and targets the "Region" header by where.header. quota’s headerSource pulls its label from the warehouse COMMENT on metadataSource at view time; rep’s description is a fixed tooltip instead.

Try it live

Open the rich-tables template in the Builder

Open the rich-tables template, page p3-structure, panel p3-grouped for three footnotes and a sourceNote alongside grouping and subtotals.

Build it in dvt

Every table capability on this site is a few lines of the same declarative JSON spec. Read the full spec format, or connect an AI agent to your warehouse and build one live in the quickstart.

Follow the build

dvt is in founding research. Leave your email and we'll reach out when there's something to see — no newsletters, no noise.

No spam. We use this to reach out directly, nothing else.