Private preview of the new site. Not live.

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.

WhoAgents can call this
RESTGET /v1/reports/today
MCP toolreports_today
Writesno
AreaCosts, expenses and reports

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.

Input

FieldTypeRequired
shop_idstring (uuid)yes
datestringno

Example

GET https://doingwork.work/v1/reports/today?shop_id=00000000-0000-4000-8000-000000000000

Output

FieldTypeAlways there
datestringyes
time_zonestringyes
currencystringyes
visits_todayobjectyes
visits_today.countintegeryes
visits_today.itemsarrayyes
visits_today.items[].visit_idstring (uuid)yes
visits_today.items[].job_idstring (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_atstring (date-time)yes
visits_today.items[].ends_atstring (date-time)yes
visits_today.items[].statusstringyes
visits_today.items[].assigneesarrayyes
unassigned_visitsobjectyes
unassigned_visits.countintegeryes
unassigned_visits.itemsarrayyes
unassigned_visits.items[].visit_idstring (uuid)yes
unassigned_visits.items[].job_idstring (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_atstring (date-time)yes
unassigned_visits.items[].ends_atstring (date-time)yes
unassigned_visits.items[].statusstringyes
unassigned_visits.items[].assigneesarrayyes
new_requestsobjectyes
new_requests.countintegeryes
new_requests.itemsarrayyes
new_requests.items[].request_idstring (uuid)yes
new_requests.items[].titlestringyes
new_requests.items[].sourcestringyes
new_requests.items[].customer_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
new_requests.items[].created_atstring (date-time)yes
quotes_waitingobjectyes
quotes_waiting.countintegeryes
quotes_waiting.itemsarrayyes
quotes_waiting.items[].quote_idstring (uuid)yes
quotes_waiting.items[].job_idstring (uuid)yes
quotes_waiting.items[].customer_name['string', 'null']yes
quotes_waiting.items[].total_minorintegeryes
quotes_waiting.items[].sent_atstring (date-time)yes
quotes_waiting.items[].days_waitingintegeryes
change_orders_waitingobjectyes
change_orders_waiting.countintegeryes
change_orders_waiting.itemsarrayyes
change_orders_waiting.items[].change_order_idstring (uuid)yes
change_orders_waiting.items[].job_idstring (uuid)yes
change_orders_waiting.items[].numberintegeryes
change_orders_waiting.items[].total_minorintegeryes
change_orders_waiting.items[].sent_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
invoices_overdueobjectyes
invoices_overdue.countintegeryes
invoices_overdue.itemsarrayyes
invoices_overdue.items[].invoice_idstring (uuid)yes
invoices_overdue.items[].job_idstring (uuid)yes
invoices_overdue.items[].customer_name['string', 'null']yes
invoices_overdue.items[].owed_minorintegeryes
invoices_overdue.items[].due_onstringyes
invoices_overdue.items[].days_overdueintegeryes
draft_invoicesobjectyes
draft_invoices.countintegeryes
draft_invoices.itemsarrayyes
draft_invoices.items[].invoice_idstring (uuid)yes
draft_invoices.items[].job_idstring (uuid)yes
draft_invoices.items[].customer_name['string', 'null']yes
draft_invoices.items[].total_minorintegeryes
draft_invoices.items[].created_atstring (date-time)yes
jobs_to_invoiceobjectyes
jobs_to_invoice.countintegeryes
jobs_to_invoice.itemsarrayyes
jobs_to_invoice.items[].job_idstring (uuid)yes
jobs_to_invoice.items[].summary['string', 'null']yes
jobs_to_invoice.items[].customer_name['string', 'null']yes
jobs_to_invoice.items[].occurred_atstring (date-time)yes
time_to_approveobjectyes
time_to_approve.entriesintegeryes
time_to_approve.minutesintegeryes
time_to_approve.peopleintegeryes
time_to_approve.oldest_started_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
approvals_pendingobjectyes
approvals_pending.countintegeryes
approvals_pending.itemsarrayyes
approvals_pending.items[].approval_idstring (uuid)yes
approvals_pending.items[].op_idstringyes
approvals_pending.items[].amount_minor['integer', 'null']yes
approvals_pending.items[].requested_bystring (uuid)yes
approvals_pending.items[].expires_atstring (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

CodeStatusWhat to do
invalid_input, invalid_token, rate_limitedCan happen on any call. See errors.