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

# Playbook pricing & selling guidance

> 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

<Note>
  **Retirement notice.** Structured pricing and packaging rules have moved:
  examples and materials to the [Library](/v2/storefront/library), prices to
  [rate cards](/v2/setup/seller-pages#rate-cards--how-you-price), policy to [AI
  Business Rules](/v2/setup/seller-pages#business-rules--what-you-accept).
</Note>

**Playbook pricing** is the set of pricing facts your Seller Account gives the
[Merchandising Agent](/v2/concepts/storefront-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 Apostra contract rate
  card. They price the inventory you sell through your Seller Account.
</Note>

## What the Playbook needs from you

Give the Merchandising Agent the durable inputs it needs to pitch your
inventory consistently. Start with the required inputs, then add the
recommended evidence that makes its proposals more specific.

### Required

* **Business rules — what you accept.** Your acceptance policy tells the agent
  which briefs and buyers are on policy, so it can decline demand that does not
  fit your business.
* **Rate card / pricing anchors — how you price.** Floors, targets, ceilings,
  and the conditions that apply to them give the agent a defensible price for
  each discovery response.

### Recommended

* **Media kit — how you're represented.** Your listing and business profile
  give the agent the seller facts it needs to represent your inventory clearly.
* **Selling guidance — how you package and select.** Versioned Playbook
  guidance tells the agent how to name, package, and choose products for a
  brief.
* **Past proposals and sales decks — what wins.** Product Marketing material
  gives the agent examples of your proven positioning and proposal language.

Each input sharpens how the agent responds to a buyer brief; you can add or
update it over time as your inventory and sales strategy change.

<Note>
  This legacy Playbook Page is retired. Its retirement page directs every seller
  to the Library, rate cards, and AI Business Rules.
</Note>

## What a rate card holds

The portable **Playbook** Page lets you review and edit structured pricing
alongside versioned selling guidance in any MCP Apps host. The same
configuration is available through the legacy v2 Seller Account API, in its
`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                                                                                |
| `hints.formatDimensions` | `{ width, height }[]`                   | Creative sizes this fact applies to. A pair matches when a selected canonical option equals it, lists it in `sizes[]`, or includes it within min/max bounds |
| `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`.

For a size-specific rate-card line, set `hints.formatDimensions` rather than
relying on words in the label. For example, a 300×250 fact uses
`"formatDimensions": [{ "width": 300, "height": 250 }]`. When one composed
product selects several sizes, every fact whose dimensions are selected can
apply; the highest applicable floor and target govern the product's single
price. A fact scoped to an unselected size does not affect the price or its
provenance.

For compatibility, an unhinted fact can still match when its full normalized
label appears in a bundle name. Individual bundle-name words are not used for
fallback matching, which prevents seller identity from activating an unrelated
fact.

## Where you set it

* **In chat with Murph** — the fastest path. Ask Murph to set your rate card or
  update pricing terms; `get_playbook` opens the portable editor. You can
  finish the change there, or Murph can apply an exact confirmed replacement
  through `write_pricing_rules`.
* **Any MCP Apps client** — call `get_playbook` 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`.
* **On `/mcp/v3`** (preview) — `save_playbook` writes pricing, the
  versioned selling guidance, and the brand/operator
  [house discounts](/v2/storefront/house-discounts/overview) that come off
  those prices, because the Playbook is the one noun that owns how you sell.
  See [Seller pages](/v2/setup/seller-pages).

## 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 Seller Account'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 Seller Account's accepted list; otherwise no products are returned
  (see [cross-currency](/v2/concepts/cross-currency)).

## Playbook pricing vs. discounts

Playbook pricing sets 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="Prepare inventory source inputs" href="/v2/setup/publisher-onboarding-starter-kit" icon="clipboard-check">
    Collect rate-card provenance alongside the rest of the publisher evidence pack.
  </Card>

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

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