---
title: "Projects"
description: "Plan and run client projects with phases, tasks, milestones the client signs for, budgets, change orders, templates, and a private status page for the client."
url: "https://support.outpostplatform.com/msp/projects/"
product: "depot"
type: "how-to"
status: "draft"
ai_summary: "MSP plan. A project belongs to one client and comes from a template, an accepted quote, or a recurring schedule. Project tabs, tasks, billing modes (Time and materials, Fixed price, Prepaid, Internal), milestones the client accepts, change orders, budgets, health, templates, project settings, and the client status page. Permissions project:read to project:manage."
availability:
  plans: ["msp"]
  permission: "project:write"
  preview: false
source: "https://gitlab.com/outpostplatform/docs/-/edit/main/src/content/docs/msp/projects.md"
license: "CC BY 4.0"
---

# Projects

A project is delivery work for one client that is too big for a ticket, such
as a migration, a new office, or an onboarding. It has phases, tasks, and
milestones, a budget, and a billing mode that decides how the work is paid
for. The client can follow it on a private status page and sign for
milestones when they are finished. This page shows how to create a project,
run it, bill it, and keep the client informed.

## Before you begin

- You are on the MSP plan.
- Project permissions:

  | Permission | Allows |
  | --- | --- |
  | `project:read` | Reading projects, tasks, milestones, documents, templates, and schedules |
  | `project:write` | Creating and editing projects (including their billing and budget), phases, tasks, milestones, notes, documents, and ticket links, completing a milestone, and sending a status email |
  | `project:time` | Logging, editing, and deleting time on project tasks |
  | `project:calendar` | Viewing the dispatch calendar and managing appointments and time off on it |
  | `project:manage` | Templates, recurring schedules, project settings, change orders, cost rates, the status link and acceptance links, and completing, canceling, or deleting a project |

  The **Project manager** role holds all five, plus ticket access and
  `psa:read`. Invoicing stays behind `psa:invoice`. See
  [Roles and permissions](/depot/roles-and-permissions/).

## Where projects are

- At the practice level, **Projects** lists every client's projects. Its pages
  are **My work**, **Dispatch**, **Templates**, and **Settings**. The **Projects**
  entry carries the number of decisions waiting: change orders not yet
  approved and milestones a client declined.
- In a client's workspace, **Projects** lists that client's projects.

The lists open on the **Active** view. At the practice level, **At risk**,
**Mine**, **On hold**, **Closed**, and **Everything** are the other built-in
views. In a client's workspace, they are **At risk**, **Closed**, and
**Everything**.

## Create a project

1. Select **Projects**, then **New project**.
2. In **Client**, choose the company the work is for. A project lives in that
   client's records and cannot be moved later. Inside a client's workspace the
   client is already chosen.
3. Enter a **Name**. It appears on the client's status page and on invoice
   lines.
4. In **Template**, choose a template to stamp out the phases, tasks, and
   milestones, or **Start empty**.
