> For the complete documentation index, see [llms.txt](https://help.agencydesk.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.agencydesk.io/jobs/job-costing.md).

# Job Costing

The Job Costing is the financial blueprint of every Job. Build it out of Groups, Tasks, and Costs, and everything downstream reads from it: Estimates, Invoices, scheduling, and profitability.

The **Job Costing** is the backbone of every [Job](/jobs/managing-jobs.md) in Agencydesk. It's where scope becomes structure and price: the Groups, Tasks, and Costs that make up the work, each with its quantity, rate, and total.

Because Agencydesk is built exclusively for agencies, everything downstream reads from the Job Costing rather than being rebuilt. [Cost Estimates](/jobs/estimates.md) are generated from it. [Invoices](/jobs/financial/invoices.md) bill against it. [Tasks](/jobs/tasks.md) flow to the [Resource Planner](/task-schedule/resource-planner.md) when activated. [Recon](/jobs/recon.md) measures actual performance against it. Cost the Job properly once and the rest of the workflow follows.

## The Job Costing at a glance

Open a Job and click the **Job Costing** tab.

Across the top of the costing you'll find:

* **Status tabs** with live counts, filtering the view: **Active**, **Invoiced**, and **Completed**.
* **Expand / Collapse** — toggles the full descriptions on every Task and Cost. Collapsed gives you a clean price list; expanded shows the detail your team and client need.
* **Search** — find a Task or Cost within a large costing.
* **+ New Group** — add a new Group to the costing.

The costing uses one aligned table, with a heading band for each Group and these columns:

| Column         | What it shows                                                           |
| -------------- | ----------------------------------------------------------------------- |
| **Group name** | The Group heading, then each Task or Cost beneath it                    |
| **Qty**        | Hours for a Task (for example `02:00`), or units for a Cost             |
| **Unit Price** | The rate per hour or per unit                                           |
| **Markup**     | The markup on a Cost. Tasks show a dash                                 |
| **Total**      | Qty × Unit Price                                                        |
| **Status**     | The line item's state, its invoiced progress bar, and the Active toggle |

### Scheduling and Milestones

Use the [Tasks tab](/jobs/tasks.md) for the compact milestone timeline above the live work, or the [Timeline tab](/jobs/timeline.md) for Task bars, Milestones and date changes. The compact strip is not displayed above Job Costing. To mark a Group deadline, add a Milestone on the Timeline and choose Group under Link to.

### Create a linked Milestone

{% stepper %}
{% step %}
On an open Job, hover an unfinished Task or Cost and click its diamond **Create Milestone** icon. Drafts are included. For a Group deadline, open the Group’s ⋯ menu and choose **Create Milestone**. Manager access or higher is required.
{% endstep %}

{% step %}
The Milestone popup opens with that Task, Cost or Group linked. Check the suggested name and date, choose the date you intend, then click **Create Milestone**. A Cost does not supply a delivery date automatically.
{% endstep %}
{% endstepper %}

### Keep the Job in the intended order

Drag Groups and line items by their grips on Job Costing to set the order shared by the Tasks tab, Costs tab and Timeline. Reorder Groups here; the Tasks and Costs tabs use +/− to open and close them. A Task whose start or due date changes is placed by its new dates within its Group. Other Tasks, Costs and undated items keep their places. Planner bookings use a separate per-person order.

If an order save fails, **Order was not saved** appears and the saved order reloads. Check the result before trying again.

## Groups

A Job Costing is built out of **Groups**. A Group is a logical section of the work: a phase, a deliverable, a workstream, or a department's contribution.

Typical agency Groups might be *Strategy*, *Design Assets*, *Implementation*, *Content Production*, *Media Spend*, or *Admin*. On a website build you might use *Discovery*, *Design*, *Development*, and *QA & Launch*. On a retainer, *Account Management*, *Content*, *Paid Media*, and *Reporting*.

### Creating a Group

{% stepper %}
{% step %}
Open the Job’s **Job Costing** tab and click **+ New Group**. On an empty costing, use **Create a group**.
{% endstep %}

{% step %}
Enter a meaningful **Group Name**. A name containing only spaces cannot be saved.
{% endstep %}

{% step %}
Click the **tick** (Save new group), or press **Enter**. Wait for the save to finish before adding items.
{% endstep %}

{% step %}
Use **+ Add Task** and **+ Add Cost** at the bottom of the saved Group. To abandon the new name instead, click the **cross** or press **Escape**.
{% endstep %}
{% endstepper %}

### The Group menu

Click the Group name or its **ellipsis** (three dots) on **Job Costing** to open its menu:

* **Edit Group** — rename the Group.
* **Duplicate Group** — copy the Group with all its Tasks and Costs. Useful for repeated phases, for example duplicating a *Month 1* retainer Group into *Month 2*.
* **Cost Group as Unit** — see [below](#cost-group-as-unit).
* **Delete Group** — remove the Group.

### Renaming a Group

{% stepper %}
{% step %}
On **Job Costing**, open the Group menu and choose **Edit Group**.
{% endstep %}

{% step %}
Change the **Group Name**, then click the **tick** (Save group name) or press **Enter**.
{% endstep %}

{% step %}
Wait for the new heading to appear. Click the **cross** or press **Escape** to cancel the rename instead.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Clicking away does not save a Group rename. If saving fails, the original heading remains and your entered name stays available to correct or retry. Create and rename Groups on **Job Costing**; the Group headings on **Tasks** and **Costs** are read-only.
{% endhint %}

{% hint style="warning" %}
A Group can only be deleted if **every** Task and Cost inside it can be deleted. The same conditions apply as for individual line items: no time tracked, nothing invoiced, and no Purchase Orders raised. See [Deactivating a line item](#deactivating-a-line-item).
{% endhint %}

{% hint style="info" %}
**Great for** retainers. Cost one month properly, then duplicate the Group for each following month. Pair it with a [Job Template](/company-settings/job-templates.md) or a [Recurring Job](/company-settings/recurring-jobs.md) and the same structure rolls forward without being rebuilt from memory.
{% endhint %}

## Cost Group as Unit

**Cost Group as Unit** changes how a Group appears on client-facing documents. The top line item in the Group becomes the main element, and every other item indents beneath it.

On a Cost Estimate or Invoice PDF, the Group is then compressed into a **single line**: the top item's title, with the Group's total as the amount. No hours, no units, no breakdown. You're choosing not to show the detail.

{% hint style="info" %}
**Great for** a deliverable you've broken into small internal Tasks across several departments, where the client just needs the deliverable and the price. A *Brand Identity Package* might be twelve Tasks across design, copywriting, and account management internally, but the client sees one line: **Brand Identity Package — R48,000**. You keep the granularity you need to schedule and measure the work, and the client gets a clean, simple quote.
{% endhint %}

{% hint style="warning" %}
**Cost as Unit and Xero.** When a Group with Cost as Unit active is synced to [Xero](/company-settings/integrations.md), **every line item syncs individually**, not the compressed single line. This is deliberate: it keeps [departmental](/company-settings/departments.md) reporting in Xero accurate, so the right departments are credited with their income and cost.

The practical implication: if you normally send Invoices from Xero but you don't want a particular client seeing the Cost-as-Unit breakdown, send that Invoice from Agencydesk instead.
{% endhint %}

## Adding a Task

{% stepper %}
{% step %}
Inside a Group, click **+ Add Task**. The Task detail slider opens.
{% endstep %}

{% step %}
Select a **Task Type** from your [Rate Card](/company-settings/rate-card/task-types.md). This determines the [department](/company-settings/departments.md) and pulls in the rate for the Job's [Billing Tier](/company-settings/general/billing-tiers.md).
{% endstep %}

{% step %}
Fill in the rest:

* **Task Name** — optional. Use it when the Task Type alone isn't specific enough, for example *Graphic Design – Co-branded asset designs*.
* **Rate / Hour** — populated from the Rate Card. The padlock icon shows whether the rate is locked to the Rate Card value.
* **Estimated Time** — the hours you're costing for this Task.
* **Billable** — toggle off for internal or goodwill work that should be tracked but not charged.
* **Description** — what the Task covers. This appears on Estimates and Invoices, so write it for the client as well as the team.
  {% endstep %}

{% step %}
Click **Add Draft Task**. The Task is added in **Draft** status.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
A newly added draft Task starts without dates. Activation supplies missing dates from the Job’s range. Managers and above can also show drafts on the Timeline and give a draft dates there before activation; it remains draft until activated.
{% endhint %}

Once a Task is active, everything else about it (assigning users, briefs, amendments, reviews, notes, and its time log) is covered on the [Tasks](/jobs/tasks.md) page.

## Adding a Cost

{% stepper %}
{% step %}
Inside a Group, click **+ Add Cost**. The Cost Detail slider opens.
{% endstep %}

{% step %}
Select a **Cost Type** from your [Rate Card](/company-settings/rate-card/cost-types.md), and the [Supplier](/admin/suppliers.md) you're buying from.
{% endstep %}

{% step %}
Fill in the rest:

* **Cost Name** — optional, for when you need more detail than the Cost Type.
* **Markup Method** — choose Fixed price or Percentage. The Cost Type supplies the default, and your choice applies to this Job Cost.
* **Billable** — toggle off for costs the agency is absorbing.
* **Description** — what the Cost covers.
* **+ Add a Document** — attach the supplier quote, spec, or proof of pricing directly to the Cost.
  {% endstep %}

{% step %}
Click **Add Cost**.
{% endstep %}
{% endstepper %}

Once a Cost is active, pricing, currency conversion, markup, and the procurement view are covered on the [Costs](/jobs/costs.md) page.

{% hint style="info" %}
**Great for** keeping supplier quotes where they belong. Attach the printer's quote to the print Cost, the photographer's rate sheet to the shoot Cost, or the media platform's proposal to the ad-spend Cost. When someone questions the number six weeks later, the evidence is on the line item.
{% endhint %}

## Reading line items

### Line item status

Every Task and Cost carries a status tag:

* **Draft** — costed but not approved to proceed. Nothing has been committed.
* **Active** (green) — activated and in production. Tasks appear on the Tasks tab and can be scheduled; Costs appear on the Costs tab.
* **Issued** (orange) — some or all of the line item is included on an **issued** Invoice.

{% hint style="info" %}
A line item sitting on a **draft** Invoice still shows as **Active**, not Issued. Only once the Invoice is issued does the Job Costing reflect it as invoiced. This keeps the costing honest about what has actually been billed rather than what someone is preparing to bill.
{% endhint %}

### The invoiced progress bar

Beneath each status tag is a progress bar showing how much of that line item has been invoiced:

* **Light grey** — not yet invoiced.
* **Orange** — partially invoiced.
* **Red** — invoiced in full.

This lets an Account Executive scan a long costing and immediately see what's still to bill, which is exactly what you want before raising the next [progress Invoice](/jobs/financial/invoices.md#creating-an-invoice).

### The Active toggle

The toggle to the right of the progress bar switches a line item between **Draft** and **Active**.

Activating a Task puts it on the **Tasks** tab, where it can be [assigned and scheduled](/jobs/tasks.md#assigning-users) on the [Resource Planner](/task-schedule/resource-planner.md). Activating a Cost puts it on the **Costs** tab, where a [Purchase Order](/jobs/financial/purchase-orders.md) can be raised against it. Activating anything also moves the Job itself from [Draft to Active](/jobs/managing-jobs.md#activating-a-job).

### Deactivating a line item

A line item can only be toggled back to Draft under certain conditions:

* **A Task** can be deactivated only if no time has been tracked against it, it has not been invoiced (even partially), and it has no Resource Planner bookings for today or later.
* **A Cost** can be deactivated only if **no Purchase Order** has been created against it.

{% hint style="info" %}
These guardrails stop work that has already consumed time or money from being quietly reverted to draft, which would leave your tracked time and billing records pointing at something that no longer exists.
{% endhint %}

If planned time prevents deactivation, **Cannot Deactivate** puts the switch back and explains the refusal. Choose **Go to Task**, or a listed person when several have bookings, to open their Task in the Planner. Review the saved bookings before changing them, then try deactivation again only when the blocking time has been resolved.

## Totals and tax

Each Group shows its own **Total**. At the bottom of the costing, a summary shows the **Sub Total**, **Tax** at the [Client's rate](/admin/clients.md#financial-details-on-a-client), and the **Total** including tax.

Group-level totals make it easy to discuss scope in chunks with a client: what Strategy costs, what Production costs, what the Media budget is.

## Currency

A Job Costing is always in the **currency selected when the Job was created**, which comes from the [Billing Tier](/company-settings/general/billing-tiers.md) assigned to the Job.

{% hint style="warning" %}
You can't change a Job's currency (which means changing its Billing Tier) once **Invoices or Purchase Orders** exist on the Job. Those would need to be deleted or voided first.

This protects the integrity of documents already issued. An Invoice sent to a client in USD can't have its underlying Job quietly repriced into ZAR.
{% endhint %}

If you need the same structure in a different currency, [duplicate the Job](/jobs/managing-jobs.md#duplicating-a-job) and select the new Billing Tier. Task rates transpose to the new tier's rates and Costs convert at the live exchange rate.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://help.agencydesk.io/jobs/job-costing.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
