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.
| Region | Segment | Revenue1 | Margin %2 |
|---|---|---|---|
| EMEA | Enterprise | $1,234,500 | 24.5% |
| APAC | Mid-market | $842,300 | 18.2% |
| AMER | Enterprise | $1,560,200 | 29.1% |
| LATAM | SMB | $398,100 | 12.7% |
- Includes one-time renewal credits.
- Calculated on net revenue after discounts.
Source: finance_mart.rep_scorecard, refreshed daily
What you can do
footnotesis an array of up to 50 entries, each requiringtext;marksets the marker manually, and an omittedmarkauto-numbers footnotes ¹, ², ³ in the order they appear.where.columnattaches a footnote’s mark to a column’s header by field name;where.headerattaches it by the header’s literal label text instead.footnotes[].textandsourceNoteare sanitized markdown, so they can carry basic emphasis and links but not raw HTML.sourceNoteis one string rendered below the table, typically attribution or a caveat about the data.metadataSourcenames the fully-qualified table or view awarehouse_commentheader source pulls itsCOMMENTtext from.- A
TableColumn.headerSourceofwarehouse_commentfetches that column’s header from the warehouseCOMMENTat view time and never persists it into the spec;descriptioninstead 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.