---
title: "MSP reports"
description: "The practice-level reports on the MSP plan, across clients, financial, project, and sales, plus the Storage report and Backup coverage, and what each needs."
url: "https://support.outpostplatform.com/msp/msp-reports/"
product: "depot"
type: "reference"
status: "draft"
ai_summary: "MSP plan. The built-in practice reports in menu order with their permissions: Practice executive summary, Practice summary, the across-clients reports, project profitability, status, and utilization, agreement profitability, AR aging, client health, open pipeline, pipeline funnel, and sales outcomes. Client health thresholds, the Storage report, and Backup coverage."
availability:
  plans: ["msp"]
  permission: "report:read"
  preview: false
source: "https://gitlab.com/outpostplatform/docs/-/edit/main/src/content/docs/msp/msp-reports.md"
license: "CC BY 4.0"
---

# MSP reports

This page lists the reports at your practice level on the MSP plan: the
built-in reports in the practice-level **Reports** section, the **Storage
report**, and **Backup coverage**. Each client's own reports are in that
client's workspace and are described in [Reports](/reports/).

## Scope

- Released version: Depot `0.4.1`.
- The practice-level **Reports** section has **All reports**, **Schedules**,
  and **Report builder**. Running and scheduling a report work as described in
  [Run and schedule reports](/reports/run-and-schedule/). Building one is in
  [Build a custom report](/reports/report-builder/).
- The columns of each report are listed in
  [Report datasets](/reports/datasets/#practice-datasets).

## How practice reports behave

- A practice report runs across every client, or a set you pick in
  **Clients**.
- Rows from one client start with a **Client** column. A client that could not
  be reached during the run is marked in an **Unavailable** column rather than
  left out.
- Opening **Reports** needs `report:read`. Each report also needs the
  permission of the data it reads. A report you cannot run stays on **All
  reports**, dimmed, and says which permission it **Requires**.
- Financial reports read months as UTC calendar months, so the current month
  is partial. Revenue in them is what was invoiced, not what was signed.

## Built-in practice reports

In the order **All reports** lists them.

| Report | What it answers | Permission |
| --- | --- | --- |
| **Practice executive summary** | The whole practice on one page: clients by endpoints, the machines furthest behind on patches, vulnerabilities, alerts, and tickets by severity or status, the largest Outpost Sync folders, and clients by health. Sections you cannot see are left out and named. | `report:read` |
| **Practice summary** | One row per client: endpoints, active endpoints, seen in the last 24 hours, not seen in 30 days, and the oldest check-in. | `endpoint:read` |
| **Endpoints across clients** | Every client's endpoints. | `endpoint:read` |
| **Patch compliance across clients** | Patch state per endpoint. | `patch:read` |
| **Vulnerabilities across clients** | Open vulnerabilities per endpoint. | `vuln:read` |
| **Alert history across clients** | Alerts raised. | `alert:read` |
| **Tickets and SLA across clients** | Tickets and their SLA results. | `ticket:read` |
| **Software inventory across clients** | Installed software. | `software:read` |
| **Outpost Sync usage across clients** | Outpost Sync folders and what they store. | `sync:read` |
| **Project profitability across clients** | One row per project: budget, invoiced and uninvoiced amounts, cost, and margin. Least profitable first. | `psa:read` |
| **Technician utilization across clients** | One row per technician and week: capacity, logged, billable, project, ticket, and booked hours, and utilization. | `project:manage` |
| **Project status across clients** | One row per project: status, health and why, manager, dates, progress, at-risk tasks, overdue milestones, and hours burned. Worst health first. | `project:read` |
| **Agreement profitability across clients (UTC calendar months; the current month is partial)** | One row per agreement and month: recurring revenue, prepaid blocks sold, time billed, revenue invoiced, labor cost, and margin. Least profitable first. | `psa:read` |
| **AR aging across clients** | One row per client of money owed: current, 1 to 30 days, 31 to 60 days, 61 to 90 days, over 90 days, and the total. Largest balance first. | `psa:read` |
| **Client health across the practice** | One row per client with a health grade and the reason, from endpoints, patching, alerts, tickets, satisfaction, the agreement, money owed, and projects. Worst first. | `psa:read` |
| **Open pipeline** | One row per open deal: stage, value, probability, weighted value, and expected close. | `crm:read` |
| **Pipeline funnel (stage history from 2026-09-11)** | One row per sales stage: open deals and value, time in stage, conversion, and deals won and lost in 90 days. Stage history starts on 2026-09-11, so the columns that depend on it are empty for earlier dates. | `crm:read` |
| **Sales outcomes by month** | One row per month: deals won and lost, win rate, days to close, and quotes sent and accepted. Newest month first. | `crm:read` |
| **Backup coverage across clients** | One row per endpoint: whether it is protected, by which backup sources, and its last success. | `backup:read` |

The financial, project, and sales reports read your MSP business data, so
they are empty until you use [agreements](/msp/agreements/),
[invoicing](/msp/client-invoicing/), [projects](/msp/projects/), and
[sales](/msp/sales-and-quotes/).

## Client health thresholds

The practice-level **Reports** page holds **Client health thresholds**, which
decide when a client turns amber or red on **Client health across the
practice**. The worst rule a client crosses decides its grade, and a zero
turns a rule off. Thresholds are read when the report runs. Changing them
needs `report:manage`.

| Threshold | Grade it sets |
| --- | --- |
| **Patch compliance, amber below** | Amber |
| **Patch compliance, red below** | Red |
| **Endpoints not seen, amber above** | Amber |
| **Endpoints not seen, red above** | Red |
| **Open critical alerts, red at** | Red |
| **Tickets past SLA, amber at** | Amber |
| **Tickets past SLA, red at** | Red |
| **Prepaid hours left, amber below** | Amber |
| **Included hours used, amber above** | Amber |
| **A red project makes the client red** | Red, when on |

## Storage report

**Storage report** shows what each client stores, and how much of it Outpost
bills your practice for. It needs `billing:read`.

| Column | What it shows |
| --- | --- |
| **Client** | The client, or your practice itself. |
| **Metered (Outpost Cloud)** | Storage Outpost operates. This is what appears on your Outpost invoice, pooled across clients. |
| **Customer storage** | Storage in a bucket the client owns. Outpost tracks it and does not bill it. |
| **Total** | Both together. |
| **Files** | The number of files. |
| **Counted** | When the client's storage was last counted. |

Storage is recounted every few hours. The report has no CSV form. See [Storage destinations](/depot/storage/) and
[Plans and limits](/account/plans-and-limits/#storage).

## Backup coverage

**Backup coverage** shows whether each client's endpoints are protected, by
Outpost Backup and by any other backup product that reports on them. It needs
`backup:read`. **Client** chooses whose endpoints it counts.

| Column | What it shows |
| --- | --- |
| **Client** | The client the endpoint belongs to. |
| **Endpoint** | The endpoint's hostname. |
| **Status** | Whether it is protected. |
| **Sources** | Which backup products report on it. |
| **Last success** | The last successful backup. |
| **Last attempt** | The last backup attempt. |

See [Backup](/backup/).

## Related

- [Reports](/reports/)
- [Report datasets](/reports/datasets/)
- [Invoice clients](/msp/client-invoicing/)
- [Outpost for MSPs](/msp/)
