---
title: "Client agreements"
description: "Write a client agreement that sets what the client pays every period and how the time your team logs for them is billed, including prepaid blocks."
url: "https://support.outpostplatform.com/msp/agreements/"
product: "depot"
type: "how-to"
status: "draft"
ai_summary: "MSP plan. An agreement holds a client's recurring lines (Fixed, Per device, Per user, Per seat, Prepaid block) and rules that classify logged time as Covered, Prepaid, Billable, or Excluded, first match wins. One active agreement per client. Default charge type is what the Time tab preselects, else Labor. Prepaid ledger, templates, renewal quotes. Permissions psa:read, psa:write, psa:invoice."
availability:
  plans: ["msp"]
  permission: "psa:write"
  preview: false
source: "https://gitlab.com/outpostplatform/docs/-/edit/main/src/content/docs/msp/agreements.md"
license: "CC BY 4.0"
---

# Client agreements

An agreement is the contract between your practice and one client. It says
what the client pays every billing period, and it decides how each piece of
work your team logs for that client is billed: included in the contract,
drawn from prepaid hours, billed by the hour, or written off. This page shows
how to write an agreement, activate it, and look after its prepaid hours.

## Before you begin

- You are on the MSP plan. See [Outpost for MSPs](/msp/).
- Writing, activating, and ending an agreement needs `psa:write`. Buying
  prepaid minutes needs `psa:invoice`. Reading agreements needs `psa:read`.
- Define your charge types first, because agreement rules match on them. See
  [Billing catalog](/msp/billing-catalog/).

## How an agreement works

An agreement has three parts:

| Part | What it does |
| --- | --- |
| Details | The dates, the **Billing day** the agreement bills on, the **Default hourly rate** for billable work, and the **Default charge type** for time logged on tickets. |
| **Lines** | What the agreement bills every period, before any time on top. |
| **Rules** | How each time entry logged for this client is classified. |

A client has at most one active agreement. Its status is one of:

| Status | Meaning |
| --- | --- |
| **Draft** | Being written. A draft bills nothing at all. |
| **Active** | The client's live agreement. It bills on its billing day and classifies work logged while it is active. |
| **Ended** | No longer in force. Work logged after it ends is not classified by it. |

Until a client has an active agreement, the time logged for it stays
**Unclassified** and nothing recurring is billed. Unclassified time is
classified by the agreement's rules when the next invoice is drafted.

### Lines

| Kind | Bills |
| --- | --- |
| **Fixed** | A flat amount every period. |
| **Per device** | The unit amount times the client's billable endpoints that match the line's device filter, counted when the invoice is drafted. With no filter, every live computer. |
| **Per user** | The unit amount times the client's named users, counted when the invoice is drafted. |
| **Per seat** | The unit amount per named user, with devices included per seat and an overage price for devices beyond them. |
| **Prepaid block** | Its unit amount every period, and adds its **Included minutes** to the block's balance. **Prepaid** rules draw the block down. |

Per device, per user, and per seat lines carry no quantity on the agreement.
The count is taken at invoice time and recorded on the invoice. To price
servers and workstations differently, add add-ons, or bill per seat, see
[Bill by device type and seat](/msp/device-and-seat-lines/). To bill devices
and people that come and go during the period, see
[Bill seat and device changes](/msp/usage-methods/). A line that has been saved
can be edited but not removed. Set its amount to zero to stop it billing.

An agreement that starts part way through a period bills its lines for the
days from its start date to the end of that period. The invoice line says so,
for example "prorated 8 of 31 days". An agreement that started before the
period bills the whole period.

### Rules

**Rules are tried top to bottom; the first match decides.** Each rule matches
on any combination of:

- **Charge type**, or **Any**.
- **Ticket type**, or **Any type**. Shown when the client has ticket types.
- **Out of hours**: **Any**, **Yes** for work outside business hours only, or
  **No** for work inside them only.

Each rule reaches one **Outcome**:

| Outcome | What happens to the work |
| --- | --- |
| **Covered** | Included in the recurring charge. It bills nothing extra, and it still counts in profitability reports. |
| **Prepaid** | Drawn from the rule's **Prepaid block**. Work beyond the remaining balance bills by the hour for the overflow only. |
| **Billable** | Billed on the next invoice at the rule's **Rate**, or the agreement's **Default hourly rate** when the rate is empty. |
| **Excluded** | Not billed and not counted. Use it for work you write off. |

Work that no rule matches is billed by the hour at the agreement's **Default
hourly rate**. To treat unmatched work differently, for example as covered,
put a catch-all rule with **Charge type** set to **Any** at the bottom.

Time is classified when it is logged, and classified again when its duration,
start, or charge type changes. A time entry not marked billable is never
billed, whatever the rule says.

### Default charge type

