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

# Selling terms & rate cards

> Lightly structured seller pricing facts — anchors, floors, and ceilings extracted from your rate card — that steer how the Merchandising Agent prices products at discovery.

## Overview

**Selling terms** are the pricing facts your storefront gives the
[Merchandising Agent](/v2/concepts/merchandising-agent) so it prices products the
way you would. Instead of a static rate card returned to every buyer, you hand
over the *anchors* — "rich media runs around a \$30 CPM", "never quote CTV below
\$22", "holiday inventory carries a premium" — and the agent applies them as it
composes a proposal for the buyer in front of it.

A pricing fact is deliberately **lightly structured**: a short label, a
natural-language condition describing when it applies, and a price anchor (target,
floor, and/or ceiling). It is reasoning context for the agent, not a rigid product
template. This is where the numbers from your rate card, media kit, or a setup-call
conversation live.

<Note>
  These are **your** product-pricing facts, separate from any Scope3 contract rate
  card. They price the inventory you sell through your storefront.
</Note>

## What a rate card holds

The portable **Selling Terms** Page lets you review and edit the complete ruleset
and your creative/media-buy approval settings in any MCP Apps host. The same
configuration is available through the storefront's `compositionPricing` field —
a `StorefrontCompositionPricing` object:

| Field               | Type                    | Description                                                                                                                                                            |
| ------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `rateCard.currency` | ISO 4217 string         | Default currency for the facts below (e.g. `USD`)                                                                                                                      |
| `rateCard.facts`    | array                   | Up to 500 pricing facts (below)                                                                                                                                        |
| `targetPercentile`  | `p50` \| `p75` \| `p90` | **Deprecated.** Historical clearing percentile, retained for explainability only — it no longer sets prices. Pricing is value-led, bounded by your floors and ceilings |

Each **pricing fact** (`StorefrontPricingFact`):

| Field                  | Type                                    | Description                                                                                                                    |
| ---------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `id`                   | string                                  | Stable operator-facing id. Preserved across rewrites when the fact means the same thing                                        |
| `label`                | string                                  | Short display label (e.g. "Rich media packages")                                                                               |
| `appliesWhen`          | string                                  | Natural-language condition. Intentionally not a rigid template — the agent uses it as reasoning context                        |
| `pricing.targetPrice`  | number                                  | The price you'd like to land at                                                                                                |
| `pricing.floorPrice`   | number                                  | The lowest you'll quote. A quote is never composed below it                                                                    |
| `pricing.ceilingPrice` | number                                  | The most you'd quote (must be ≥ `floorPrice`)                                                                                  |
| `strength`             | `hard_floor` \| `default` \| `guidance` | `hard_floor` is a must-not-go-below constraint; `default` is the preferred pricing anchor; `guidance` is advisory context only |
| `hints`                | object                                  | Optional structured hints for deterministic matching. Missing hints are fine                                                   |
| `provenance`           | string                                  | Where the fact came from (e.g. "Uploaded 2026 rate card, page 3")                                                              |
| `notes`                | string                                  | Rationale or caveats for operators and Murph                                                                                   |

Every fact must carry at least one of `targetPrice` or `floorPrice`.

## Where you set it

* **In chat with Murph** — the fastest path. Ask Murph to set your rate card or
  update pricing terms; `get_selling_terms` opens the portable editor. You can
  finish the change there, or Murph can apply an exact confirmed replacement
  through `write_pricing_rules` and exact approval changes through
  `set_approval_settings`.
* **Any MCP Apps client** — call `get_selling_terms` to open the same editor in
  Claude, ChatGPT, or another compatible host.
* **REST** — `PUT /api/v2/storefront` with a `compositionPricing` object. The full
  nested structure is returned on `GET /api/v2/storefront`.

## How pricing reaches discovery

When a buyer discovers products, the Merchandising Agent reads your pricing facts,
matches them against the brief, and anchors each composed product's price
accordingly. The price surfaces on the discovered product as:

* `cpm` — the quoted price, in the pricing scope's currency.
* `currency` — ISO 4217, inherited from your `rateCard.currency` unless the buyer's
  currency requires conversion.
* `pricingScope` — `public` (your open rate-card price) or `account` (a
  buyer-specific price, e.g. after a [house discount](/v2/storefront/house-discounts/overview)).

Two guardrails always hold:

* **The wholesale floor wins.** Every quote is floored at the storefront's
  wholesale cost. A pricing fact can raise or shape a price, but the agent never
  composes a quote below cost.
* **Buyer currency must be accepted.** Discovery only returns priced products in a
  currency on the storefront's accepted list; otherwise no products are returned
  (see [cross-currency](/v2/concepts/cross-currency)).

## Selling terms vs. discounts

Selling terms set your **base** pricing — what any buyer sees. To give a
*specific* buyer a better price, layer a discount on top:

<CardGroup cols={2}>
  <Card title="House discounts" href="/v2/storefront/house-discounts/overview" icon="sitemap">
    Structured rate-card discounts keyed to a buyer's brand or operator.
  </Card>

  <Card title="Buyer instructions" href="/v2/storefront/buyer-instructions/overview" icon="user-pen">
    Freeform per-buyer terms, notes, and operator-and-brand intersections.
  </Card>
</CardGroup>

## Related

<CardGroup cols={2}>
  <Card title="Merchandising agent" href="/v2/concepts/merchandising-agent" icon="wand-magic-sparkles">
    How the agent turns what you have into a priced proposal.
  </Card>

  <Card title="Operating instructions" href="/v2/storefront/operating-instructions/overview" icon="list-ol">
    The rules the agent follows when composing products.
  </Card>
</CardGroup>