5. In **Billing**, choose how the work is paid for. See
   [How a project bills](#how-a-project-bills).
6. In **Starts on**, choose the date the template's tasks and milestones are
   dated from. The plan computes the end date.
7. Choose the **Manager**, who gets the weekly digest and the alerts.
8. Select **Create project**.

Projects are also created when a client accepts a quote for a product that
names a project template, and by recurring schedules. See
[Sales pipeline and quotes](/msp/sales-and-quotes/) and
[Run recurring projects](#run-recurring-projects).

## Run a project

A project's page has these tabs:

| Tab | What it is for |
| --- | --- |
| **Overview** | Status, health and its reason, and progress. |
| **Tasks** | The task list, by phase. |
| **Board** | Tasks as cards by status. |
| **Gantt** | Tasks and dependencies on a timeline. |
| **Milestones** | What the client is told is finished. |
| **Budget** | Hours and money against the budget. |
| **Change orders** | Work the client asked for after the plan was agreed. |
| **Documents** | Files attached to the project. |
| **Activity** | What changed and who changed it. |
| **Settings** | Details, billing, budget, phases, the client contact, and the status page. |

A project's status is **Draft**, **Active**, **On hold**, **Completed**, or
**Canceled**. Health is checked for active and on-hold projects. Status
emails go only to active ones. Its
**Actions** menu offers **Send status email now**, **Status link**, **Put on
hold** or **Resume**, **Complete project**, and **Cancel project**. Completing
and canceling need `project:manage` and cannot be undone. A project with
logged time can never be deleted.

Health is **Green**, **Amber**, or **Red**. It is computed hourly, and the
reason is shown beside it. A project on hold reports amber.

### Tasks

A task has a status (**To do**, **In progress**, **Blocked**, **Done**, or
**Canceled**), a priority (**Normal**, **High**, **Urgent**, or
**Critical**), an assignee, dates, and an estimate. On a task you can add a checklist, make it
depend on other tasks finishing first, link tickets, add notes, and log time.
The task's **Actions** menu offers **Raise a ticket from this task**,
**Schedule an appointment**, and **Delete this task**. A task with time logged
cannot be deleted. Logging time is described in
[Time tracking and dispatch](/msp/time-and-dispatch/).

## Ask the client to accept a milestone

A milestone is a point the client is told is finished. On a fixed-price
project, a milestone with an **Amount** bills its share of the price when it
completes.

1. On **Milestones**, select **New milestone**, or **Edit** on an existing one.
2. Enter the **Name** and the **Deliverables** the client reads on the
   acceptance page and the certificate. Choose a **Phase** and a **Due** date,
   and on a fixed-price project the **Amount**.
3. Select **The client signs for this one** to ask the client to accept it.
4. Leave **Show it on the client status page** selected unless it is internal,
   and select **Save**.
5. When the work is done, select **Complete**, then **Send the request**.

The project's client contact is emailed a private link. The link is good for
one signature and expires 30 days after it is created. On that page, the client
either accepts the milestone with a typed signature, or selects **This is not
done** and says what is missing.

| Milestone status | Meaning |
| --- | --- |
| **Pending** | Not finished yet. |
| **Waiting for the client** | The acceptance request has been sent. |
| **Accepted by the client** | The client signed for it. |
| **Declined by the client** | The client said it is not done. **Ask again** sends the same link again. |
| **Completed** | Finished without a client signature. |
| **Canceled** | Dropped. Its acceptance link is revoked and nothing bills for it. |

**Acceptance** on a milestone shows who signed and when, and offers **Download
the certificate of completion**, **Copy the link**, and **Replace the link**.
Anyone who holds the link can sign, so treat it like a password. To complete a
milestone without the client's signature, select **Complete without them**.
This needs `project:manage` and is recorded in the audit log.

## Record a change order

A change order records work the client asked for after the plan was agreed.

1. On **Change orders**, select **New change order**.
2. Enter a **Title**, a **Description**, and optionally a **Phase**.
3. In **Hours** and **Amount**, enter what it adds to the budget. Negative
   values take hours or money off. On a fixed-price project, approving it also
   changes the **Fixed price** by the amount.
4. To bill it, select **Bill this when it is approved**. Approving it then
   puts a line on the project's open draft invoice. Only a change order with
   a positive amount can be billed. A negative amount bills nothing. Issue a
   credit note for it on the invoice instead.
5. Save it.
6. Select **Approve**, enter who at the client agreed to it in **Approved by**,
   and confirm.

There is no separate submit step. The name you enter is the recorded sign-off.
**Void** needs a **Reason**. On an approved change order, it takes the hours
and money back off the budget. A change order whose money is already on an
invoice cannot be voided. Issue a credit note instead. Change orders need
`project:manage`.

## How a project bills

The project's billing mode decides before the agreement's rules do. A phase
can bill differently from its project, and the phase wins.

| Billing mode | How time on it bills |
| --- | --- |
| **Time and materials** | Through the client agreement's rules, like ticket time, at the rule's rate or the agreement's default hourly rate. |
| **Fixed price** | The time is recorded but not billed. Milestones with an amount bill shares of the **Fixed price**. |
| **Prepaid** | Drawn from the project's prepaid block. Hours past it bill at the agreement's default hourly rate. |
| **Internal** | Not billed. |

Set the mode, the **Agreement**, the **Prepaid block**, and the **Fixed price**
under **Settings** > **Billing** on the project. Milestone and change-order
lines go on one draft invoice per project at a time, in **Client billing** >
**Invoices**. See [Invoice clients](/msp/client-invoicing/).

The **Budget** tab shows **Hours logged**, **Billable value**, **Invoiced**,
and **Margin**, with hours by phase. On the project's **Settings**, enter an
**Hours budget** in minutes, an **Amount budget**, and the **Warn at** and
**Critical at** percentages. On time and materials, the amount budget is
compared against the billable value. On fixed price, it is compared against
cost.

## Keep the client informed

On the project's **Settings**, under **The client**:

1. Enter the **Contact name** and **Contact email**. Status emails and
   acceptance requests go to this address. A project made from a quote takes
   the contact from the quote. Otherwise, you enter it yourself.
2. In **Status email**, choose **Weekly**, **Every two weeks**, **Monthly**, or
   **Do not send**, and choose the day it is **Sent on**.

### Share the status page

The status page is a private, read-only page the client opens without an
account. It shows the project's stages, milestones, the tasks you chose to
publish, and updates. It never shows cost, budget, hours, technician names, or
internal notes. Tasks and notes are hidden from it by default.

Under **The client status page**, select **Open the status page** to create
it, then **Copy the link** to send it. **Replace the link** stops the old
address working. **Close the page** makes the address answer as not found.
Managing the status link needs `project:manage`.

## Reuse plans with templates

Select **Projects** > **Templates** to manage the plans projects are stamped
out of. Outpost seeds a few starter templates, which you can edit like any
other. Editing a version that projects were already made from writes a new
version, so projects already made keep their own copy. **Retire** stops a
template being offered, and **Delete** removes one. Templates need
`project:manage`.

### Run recurring projects

Under **Recurring projects** on **Templates**, a schedule makes a project from
a template on a cadence, such as a quarterly review for one client. Each
schedule has a **Name**, a **Template**, a **Client**, a **Project name
pattern** such as `Quarterly review {quarter} {year}`, a **Cadence**, a **Time
zone**, a **Project manager**, and how it **Bills as**. Turn **Running** off to
pause a schedule.

## Set the project defaults

**Projects** > **Settings** holds the practice-wide project settings, and needs
`project:manage`:

| Card | Settings |
| --- | --- |
| **Budget thresholds** | **Warn at** and **Critical at**, as percentages of a budget, **Scope creep at** as a percentage of a task's estimate, and **Call a task at risk**, in days before it is due. Crossing one raises an alert in the client's workspace. |
| **What goes out** | **Send the Monday digest** to each project manager, the hour it is **Sent at**, **Status email, by default**, and **Remind a technician** a number of minutes before an appointment. |
| **Technicians** | Each technician's weekly **Capacity** and **Cost per hour**. Cost rates are visible only to people with `project:manage` or `psa:read`. |

## Verify

- The new project is listed under **Projects** with its client, and its
  **Tasks** tab shows the template's tasks.
- After **Send the request** on a milestone, it shows **Waiting for the
  client**.

## Next steps

- [Time tracking and dispatch](/msp/time-and-dispatch/)
- [Invoice clients](/msp/client-invoicing/)
- [MSP reports](/msp/msp-reports/)
