# Budget & Pacing



## CPM billing

**CPM** stands for *Cost per Mille* – the price per 1,000 impressions.
For budget campaigns, costs are deducted proportionally on each impression.

**Cost per impression**

cost = cpm ÷ 1000

**Total spend**

spend = impressions × (cpm ÷ 1000)

**Example: CPM = €2.50, 10,000 impressions**

10,000 × (2.50 ÷ 1000) = €25.00

> The CPM value is stored with up to 4 decimal places to accurately represent very low prices (e.g. €0.0025).

## Pacing scenarios

Pacing distributes the budget evenly over the campaign's run time. Without pacing, ads are served as fast as possible until the budget is exhausted.

| Scenario | Pacing | Smart Boost | Result |
| --- | --- | --- | --- |
| No pacing | Off | Off | Maximum delivery until budget exhausted. Budget may run out early. |
| Standard pacing | On | Off | Budget spread evenly over run time. Consistent delivery throughout the day. |
| Smart Boost pacing | On | On | When CTR is high, delivery is automatically increased. Good performance is rewarded. |

**Hourly budget target (pacing formula)**

hourly\_target = remaining\_budget ÷ remaining\_hours

Remaining hours = hours until end date (or until 23:59 today if no end date is set).

## Smart Boost

Smart Boost automatically increases the delivery rate when a campaign has an above-average CTR –
so high-performing ads get more reach.

> Parameters
>
> - **Boost percent**: How much the hourly budget may be exceeded (e.g. 150% = 1.5× target allowed)
> - **Min. CTR**: CTR threshold (in %) above which the boost activates

> Logic
>
> - CTR ≥ Min. CTR → Boost active, up to Boost-% more budget per hour
> - CTR < Min. CTR → Standard pacing, no extra budget

> Smart Boost does not increase the total budget. It can only deplete it faster if CTR remains consistently high.

## Redis caching of budget data

To perform budget checks quickly on every ad request, current spend totals are cached in Redis.
This minimises database queries.

| Cache key | Content | TTL |
| --- | --- | --- |
| camp\_spend\_{id} | Current total spend for the campaign | 5 min. |
| camp\_daily\_{id}\_{date} | Spend for the current day | Until midnight |

> The cache lag of up to 5 minutes can cause the budget to be slightly exceeded. This is intentional to maximise performance.

## Budget warning levels

The campaign dashboard displays warning levels when budget is running low:

Budget usage < 80 %: Normal

Budget usage 80–95 %: Warning – budget running low

Budget usage ≥ 95 %: Critical – campaign ending soon
