reports.today
The shop's today queues in one call: visits today, visits in the next 7 days with nobody assigned, new requests, quotes and change orders waiting on the customer, overdue and draft invoices, done jobs not invoiced, time waiting for approval and approvals waiting on the owner. Each list shows the first 25 with the full count.
When to use it
The shop's today queues in one call: visits today, visits in the next 7 days with nobody assigned, new requests, quotes and change orders waiting on the customer, overdue and draft invoices, done jobs not invoiced, time waiting for approval and approvals waiting on the owner. Each list shows the first 25 with the full count.
What to tell the owner
Tell them what you found in plain words. Don't read back raw fields.
| Field | Type | Required |
|---|
shop_id | string (uuid) | yes |
date | string | no |
Example
GET https://doingwork.work/v1/reports/today?shop_id=00000000-0000-4000-8000-000000000000
Output
| Field | Type | Always there |
|---|
date | string | yes |
time_zone | string | yes |
currency | string | yes |
visits_today | object | yes |
visits_today.count | integer | yes |
visits_today.items | array | yes |
visits_today.items[].visit_id | string (uuid) | yes |
visits_today.items[].job_id | string (uuid) | yes |
visits_today.items[].job_summary | ['string', 'null'] | yes |
visits_today.items[].customer_name | ['string', 'null'] | yes |
visits_today.items[].title | ['string', 'null'] | yes |
visits_today.items[].starts_at | string (date-time) | yes |
visits_today.items[].ends_at | string (date-time) | yes |
visits_today.items[].status | string | yes |
visits_today.items[].assignees | array | yes |
unassigned_visits | object | yes |
unassigned_visits.count | integer | yes |
unassigned_visits.items | array | yes |
unassigned_visits.items[].visit_id | string (uuid) | yes |
unassigned_visits.items[].job_id | string (uuid) | yes |
unassigned_visits.items[].job_summary | ['string', 'null'] | yes |
unassigned_visits.items[].customer_name | ['string', 'null'] | yes |
unassigned_visits.items[].title | ['string', 'null'] | yes |
unassigned_visits.items[].starts_at | string (date-time) | yes |
unassigned_visits.items[].ends_at | string (date-time) | yes |
unassigned_visits.items[].status | string | yes |
unassigned_visits.items[].assignees | array | yes |
new_requests | object | yes |
new_requests.count | integer | yes |
new_requests.items | array | yes |
new_requests.items[].request_id | string (uuid) | yes |
new_requests.items[].title | string | yes |
new_requests.items[].source | string | yes |
new_requests.items[].customer_id | ['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')'] | yes |
new_requests.items[].created_at | string (date-time) | yes |
quotes_waiting | object | yes |
quotes_waiting.count | integer | yes |
quotes_waiting.items | array | yes |
quotes_waiting.items[].quote_id | string (uuid) | yes |
quotes_waiting.items[].job_id | string (uuid) | yes |
quotes_waiting.items[].customer_name | ['string', 'null'] | yes |
quotes_waiting.items[].total_minor | integer | yes |
quotes_waiting.items[].sent_at | string (date-time) | yes |
quotes_waiting.items[].days_waiting | integer | yes |
change_orders_waiting | object | yes |
change_orders_waiting.count | integer | yes |
change_orders_waiting.items | array | yes |
change_orders_waiting.items[].change_order_id | string (uuid) | yes |
change_orders_waiting.items[].job_id | string (uuid) | yes |
change_orders_waiting.items[].number | integer | yes |
change_orders_waiting.items[].total_minor | integer | yes |
change_orders_waiting.items[].sent_at | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
invoices_overdue | object | yes |
invoices_overdue.count | integer | yes |
invoices_overdue.items | array | yes |
invoices_overdue.items[].invoice_id | string (uuid) | yes |
invoices_overdue.items[].job_id | string (uuid) | yes |
invoices_overdue.items[].customer_name | ['string', 'null'] | yes |
invoices_overdue.items[].owed_minor | integer | yes |
invoices_overdue.items[].due_on | string | yes |
invoices_overdue.items[].days_overdue | integer | yes |
draft_invoices | object | yes |
draft_invoices.count | integer | yes |
draft_invoices.items | array | yes |
draft_invoices.items[].invoice_id | string (uuid) | yes |
draft_invoices.items[].job_id | string (uuid) | yes |
draft_invoices.items[].customer_name | ['string', 'null'] | yes |
draft_invoices.items[].total_minor | integer | yes |
draft_invoices.items[].created_at | string (date-time) | yes |
jobs_to_invoice | object | yes |
jobs_to_invoice.count | integer | yes |
jobs_to_invoice.items | array | yes |
jobs_to_invoice.items[].job_id | string (uuid) | yes |
jobs_to_invoice.items[].summary | ['string', 'null'] | yes |
jobs_to_invoice.items[].customer_name | ['string', 'null'] | yes |
jobs_to_invoice.items[].occurred_at | string (date-time) | yes |
time_to_approve | object | yes |
time_to_approve.entries | integer | yes |
time_to_approve.minutes | integer | yes |
time_to_approve.people | integer | yes |
time_to_approve.oldest_started_at | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
approvals_pending | object | yes |
approvals_pending.count | integer | yes |
approvals_pending.items | array | yes |
approvals_pending.items[].approval_id | string (uuid) | yes |
approvals_pending.items[].op_id | string | yes |
approvals_pending.items[].amount_minor | ['integer', 'null'] | yes |
approvals_pending.items[].requested_by | string (uuid) | yes |
approvals_pending.items[].expires_at | string (date-time) | yes |
{
"date": "...",
"time_zone": "...",
"currency": "...",
"visits_today": {
"count": 1,
"items": [
{
"visit_id": "00000000-0000-4000-8000-000000000000",
"job_id": "00000000-0000-4000-8000-000000000000",
"job_summary": "...",
"customer_name": "...",
"title": "...",
"starts_at": "...",
"ends_at": "...",
"status": "...",
"assignees": [
"00000000-0000-4000-8000-000000000000"
]
}
]
},
"unassigned_visits": {
"count": 1,
"items": [
{
"visit_id": "00000000-0000-4000-8000-000000000000",
"job_id": "00000000-0000-4000-8000-000000000000",
"job_summary": "...",
"customer_name": "...",
"title": "...",
"starts_at": "...",
"ends_at": "...",
"status": "...",
"assignees": [
"00000000-0000-4000-8000-000000000000"
]
}
]
},
"new_requests": {
"count": 1,
"items": [
{
"request_id": "00000000-0000-4000-8000-000000000000",
"title": "...",
"source": "...",
"customer_id": "00000000-0000-4000-8000-000000000000",
"created_at": "..."
}
]
},
"quotes_waiting": {
"count": 1,
"items": [
{
"quote_id": "00000000-0000-4000-8000-000000000000",
"job_id": "00000000-0000-4000-8000-000000000000",
"customer_name": "...",
"total_minor": 50000,
"sent_at": "...",
"days_waiting": 1
}
]
},
"change_orders_waiting": {
"count": 1,
"items": [
{
"change_order_id": "00000000-0000-4000-8000-000000000000",
"job_id": "00000000-0000-4000-8000-000000000000",
"number": 1,
"total_minor": 50000,
"sent_at": "..."
}
]
},
"invoices_overdue": {
"count": 1,
"items": [
{
"invoice_id": "00000000-0000-4000-8000-000000000000",
"job_id": "00000000-0000-4000-8000-000000000000",
"customer_name": "...",
"owed_minor": 50000,
"due_on": "...",
"days_overdue": 1
}
]
},
"draft_invoices": {
"count": 1,
"items": [
{
"invoice_id": "00000000-0000-4000-8000-000000000000",
"job_id": "00000000-0000-4000-8000-000000000000",
"customer_name": "...",
"total_minor": 50000,
"created_at": "..."
}
]
},
"jobs_to_invoice": {
"count": 1,
"items": [
{
"job_id": "00000000-0000-4000-8000-000000000000",
"summary": "...",
"customer_name": "...",
"occurred_at": "..."
}
]
},
"time_to_approve": {
"entries": 1,
"minutes": 1,
"people": 1,
"oldest_started_at": "..."
},
"approvals_pending": {
"count": 1,
"items": [
{
"approval_id": "00000000-0000-4000-8000-000000000000",
"op_id": "00000000-0000-4000-8000-000000000000",
"amount_minor": "...",
"requested_by": "00000000-0000-4000-8000-000000000000",
"expires_at": "..."
}
]
}
}
Errors
| Code | Status | What to do |
|---|
invalid_input, invalid_token, rate_limited | | Can happen on any call. See errors. |