Outgoing Reports
Outgoing reports deliver aggregated data to your URL on a schedule. They use the same signed delivery infrastructure as outgoing webhooks — HMAC-SHA256 signature, Timestamp header, authentication, retries, and delivery logs.
Reports are configured in the Open API → Outgoing Reports tab. Each report has a type and a schedule.
Report types
| Type | Description |
|---|---|
todo_list_stats | Aggregated todo-list completion statistics for the past day or week, broken down by department and todo template. |
Schedules
| Schedule | Delivery |
|---|---|
daily | Every day at 06:00 Danish time (CET in winter, CEST in summer). |
weekly | Every Monday at 06:00 Danish time (CET in winter, CEST in summer). |
Both schedules send the same report, with the event name monotree.todoliststats.daily. A daily report covers the day before it is sent. A weekly report covers the seven days before it is sent, Monday to Sunday.
Payload
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"event": "monotree.todoliststats.daily",
"version": "v1",
"customer": "acme",
"timestamp": 1774414800,
"payload": {
"data": {
"total_lists": 42,
"total_tasks": 150,
"completed_tasks": 95,
"departments": [
{
"id": 1,
"name": "Kitchen",
"list_count": 5,
"total_tasks": 45,
"completed_tasks": 32,
"completion_percentage": 71.11,
"todo_list_templates": {
"data": [
{
"id": 1,
"title": "Morning Checklist",
"list_count": 2,
"task_count": 15,
"completed_count": 10,
"task_templates_count": 3,
"completion_percentage": 66.67,
"meta": { "data": { "type": "TodoListTemplate", "base_locale": "en" } },
"todo_task_templates": {
"data": [
{
"id": 101,
"title": "Check cooler temperatures",
"body": "Note the temperature of each cooler.",
"task_count": 5,
"completed_count": 3,
"completion_percentage": 60,
"meta": { "data": { "type": "TodoTaskTemplate" } },
"tasks": {
"data": [
{
"id": 1001,
"due_at": "2026-03-24",
"checked_at": "2026-03-24T07:30:00.000000Z",
"user_id": 88,
"todo_list_id": 512,
"todo_task_template_id": 101,
"comments_count": 0,
"user": {
"data": {
"id": 88,
"type": "default",
"first_name": "Jane",
"last_name": "Doe",
"full_name": "Jane Doe",
"email": "jane@example.com",
"avatar_url": "https://images.monotree.com/avatars/jane-doe.jpg",
"deleted_at": null,
"is_away": false,
"meta": { "data": { "type": "User" } }
}
}
}
]
}
}
]
}
}
]
}
}
]
}
}
}The counts cover the lists that were due in the report's period, in Danish time: yesterday for a daily report, the past seven days for a weekly one.
| Field | Description |
|---|---|
total_lists, total_tasks, completed_tasks | Totals across all departments. |
departments[] | One row per department: id, name, list_count, total_tasks, completed_tasks, completion_percentage, and its list templates under todo_list_templates.data. |
todo_list_templates.data[] | A todo list template: id, title, list_count, task_count, completed_count, task_templates_count, completion_percentage, meta (its type and base_locale), and its task templates under todo_task_templates.data. |
todo_task_templates.data[] | A task template: id, title, body, task_count, completed_count, completion_percentage, meta (only its type), and the tasks made from it under tasks.data. |
tasks.data[] | One instance of the task on a list due in the period: id, due_at, checked_at, user_id, todo_list_id, todo_task_template_id, comments_count. due_at is a date (YYYY-MM-DD). checked_at is in UTC with microseconds (2026-03-24T07:30:00.000000Z). user is the person who ticked it, in the older format where it is wrapped in { "data": ... } with a meta object, like the user in the form response alarm payload. On a task nobody ticked, checked_at and user_id are null and user is { "data": [] }. |
Authentication and signature
Reports support the same authentication options as outgoing webhooks (Bearer token, Basic Auth, API Key header, custom headers). Signature verification works identically — see the Outgoing Webhooks page.