# How budgets and cost are calculated

Teamhood calculates what work has cost from the hours people logged. Each hour is priced at the cost rate of the person who logged it, on the day of that hour.

No cost is saved anywhere. Every figure is calculated again when you look at it. A new or corrected rate therefore changes every figure at once, past hours included.

## The Financials fields

In a new organization, every type has **Cost**, and a Project also has **Budget**. The two fields are in the **Financials** group, the last group when an organization starts. A group created later is placed after it, and any group can be moved.

- **Budget** is a number you type.
- **Cost** is what the logged hours cost so far.

Nobody can type a value into **Cost**, and a formula cannot use it. **Cost** cannot be deleted. A role with **Manage fields & types** can still change the types it applies to, in **Settings → Fields**.

## Which rate prices an hour

For a person, Teamhood uses the first rate it finds in this order:

1. The person's own rate.
2. A rate of the person's team. A team without a rate uses the rate of the nearest team above it.
3. The organization default.
4. No rate. The hours then cost nothing, and the **Budget** section reports them.

- A rate applies from its **Effective from** date until the next rate of the same person or team. A rate set **From the start** has no first day, so it also prices every hour logged before it was set.
- On a day before a person's first own rate, the team rate applies, then the organization default.
- An own rate of 0 is still a rate: the person's hours cost nothing, and their team rate does not apply. Remove the own rate to let the team rate price them.
- A person in several teams with different rates gets the highest rate. **Comes from** then shows **Several teams** with a warning.
- When those teams all set the same rate, **Comes from** shows **Several teams (same rate)** and no warning.

## Cost comes from logged time

- Every time log counts, on every tracked time field. An hour costs the same whether it is billable or not.
- A log is priced at the rate of the person who logged it, on the day of the log.
- A rate that starts in the middle of a month splits that month exactly. Hours before the date use the old rate, and hours from the date use the new one.
- A parent's cost includes every item below it.
- Time logged on a category is part of no item's cost.
- Planned hours, estimates and reserved hours add nothing. **Cost** covers only time that has been logged.

## The Budget section

An item's **Budget** section shows the item's **Budget** and its **Cost**, with the hours behind the cost.

- **People** lists everyone who logged hours on the item or below it, largest cost first. Each row shows the person's cost, their hours, and where their rate comes from today.
- The section then lists the hours whose price may surprise you. These hours are already in **Cost**:
  - hours priced at the organization rate, because their person has no rate of their own and no team rate;
  - hours priced at a team rate. A team rate follows the person's current teams, so the cost of these hours can change later;
  - hours by people with no rate, which cost nothing.

## A worked example

The organization default is 50 an hour. Ana is in no team and has her own rate of 80 from 1 March. Ben has no rate of his own, and his team, Structural, has a rate of 60. A project has a budget of 10,000.

- Ana logged 40 hours in February and 20 hours in March on a task. February is before her own rate, so it uses the default: 40 × 50 = 2,000. March uses her rate: 20 × 80 = 1,600. Her cost is 3,600.
- Ben logged 50 hours on a second task: 50 × 60 = 3,000.
- The project's **Cost** is 3,600 + 3,000 = 6,600. Its **Budget** section shows **Budget** 10,000 and **Cost** 6,600. **People** lists Ana first, then Ben, with **Structural** as where his rate comes from.

If Structural's rate is corrected to 70 **From the start**, Ben's hours cost 3,500 and the project's **Cost** becomes 7,100. Ana is listed under **Needs attention**, because the default priced her first hours before her own rate began.

## Who can see money

The **Financial data** permission covers cost rates and **Budget**. By default, only Administrator holds it.

- Without **Financial data**, Teamhood never sends a role the value of **Budget**.
- Such a role is not offered **Budget** in any field list: columns, filters, grouping, sorting, card fields or charts.
- Where a view already shows **Budget**, the role sees a dash. A board card leaves the field off.
- A filter on **Budget** is not applied for the role, and the filter's chip says so.
- A formula that uses **Budget**, directly or through another formula, is withheld the same way.
- Changing a **Budget** needs **Financial data** set to **Read & write**.

Only a role that may read both financial data and time logs sees cost figures. These figures are:

- the values of the **Cost** field;
- the **Budget** section of an item;
- the **Cost** column of a timesheet export.
- the values of a formula that uses `RATE`.

