통계 목록 위젯
카드 하나에 최대 6개의 레이블과 값 행을 담습니다. MRR, 구독자, 체험처럼 차트로는 덜 전달되는 간결한 대시보드에 가장 적합합니다.
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.
이 섹션은 App Store 심사를 기다리고 있는 앱 업데이트의 기능을 설명합니다. 업데이트가 출시되면 여기에서 자동으로 잠금 해제됩니다.
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.