---
title: "Contracts"
slug: workspace/contracts
url: https://projectri.com/docs/workspace/contracts
section: workspace
audience: workspace
app_route: "/[slug]/[user]/contracts"
permissions: [contract.view, client.contract, contract.burn.view]
mobile: "/contracts"
updated: 2026-09-08
source: Projectri documentation
---

# Contracts

The register of what the firm is bound to — every MSA, statement of work and order form, its lifecycle state, its value and whether it is still inside its period.

![Contracts](https://projectri.com/docs-shots/workspace-contracts.png)

## What it is

Contracts answers the question that starts the moment a signed quote comes back:
*what did we agree, and are we still inside it*. Each row is one agreement — a
master agreement, a statement of work, an order form or an amendment — with the
client, the lifecycle state, the value, the period and the number of projects
it funds. Statements of work sit indented under the master agreement they hang
from.

## How to get there

Contracts is in the main navigation and needs the `contract.view` permission.
That key is not on the member floor — an administrator grants it per role at
[Admin → Permissions](/docs/admin/permissions).

Creating and editing a contract needs `client.contract`. The **Value** column
only exists for readers with `contract.burn.view`; without it the column is
absent rather than dashed, because a column of em-dashes still leaks the shape
of the portfolio. There is no plan gate on the register itself.

## How to use it

### Read the register

1. The **State** badge is the contract's `lifecycleState` — Draft, With the
   client, Signed, Active or Closed. That is a different question from whether
   the contract row is archived, and it is the one this list answers.
2. The **Period** column prints the two dates and, underneath, where today sits
   relative to them — *Starts in the future*, *Period ended*, or *No end date*.
   Nothing sweeps a contract to Closed, so an Active contract whose end date
   passed last month still reads Active. The line under the dates is what tells
   you.
3. Filter by **kind** and by **state** with the two pickers above the table.
4. Click any row to open it.

### Create a contract

1. Press **New contract**. It creates an *Untitled statement of work* in Draft
   and takes you straight into it.
2. Fill in the terms there — a contract created from this button carries nothing
   but its kind.

### Let a signed quote become the contract

1. The supported route is the other way round. On
   [Quotes](/docs/workspace/quotes), an accepted quote offers **Draft the SOW
   from this quote**.
2. It lands as a draft contract carrying the quote's value, currency, rate card,
   dates and the quote PDF. Nothing is sent to the client, and a quote can only
   be converted once.

## What it affects

- **Rate resolution.** A contract can bind a rate card, and every hour on a
  project under it is then priced from that card whatever the project or the
  company default says — as long as the work is dated inside the contract
  period. The order is the contract's card first, then the project's own, then
  the company default effective on the date of the work.
- **Time entry.** The contract's budget policy decides what happens when the
  value is spent. **Warn** lets time go on being logged and tells everyone;
  **Block new time** refuses new entries until a change order raises the value;
  **No budget governance** does not even compute the burn.
- **Billing.** A billing schedule row reaching **Ready** is an instruction a
  billing run executes. Contracts do not raise invoices themselves — the ERP
  owns invoicing.
- **Revenue.** The revenue schedule on a contract is what monthly recognition is
  recorded against, and what every revenue report sums.
- **Retainers.** A retainer is configured against a contract and draws down from
  the work logged under it.
- **The client record.** A contract's value counts towards the Contract value
  figure on its [client](/docs/workspace/clients), converted into the
  workspace's reporting currency.

## On mobile

The **Contracts** tab in the Expo app is the list, its state and its remaining
value, and tapping a row opens the burn bar plus what governs the work. It is
read-only by design: signing freezes the commercial terms and the exchange rate
in the same instant, and that is a decision made at a desk with the paper in
front of you. Without `contract.burn.view` the value column does not render on
the phone either.

## Limits and gotchas

- **Nothing expires a contract.** A lapsed statement of work is still Active in
  the database. Treat the period line under the dates as the truth, not the
  badge.
- Signed and Active share a colour on purpose, because they share a consequence
  — the terms are frozen either way. What separates them is whether work has
  started.
- A master agreement with no end date is ordinary and is shown as *No end date*,
  not as expired.
- A statement of work whose parent is hidden by the current filter keeps its own
  row at the top level rather than vanishing. A filter should hide what it
  names, not what happens to be related to it.
- Money on the wire is in **minor units**. A figure read from the API is cents,
  fils or yen — the screens divide by the currency's own exponent, and a
  three-decimal currency read as two is a thousandfold error.

## Related

- [One contract](/docs/workspace/contract) — terms, burn, schedules, amendments and signatures.
- [Quotes](/docs/workspace/quotes) — where a contract usually comes from.
- [Clients](/docs/workspace/clients) — the accounts these agreements belong to.
- [Admin → Finance](/docs/admin/finance) — reporting currency, exchange rates and rate cards.

## Related

- [One contract](https://projectri.com/docs/workspace/contract.md): A single agreement end to end — terms, rate card, burn, billing and revenue schedules, projects, documents, amendments, retainers and signatures.
- [Quotes](https://projectri.com/docs/workspace/quotes.md): What is out with clients and what they did with it — send a quote on a private link, watch it be opened, and turn the accepted one into a statement of work.
- [Clients](https://projectri.com/docs/workspace/clients.md): The account record for every client and prospect — contacts, projects, contracts, meetings, portal logins and an activity trail, one client at a time.
- [Finance setup](https://projectri.com/docs/admin/finance.md): The configuration every financial number divides by — rate cards, working calendars, exchange rates, targets, leave, timesheet and expense policy, overtime, tax, dunning, payments, cost centres, budget alerts and the month-end close.
