Rate cards and cost pools
Set private-inference prices on Rate cards, then enter a cost-pool period total and read the allocation.
Best for: Finance admins pricing private inference and splitting a pool period
Rate cards and cost pools
Rate cards price private inference. Cost pools take a period total for that capacity and split it across endpoints and agents. Both pages say a finance admin is required. On Team, the control that grants this is Allow rate cards and cost pools. An owner or an admin already has that box checked and locked. A member needs an owner or an admin to turn it on.
Open both from Settings. Cost pools says "Private-inference period totals, two-tier allocation, and idle capacity policy." Rate cards says "Org-owned private-inference rates with allocated cost source and derivation audit." Each card's button is Configure. Settings on either page returns to Settings.
If someone who is not a finance admin saves a rate card, the page says "A finance admin has to save rate cards."
Rate cards
The page title is Rate cards. The line under it is "Org-owned rates for private inference. An event uses the first active card that matches, in this order: endpoint, pool, model, then org default."
The next line is "A blank model name on a price line applies to every model. A line with a model name wins for that model. Activating a card replaces the previous active card for the same scope."
New draft
The form is New draft. After you start a copy, the heading changes to New draft from a copy.
| Field | What it is |
|---|---|
| Name | Required. Empty shows "Name is required". |
| Scope | Endpoint, Pool, Model, or Org default. |
| Scope ref | Shown for Endpoint, Pool, and Model. Empty shows "Scope ref is required for this scope". Hidden for Org default. |
| Effective from | A date. Empty shows "Effective from is required". |
Under the fields: "The date and scope are set when the draft is created." Create draft sends it. While a save is in progress the button says Saving…. Success says "Draft rate card created".
Cards
The list is titled Cards. With none, the page says "No rate cards yet."
Cards are grouped Endpoint, Pool, Model, then Org default. Each row is the name, then the scope, the status, and the version, written as scope · status · v and the version number. A scope that has a ref is written Scope: ref. Click the row to open the card.
Edit a draft
A draft opens as Edit draft. The line under the heading is the status, the scope, and effective plus the start date. If the card has an end date, the line continues with an arrow and that date.
Name and Notes can be edited. Price lines has a unit, a model name, a USD rate, and Remove. Add a line adds another. Save price lines stores the lines. Success says "Price lines saved".
Units:
- Per 1K input tokens
- Per 1K output tokens
- Per 1K cached tokens
- Per 1K reasoning tokens
- Per request
- Per GPU-second
- Per GPU-hour
The model field placeholder is "Model name, or blank for all". The rate placeholder is "USD".
Cost inputs has Category, Amount USD, Period, and Quantity. Period is Monthly, Annual, or One time. One time also shows Amortization months and Salvage percent. Remove input drops a row. Add an input adds one. Suggested categories are hardware, gpu, platform_license, accelerator_license, facility, and ops_labor.
Upload inputs CSV accepts a CSV. The note under it says "Uploading a CSV replaces the cost inputs and rebuilds the price lines." Success says "Inputs imported".
Capacity for Derive has Hours per month, GPU count, Utilization percent, and Tokens per GPU-hour by model. The note is "When hours per month is set, Derive uses that figure. Otherwise it uses GPU count × 730 × utilization." Each model row has placeholders "Model name" and "Tokens per GPU-hour", plus Remove. Add a model adds a row.
Save inputs and capacity stores the inputs and the capacity. Success says "Cost inputs and capacity saved". Derive lines saves those first, then fills the price lines. Success says "Lines derived from inputs". Activate makes the draft the active card for that scope. Success says "Rate card activated".
A number below zero on a price, a cost amount, quantity, amortization months, salvage percent, hours per month, GPU count, utilization percent, or tokens per GPU-hour is refused. The page says that field "must be zero or greater." An empty name on a draft that already exists says "Name is required."
A card that is not a draft
The heading is the card name. Copy to a new draft is the only change control. The page says "This card is read-only. Copy it to change the prices."
Price lines are listed as the unit, the model or "all models", and the dollar rate. With none, the page says "No price lines." Cost inputs are listed as category, amount, and period. With none, the page says "No cost inputs." Capacity is listed as hours per month, GPU count, and utilization percent, each "not set" when blank, then each model's tokens per GPU-hour.
After a derivation, the derivation text is shown under the capacity.
Copy fills New draft from a copy with the name plus " copy", the same scope, and the same effective date. The page says "Copied" and the card name, then "Create the draft when the date and scope look right."
Unpriced usage
The last section is Unpriced usage. It says "Unpriced self-hosted usage will be listed here."
Cost pools
The page title is Cost pools. The line under it is "Enter the private-inference period total, run two-tier allocation (pool → endpoints → agents), and report idle capacity under the pool residual policy. Requires finance admin."
FOCUS Purchase mapping
The checkbox is "Map FOCUS ChargeCategory=Purchase rows tagged with pool_id to pool period totals (default off)". Turning it on says "FOCUS Purchase→pool mapping enabled". Turning it off says "FOCUS Purchase→pool mapping disabled (default)".
Create pool
| Field | What it is |
|---|---|
| OASA pool id | Required, with the display name. Empty shows "Pool id and name are required". |
| Display name | Required, with the pool id. |
| Residual policy | Hold (idle line), Spread, or Reserve. The menu starts on Hold (idle line). |
| Hold department id (uuid) | Shown only for Hold (idle line). Empty shows "Hold department id is required when residual policy is hold". |
Create pool sends it. While a save is in progress the button says Saving…. Success says "Cost pool created".
Pools
The list is titled Pools. With none, the page says "No cost pools yet." Each row is the display name, then the pool id and the residual policy. An inactive pool also says "inactive". Click a row to open it.
A period
The open pool shows its name, then "Enter a period total (line items optional). Saving mints the pool control total."
The form is a start date, an end date, Total USD, and Capacity GPU-seconds (optional). The start date begins as the first day of the current month, and the end date as today. An empty total says "Period total (USD) is required". Save period sends it. Success says "Period saved — control total minted".
Periods lists each one as start, end, the dollar total, and the status. With none, the page says "No periods yet." A period that is not locked has Run allocation. A locked period does not.
Run allocation either says "Allocation run succeeded" or "Allocation finished but invariant failed — period left open".
Open a period to see "Status" and "Total", then Open pool period view. The latest run shows Invariant as "ok" or "failed", Unassigned, Idle, and each endpoint as its id or "(none)", a share, and a dollar amount. Runs lists each run id prefix, status, residual policy, and start time. With none, the page says "No runs yet."
Pool period view
Open pool period view leaves Settings. Cost pools on that page returns to the cost pools page. Refresh reloads it.
The heading is the pool name, or the pool id, or "Pool period" before the period loads. The line under it is the start date, the end date, "Period" and the status, and "Pool" and the pool id. The next line is "Figures are the saved output of the allocation run. Nothing on this page is recalculated."
If the link's pool does not own the period, the page says "This period belongs to a different pool than the link you followed."
With no run, the page says "No allocation run for this period yet. Run allocation from Cost pools settings." A run that did not succeed shows the run id prefix, the status, and the error when there is one.
A succeeded run shows four figures:
| Figure | Meaning on the page |
|---|---|
| Period total | The period total. |
| Allocated to agents | "Cost charged to the agents that used the endpoints." |
| Idle capacity | "Nobody used it: GPU capacity paid for but not held by any endpoint, or held with no requests served." |
| Pool utilization | "Busy GPU-seconds ÷ pool capacity GPU-seconds." A missing percent is shown as an em dash. |
Policy applied uses these sentences:
| Policy | Sentence |
|---|---|
| Hold | Hold — unused capacity is kept on one idle line |
| Spread | Spread — unused capacity is spread across endpoints by share |
| Reserve | Reserve — endpoints pay for declared GPUs; the rest is idle |
Under that, the page lists Capacity, Held, and Busy in GPU-seconds.
Invariant either says "Allocated + idle = total" and the difference, or "Invariant failed" and the difference. When the run wrote ledger rows, the page says "Ledger rows written by the run" and the amount. The run id prefix is a link to that run. If the run has a finish time, the line includes it.
Endpoints columns are Endpoint, Held GPU-s, Busy GPU-s, Utilization, Share, Allocated, Idle, and Agents. An endpoint with no id is "(none)". With no rows, the page says "No endpoint held capacity this period." When the run recorded within-endpoint idle, the note is "Within an endpoint, time held but not busy is charged to its callers, not split out as idle."
Agents by endpoint groups agents under each endpoint. A row is the agent name, or the OASA agent id, or "Unknown agent", then team, cost center, and token count when those are present, and the allocated amount. With none, the page says "No agent usage was allocated in this run."
Idle lines shows one of these sentences, then the endpoint id when the line has one:
- Capacity no endpoint held
- Endpoint held GPUs but served no requests
- No endpoint held capacity this period
With none, the page says "No idle capacity in this run."
Run warnings lists any warning text from the run. When the period has more than one run, Other runs for this period lists each run id prefix, status, residual policy, and start time. The open run is underlined.