---
title: "Set a bid floor and a minimum margin"
description: "Set a per-country bid floor that programmatic (OpenRTB DSP) bids must clear, and a minimum margin that direct CPM demand must leave the network on a site or placement."
type: "howto"
audience: [network-manager]
keywords: [bid floor, floor price, use as publisher price, minimum margin, margin floor, CPM threshold, OpenRTB DSP, direct demand, Bid Floor Management, Manage Minimum Margin]
ui_path: "Account → Publishers → site → Bid floor"
---

Fetch the complete documentation index at: https://epom.com/ad-server/docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# Set a bid floor and a minimum margin

A site or placement has two price floors, one for each kind of demand. The **Bid floor** card
stops programmatic (OpenRTB DSP) bids below a per-country CPM. The **Minimum margin** on the
Pricing card stops directly sold CPM banners that would leave the network less than a set margin.
Neither changes what an advertiser is charged; the rest of the Pricing card is on
[Configure pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md).

## Who this is for

- **Bid floor** — whoever holds *Bid Floor Management* and update access to the site. It is an admin-only permission; see [Set a bid floor](#set-a-bid-floor).
- **Minimum margin** — network managers who can edit the placement's or site's Pricing card
  (*Manage Site Payment Model*) and hold *Manage Minimum Margin*.

## Prerequisites

- The site or placement is **saved**.
- For a minimum margin, the Pricing card on the placement or site is switched on and set to
  **CPM** — see [Configure pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md#steps).

## Steps

The two settings are independent; set the one you need.

### Set a bid floor

A **Bid floor** is the lowest price, per country, at which programmatic demand may buy a site or
placement. It is sent to OpenRTB DSP partners as the request's floor, and a DSP bid that comes back
under it is dropped before the auction picks a winner. Directly sold campaigns are not filtered by
it — their counterpart is the **Minimum margin** on the Pricing card.

**Who can set it.** The card needs the *Bid Floor Management* permission plus update access to the
site (a **Can Edit** or **Is Owner** share). *Bid Floor Management* is an admin-only permission: no
stock role holds it and a network manager cannot add it in the account role editor. It is granted
under **Admin → Users & access → Admin roles & permissions**; if nobody in your network can open
that page, ask Epom support or your account manager.
Without it the card is not on the page at all, not even read-only. A publisher who needs a floor
asks the network manager; the floor is set from an account the administrator has granted the
permission to.

1. Open the site (**Account → Publishers → site**) or a placement under it and find the **Bid
   floor** card. A placement floor overrides the site floor for that placement.
2. Switch the card on.
3. Pick a **Country** — or keep *Global* for every country without a row of its own; regions and
   custom country groups write one row per member country — enter the **Price** (CPM) and click
   **Add**. Repeat per country, or load many rows at once with **Upload CSV**.
4. Optionally switch on **Use as publisher price**: on an impression bought by a DSP, the
   publisher is then paid the floor instead of the site's or placement's own pricing.

**Bid floor or CPM threshold?** The site's
[CPM threshold](https://epom.com/ad-server/docs/guides/delivery/cpm-threshold.md) guarantees the publisher a minimum CPM in reporting and payouts
and is only the *last* fallback for the DSP floor; it never stops a direct campaign serving, and
its card needs *Manage Publisher CPM Threshold*. The bid floor stops cheap programmatic bids. The
floor sent to a DSP is the first non-zero value of: banner Bid floor → placement Bid floor → site
Bid floor → the banner's own price → the campaign price → the site CPM threshold.

> **Corner case:** a floor a publisher sets in their own Prebid — the Price Floors module,
> `params.bidFloor`, or `imp.bidfloor` from an app — is separate from this card. The ad server
> honours it, in US dollars, before it bids on a header-bidding request; see
> [Header bidding: what a publisher installs](https://epom.com/ad-server/docs/guides/inventory/header-bidding-for-publishers.md).

### Set a minimum margin

Publisher side only, and only when the type is **CPM** — optionally set a **Minimum margin**:
choose `Absolute` (an amount per thousand impressions) or `Percent` (a share of the
advertiser's price), enter the **Margin value** (0–100 for `Percent`, 0–1,000,000 for
`Absolute`), and click **Save**, which commits the type and the value together and stays
disabled until one of them changes. Direct CPM banners that leave the network less than this
are dropped from that placement's auction. Leave it at `None` to serve every linked banner
regardless of price. If the two fields are absent, ask your network administrator for the *Manage Minimum
Margin* permission.
Read the CPC/CPA gotcha before relying on it.

## Corner cases and gotchas

> **Corner case — a minimum margin can empty a placement.** The filter runs before the winner is
> chosen, so every direct CPM banner that fails it is simply gone from that request; there is no
> "cheapest still wins" fallback. Set the value against real campaign prices and then watch the
> placement's fill. A request whose whole candidate pool was dropped is recorded in the
> troubleshooting log as `MIN_MARGIN`. See [Ad not serving](https://epom.com/ad-server/docs/troubleshooting/ad-not-serving.md).
> The placement's own requirement wins; if the placement says `None`, the site's requirement
> applies to all of its placements — resolved independently of which level supplies the price.
> The filter is on by default; Epom can switch it off for the whole network (a server-side
> setting), and saved requirements are then ignored.

> **Gotcha — a minimum margin does not protect you against CPC or CPA demand.** The requirement
> compares the advertiser's **CPM** against the publisher's CPM payout. A CPC or CPA campaign
> earns per click or per conversion, so its effective CPM depends on a rate nobody knows when
> the ad is chosen — there is no honest number to compare, and those campaigns are **left to
> serve unchecked**. A CPM placement carrying CPC demand with a poor click rate can therefore
> lose money while a margin requirement is configured and looks active. Use per-campaign linking
> or [price adjustment rules](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md) for that case. The card shows this
> warning itself once a requirement is set. One exception in your favour: a **banner-level CPM
> price overrides its CPC/CPA campaign**, and such a banner *is* checked.

> **Corner case — the minimum margin only covers fixed-price CPM links.** It reads the fixed
> publisher CPM (placement first, then site) and compares it against the advertiser's CPM. It
> therefore does nothing when the type is CPC or CPA, when the publisher is paid by **revenue
> share** (a percentage of gross can never breach a margin), or when the banner is an OpenRTB DSP
> creative — those clear their own `bidfloor` inside the auction. A publisher price of **0** is
> a real price, not a missing one, so free inventory is still covered: with nothing paid out the
> whole advertiser CPM is margin, and an `Absolute` requirement becomes a plain "the advertiser
> must pay at least this much" floor.

> **Corner case — unpriced banners fail every positive margin requirement.** A banner whose
> campaign (and own) Pricing card is off earns the network nothing, which is treated identically
> to a CPM price of 0, so it stops serving on a placement with a margin requirement. House and
> filler campaigns are the usual casualty. Leave the requirement at `None` on inventory you fill
> that way, or give the house campaign a nominal price above the floor.

> **Note — the fastest way to test a margin change.** The placement's **Banners probability**
> panel applies the same requirement, so a banner that cannot clear it disappears from the panel
> exactly as it disappears from the auction — without waiting for traffic.

## Per-role notes

- **Network manager** — the stock role holds the Pricing card on sites and placements, but not
  *Bid Floor Management*; see [Set a bid floor](#set-a-bid-floor). If the minimum-margin fields
  are absent, ask your network administrator for *Manage Minimum Margin*.
- **Publisher** — no Pricing, Revenue share or Bid floor card on the stock role. A floor is set
  by the network.
- **Can View share** — the Pricing card is a plain read-only grid; changes need **Can Edit** or
  **Is Owner**.

Exact grants: see [User roles](https://epom.com/ad-server/docs/guides/admin/users-and-roles.md).

## Related

- [Configure pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md)
- [Pricing precedence: which price is charged and paid](https://epom.com/ad-server/docs/guides/delivery/pricing-precedence.md)
- [Pricing over the REST API and MCP](https://epom.com/ad-server/docs/guides/delivery/pricing-over-the-api.md)
- [Site CPM threshold](https://epom.com/ad-server/docs/guides/delivery/cpm-threshold.md)
- [Price adjustment rules](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md)
- [Placements](https://epom.com/ad-server/docs/guides/inventory/placements-create.md)
- [Delivery controls overview](https://epom.com/ad-server/docs/guides/delivery.md)