---
title: "Spend, waste, and ROI"
description: "The spend page, token phases, waste detectors, and ROI that names its exclusions."
---

Dashboard → **Spend** is the home page. Waste and ROI are sections on it (`#waste`, `#roi`). There are no separate nav tabs.

```bash
assay show
assay waste
assay roi
```

The dashboard calls the same reports as the CLI.

## What spend shows

- Totals for the window, **corrected**, with provenance next to the number
- By day, principal, model
- Model mix and token mix
- By product (both readings — see [Products](/products))
- Unpriced share, never folded in as free

## Token phases

Assay does not print one token count. It splits:

| Phase | What it is |
|---|---|
| Input | Fresh input |
| Cache read | Tokens served from cache |
| Cache write | Tokens written to cache |
| Output | Completion |
| Reasoning | Informational; subset of output; **not priced separately** |
| Tool I/O | Tool traffic |

A cache-read share that collapses is a bill that is about to climb. Waste detectors look at this shape.

## Waste

Four pattern detectors over classified spans, ranked by estimated recoverable spend. Each finding drills into the sitting that spent the money.

```bash
assay waste
assay waste --limit 20 --json
```

A `$0.00` finding still names why it is zero. Recoverable is an estimate over priced spans. The exclusion is on the report.

Span **work-type** (mechanical / tooling / routing / reasoning / generation) is classifier input here. That is not Type (kind of work).

## ROI

```bash
assay roi
```

Three numbers, each with exclusions:

- **Cost per outcome** — spend bound to results
- **Token yield** — output against input-like phases
- **Declared-only ROI** — only where a human (or producer) declared a dollar value

No declared value → ROI is **undefined**, not −100%.

The attribution census says how each outcome reached its spend: bound, measured zero, or unknown. Unknown is not zero.

Outcomes:

```bash
assay outcomes
assay outcomes record --principal <p> --task <t> --kind <k>
```

`attribute backfill` writes the outcome↔spend bindings. It does not edit the outcome.

## Pricing accuracy

Off the nav at `/pricing`. Same question as `assay pricing check`: can Assay still price what it is being asked to meter? See [Pricing](/pricing).