Everyone else sees a dash in the **Cost** field and in such a formula. A filter on either is not applied for them, and the filter's chip says so. A shared view therefore shows them the rows that the filter would hide.

> **Anyone who can see cost can calculate a person's rate.**
> One person's cost on an item, divided by their hours on it, is their rate. To keep pay private, give rates to teams rather than to people.

A share link never shows **Cost**. It shows **Budget** only when the person who created or last changed the link may read it. The public API and the MCP server return rates and time logs, but no cost figures.

## Planned cost with a formula

A formula field can price an item's estimate with `RATE`, for example `{Estimate (h)} * RATE()`. [Formula functions](../../types-and-fields/formula-functions/) describes it.

- **Planned cost is not Cost.** It prices the whole estimate at today's rates. **Cost** prices only the hours already logged, each at the rate on the day it was logged.
- **It is never saved.** It changes when a rate, an assignee or a team changes, like every cost figure.

## When figures appear and change

- **The Budget section shows only where it has something to show.** The item's type must have the **Budget** field. The item must also have a budget or a cost above 0. In a new organization, that means Projects.
- **On a type that Cost does not apply to, the section shows the budget alone.** It has no **Cost** figure, **People** list or gaps there.
- **A cost figure does not depend on the view.** **Cost** covers the item and every item below it, whatever the view filters out.
- **A time log changes the cost at once.** Adding, editing or deleting a log changes the figures before the change is saved.

## Items that Cost does not apply to

An item whose type is outside the types **Cost** applies to has no **Cost** figure. Sorting and filters treat it as empty, and an export leaves its cell blank.

Its hours still count in the cost of the items above it. A total also passes through it:

- A group header and the total row add up the figures of the top items in the group. A parent's figure already covers the items below it, so they are not counted again.
- When a top item has no figure, the total counts the items below it instead. It stops at the first item on each branch that has a figure. Items that the view filters out count too.
- A chart measure on **Cost** adds up the same items, in the category of the top item.
- A burnup or burndown **Sum** of **Cost** adds up the same items. They count as done when the top item is done.

## Cost in charts and exports

- **Cost can be a chart measure, but not a category.** A chart cannot use **Cost** for its categories or for **Break down by**. A scatter can place items by **Cost**, and a burnup or burndown can add it up. A view cannot group by it, and a board cannot use it for columns or swimlanes.
- **A timesheet export can differ by cents.** The **Cost** column prices and rounds each log on its own. The column's header names the currency. The column's total can differ by a few cents from the **Budget** section.
- The **Cost** column also prices time logged on categories.

## The rates page

- **A change on a day that already has an entry changes that entry.** A row already at that amount on that day is left as it is.
- **Needs attention** lists people who have hours priced at the organization default, who belong to teams with different rates, who have hours but no rate, or who logged hours before their first rate.
- **Needs attention reads logged hours only when you open it.** The tab shows no count until you select it.
- Its checks on logged time need a role that may read time logs. Without that, the list uses planned hours only.
- **Export** writes one CSV line per rate entry of the listed rows. **Import** reads the same columns: `Kind`, `Name or email`, `Hourly rate (EUR)` and `Effective from`. A blank `Effective from` means the rate applies from the start.
- The amount column names your organization's currency. An import shows a preview before anything is saved.
- **Hours logged before a first rate are listed only in one case.** The first logged hours used the organization default or no rate. A team rate or an own rate prices later hours.
- Hours that a team rate priced from the start are not listed.
- **Deleted people and teams are not on the rates page.** A deleted person's own rate still prices the hours they logged.
- **A team rate follows current team membership.** Moving a person to another team, removing them from a team or deleting the team changes the rate of their past hours. Their past cost then changes.
- Deleting a person removes their team memberships too, so a deleted person with no rate of their own loses their team pricing.
- **A rate of the person's own never changes this way.** To keep a person's past cost fixed, give that person a rate of their own.
- **Copy rate to members** in a team's menu gives every member such a rate. It repeats what the team's rate priced them at, period by period, and adds nothing on or after a rate the person already has.
- Members of teams below the team get the copy too. A member whose rate comes from another team, or from several teams, is skipped and named.
- After the copy, a change to the team's rate no longer reaches those members. One undo removes the whole copy.

## Next

- [Set up cost rates](../../budgets/set-up-cost-rates/)
- [How values roll up to a parent](../rollups/)
- [How a chart calculates its values](../charts/)
