> ## Documentation Index
> Fetch the complete documentation index at: https://docs.semicola.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Budgets, fees and currency

> What a budget number means, how media buys allocate against the campaign budget, and how currencies must line up between a campaign and a seller.

## No fee inside your budget

Semicola takes **0% of media**. It charges for intelligent work in Intelligence Units, billed
separately (see [Billing](/buy/billing)). So the budget you set is the budget that buys media: there's
no fee carved out of it and no gross/net split to read.

| Budget           | Where                                                       |
| ---------------- | ----------------------------------------------------------- |
| Campaign budget  | `budget.total` on the campaign, in the campaign `currency`. |
| Media buy budget | The budget staged against one seller.                       |
| Package budget   | Each product's share of a media buy.                        |

Delivered spend on every buyer surface is the spend the seller reported.

## The budget ceiling

Media buys allocate against the campaign's `budget.total`. Campaign reads carry both numbers, so
read them rather than re-deriving them:

* **`allocatedBudget`**: the sum of the budgets of every media buy that still counts toward the plan:
  `DRAFT`, `PENDING_APPROVAL`, `INPUT_REQUIRED`, `ACTIVE`, `PAUSED` and `COMPLETED`. A draft buy
  holds budget exactly as a live one does.
* **`unallocatedBudget`**: `budget.total − allocatedBudget`, the room left for a new buy or an
  increase. It can go negative; an over-allocated campaign is a launch blocker (see
  [Campaign readiness](/concepts/campaign-readiness)).

When you raise an existing buy, its current budget is already inside `allocatedBudget`. The most it
can go to is its current budget plus `unallocatedBudget`; adding the current budget again counts it
twice.

Staging a proposal with no room left fails with `409 INSUFFICIENT_MEDIA_BUDGET` ("No unallocated
budget left on … Raise the budget or remove a staged buy."). When a seller already has a draft buy on
the campaign, its budget counts as available to that seller's next proposal.

## How a budget splits across products

A staged buy splits its budget across the proposal's products by their allocation percentages. Shares
are exact to the cent: any leftover cents go to the products with the largest remainders, so the
packages always add up to the buy. With [pacing periods](/guides/pacing-periods), each product's share
splits again by period.

## Currency

A campaign has one `currency`, set when it's created. An update that sends a different
`budget.currency` fails with `CURRENCY_MISMATCH` ("This campaign buys in USD."). Every product in a
staged buy must be priced in the campaign currency.

* A product priced in another currency is **skipped** when you stage the proposal, with the reason
  "Priced in EUR; the campaign settles in USD." The result lists skipped products in
  `productsSkipped`.
* If no product in the proposal is priced in the campaign currency, staging fails ("None of this
  proposal's products can be staged.").

On the seller side, a storefront confirms the currency it quotes and settles in (**Confirm your
currency**, `currency_confirmed`, a go-live blocker) and may list additional settlement currencies
(`paymentCurrencies`). **Payout currency** (`settlement_currency_match`) checks that the default
currency is one of them. Nothing assumes USD: a storefront with no confirmed currency can't go live.

## Not available yet

* **Cross-currency buying.** There's no FX conversion: a buyer can't buy a product priced in a
  currency other than the campaign's, and there are no FX rates to lock.
* **Per-source execution currency** for ad-server sources.
* **Fee terms and `budget_breakdown`** (`media_budget`, `fee_amount`, `effective_gross_cpm`). With no
  media fee there's nothing to break down.
* Lowering `budget.total` below what's already allocated isn't refused; the campaign shows as
  over-allocated (`OVER_ALLOCATED`, "Staged buys exceed the budget by …") and can't launch until
  you rebalance.