**Default charge type** is what the **Time** tab on this client's tickets
preselects in **Charge type** while the agreement is active. Choose the kind
of work most of the client's tickets are, such as **Labor** for a client billed
by the hour, so technicians change it only for the exception. Rules match on
charge type, so the default decides which rule most ticket time is classified
by.

- **Not set** means **Labor**, which is also what a client with no active
  agreement gets.
- It applies to new time only. Changing it never changes time already logged.
- It does not apply to time logged on project tasks.
- Agreement templates have the same field. An agreement written with
  **Start from a template**, or created when a client accepts a quote built
  on a template, copies it. See
  [Billing catalog](/msp/billing-catalog/#write-agreement-templates).

See [Time tracking and dispatch](/msp/time-and-dispatch/#log-time-on-a-ticket).

## Write an agreement

1. Open the client's workspace, then select **Client billing** >
   **Agreements**.
2. Select **New agreement**.
3. In **Details**, enter a **Name**.
4. To start from one of your agreement templates, choose it in **Start from a
   template**. It copies the template's lines, rules, billing day, default
   rate, and default charge type into the form, and you can change any of
   them before saving.
5. Enter **Starts on**. Leave **Ends on** empty for an open-ended agreement.
6. In **Billing day**, enter the day of the month the agreement bills on, from
   1 to 28.
7. In **Default hourly rate**, enter what billable work costs when the rule
   that matched names no rate of its own.
8. Optionally, in **Default charge type**, choose the charge type most of this
   client's ticket work is. See
   [Default charge type](#default-charge-type).
9. Under **Lines**, select **Add a line** for each recurring charge. Choose the
   **Kind**, then enter the **Description** the invoice shows and the **Unit
   amount**. For a prepaid block, also enter **Included minutes**.
10. Under **Rules**, select **Add a rule** for each way work is classified, and
    use **Up** and **Down** to order them.
11. Select **Save**.

A **Prepaid** rule has to name a block, and a block has no identity until the
agreement is saved. If you are adding a prepaid block, save once, then set the
rule's **Prepaid block** and save again.

An agreement with no lines bills nothing every period. That is right for a
time-only contract.

## Activate the agreement

1. Open the agreement.
2. Select **Activate**.
3. Confirm with **Activate**.

If the client already has an active agreement, activation is refused with
**This client already has an active agreement. End that one first.** An
agreement created from a renewal quote replaces the one it renews when you
activate it, so you do not end the old one first.

## End an agreement

Select **End agreement** and confirm with **End**. Work logged after today is
no longer classified by it.

## Look after prepaid hours

Each prepaid block on a saved agreement has a **Prepaid block** card. It shows
the minutes left, the minutes sold, and every movement of the balance, with
**When**, **What**, and **Minutes**. The balance is the sum of those rows, so it
always agrees with them.

Minutes are drawn from the block when the period's invoice is drafted. To add
minutes to the block:

1. In **Minutes to add**, enter the minutes.
2. In **Note**, describe the purchase.
3. Select **Buy minutes**.

Buying minutes adds them to the balance and raises no charge. Bill the client
for them separately, for example with an adjustment on a draft invoice.

The client's billing contact is emailed when a block falls below the warning
level in the invoicing settings. See
[Invoice clients](/msp/client-invoicing/#set-the-invoicing-defaults).

## Quote a renewal

When an agreement is coming to an end, select **Quote a renewal** on the
agreement. Outpost builds a draft quote from the agreement's monthly lines at
their current prices and opens it in the quote editor, so you can review the
prices before the client sees them. This needs `crm:write`. A client can
have one open renewal per agreement. An agreement with a per seat line cannot
be renewed this way, because a quote cannot carry per seat lines.

Outpost can also raise renewal quotes on its own a set number of days before
an agreement ends. See
[Sales pipeline and quotes](/msp/sales-and-quotes/#set-up-sales).

## See every agreement

At the practice level, **Client billing** > **Agreements** lists agreements
across your clients. **Client** chooses whose agreements you see, and the
views **Active**, **Drafts**, and **Everything** choose which. The search box
matches the agreement name only.

## Verify

- The agreement shows **Active** on the client's **Agreements** page.
- On **Client billing** > **Unbilled time**, with the **Everything** view, new
  time logged on one of the client's tickets shows **Covered**, **Prepaid**,
  **Billable**, or **Excluded** rather than **Unclassified**.

## Next steps

- [Bill by device type and seat](/msp/device-and-seat-lines/)
- [Add discounts and annual price increases](/msp/discounts-and-price-increases/)
- [Check a client's next bill](/msp/next-bill-estimate/)
- [Invoice clients](/msp/client-invoicing/)
- [Billing catalog](/msp/billing-catalog/)
- [Time tracking and dispatch](/msp/time-and-dispatch/)
