Stat list-widget
Tot zes label-waarderijen op één kaart. Ideaal voor compacte dashboards — MRR, abonnees, proefperiodes — waar een grafiek minder zegt.
The stat_list template renders up to six label : value rows. Every value
is a string you format yourself, which makes it the escape hatch from the numeric templates: a
currency figure, a version tag, a person's name, or a mixed dashboard of all three.
Fields
| Field | Type | Notes |
|---|---|---|
template | string | Required. Must be "stat_list" |
stat_rows | object[] | Required. Between 1 and 6 rows, drawn in the order you send them |
stat_rows[].label | string | Required. Non-blank, max 32 characters. The left-hand caption |
stat_rows[].value | string | Required. Non-blank, max 32 characters. A string, not a number — rendered exactly as sent |
stat_rows[].unit | string | Rendered after the value. Max 16 characters |
label, subtitle, icon, accent_color, background_color, text_color | string | Shared content fields — see the API reference |
Example: SaaS dashboard
{
"content": {
"template": "stat_list",
"label": "April",
"icon": "chart.bar.fill",
"accent_color": "indigo",
"stat_rows": [
{ "label": "MRR", "value": "$8 333", "unit": "USD" },
{ "label": "Subs", "value": "412" },
{ "label": "Trials", "value": "37" },
{ "label": "Churn", "value": "1.2", "unit": "%" }
]
}
}Behavior
Values are strings, so formatting is yours to decide and yours to keep consistent: the currency symbol, the thousands separator, the number of decimals. Nothing is rounded or abbreviated on device, which is the whole reason to choose this template over value — but it also means a long value is a long value, and 32 characters of it will not fit on a small widget.
How many rows actually render depends on the placement. Medium and large Home Screen widgets show all six by default; the small widget shows four, and the Lock Screen rectangular shows three, packing rows two-up to reach six when every value is very short. Users can change this per widget in the PushWard app: Compact packs two columns to surface up to six rows on any size, at the cost of truncated labels on the smaller placements, and Comfortable keeps one column with larger rows and shows fewer of them. Put the row that matters most first — it is the one that survives every placement.
A merge patch replaces stat_rows rather than merging into it, so send the whole list on every update. Patching a single row is not possible; patching a shorter list deletes the rows you left out.
Dit gedeelte beschrijft een functie in een app-update die door de App Store wordt beoordeeld. Zodra de update live is, wordt het hier automatisch ontgrendeld.
Row timers
A row can carry a timer instead of a static trailing value, which turns that row into a
live readout — time until a maintenance window, time since the last successful backup — that keeps
moving between pushes.
| Field | Type | Notes |
|---|---|---|
stat_rows[].timer.date | string | Required when timer is present. RFC 3339, after 2000-01-01 and no more than 366 days ahead. A past date counts up, a future date counts down |
stat_rows[].timer.style | string | timer (the default) ticks like 01:23:45; relative renders a coarse unit like 2 min |
{
"content": {
"template": "stat_list",
"label": "Backups",
"stat_rows": [
{ "label": "Last run", "value": "12 min ago", "timer": { "date": "2027-05-10T08:00:00Z", "style": "relative" } },
{ "label": "Repos", "value": "14" },
{ "label": "Failed", "value": "0" }
]
}
}value stays required on a row that carries a timer, and it stays the static fallback: builds released before 1.6 render it and ignore the timer. Send the text the value had at push time ("12 min ago"), not a placeholder — an older phone shows exactly that string until the next update.
Build a list and switch placements on the playground to see which rows survive each size before you wire up an integration.