# Offers and pricing

URL: /products/selling/offers-and-pricing · Id: `page:products/selling/offers-and-pricing`

> How a Product becomes Offers with Prices, what a $0 Offer grants, and how Prices change and get tested without misleading a buyer.

An [Offer](/business/nouns/offer) is a [Product](/business/nouns/product), under a [Brand](/business/nouns/brand), at a [Price](/business/nouns/price), on terms, made by a [Startup](/business/nouns/startup). The Product says what a [Customer](/business/nouns/customer) gets; the Offer says what it costs and on which conditions.

## One Product, many Offers
A Product carries a promise. An Offer makes it commercially specific: a Price, the terms, the [Entitlements](/business/nouns/entitlement) acceptance grants, and the [Motion](/business/nouns/motion) it sells in. Buyers differ in volume, in risk, and in how they pay, so one Product usually needs several Offers.

shipnote.dev turns a repository's merged changes into release notes. It has one Product and four Offers.

| Offer | Price | Grants |
| --- | --- | --- |
| `free` | $0 | 50 notes a month, one repository |
| `per-note` | $0.05 per note | any volume, billed monthly |
| `team` | $39 a month | 2,000 notes, ten repositories, shared keys |
| `enterprise` | by [Quote](/business/nouns/quote) | committed volume, an annual invoice, a signed [Agreement](/business/nouns/agreement) |

How an Offer is priced never changes what its Product is. An [Agent](/business/nouns/agent) priced per run is still [Software](/business/nouns/software). A result warranted under an [Outcome Contract](/business/nouns/outcome-contract) makes the Product a [Service](/business/nouns/service), whatever the Price looks like.

## The shape of a Price
A Price is the amount, currency, unit, and tiers of an Offer, embedded in it. The unit names what is counted: a call, a note, a seat, a month, an accepted outcome. Tiers change the amount as the count grows, either for every unit or only for the units inside each band.

The best unit is the one the Customer already counts. A contract-review Agent prices per contract, not per token, because a contract is what its buyer budgets for. The founding [Hypothesis](/business/nouns/hypothesis) anchors the amount against what the buyer pays today.

A usage Price reads from a [Meter](/business/nouns/meter), which turns usage [Events](/business/nouns/event) into [Entries](/business/nouns/entry) exactly once. A retried call never bills twice. Zero is a Price, and it follows every rule any other Price follows.

## The $0 Offer
A $0 Offer is an Offer like any other. Accepting it makes a Customer, records [Consent](/business/nouns/consent) where the Offer asks for it, and grants Entitlements bounded by a [Limit](/business/nouns/limit). shipnote.dev's `free` Offer grants 50 notes a month.

A call outside the caller's Entitlements gets a [402 reply](/code/api/errors/payment-required) that names the Offer covering the call and its Price. A person sees that Offer on the pricing page. An Agent accepts it through the API and retries the same call, with no signup and no human in between.

## Acceptance and Entitlements
The [accept](/business/nouns/offer/accept) [Verb](/business/nouns/verb) records that a party takes an Offer, and the party becomes a Customer. Acceptance pins the Offer's current [Version](/business/nouns/version). A one-time Offer becomes an [Order](/business/nouns/order); a recurring Offer becomes a [Subscription](/business/nouns/subscription).

An Entitlement is what the Customer gets: a Verb on a [Noun](/business/nouns/noun) in its [Tenant](/business/nouns/tenant), optionally bounded by a Limit. A [Permission](/business/nouns/permission) has the same shape but comes from a [Role](/business/nouns/role). Buying the `team` Offer lets a Customer generate notes; its own Roles decide which of its people may call the API.

Every [Interface](/business/nouns/interface) accepts an Offer the same way:

**Ask**

```text
Accept the offer “Grain-free kibble, 12 lb”.
```

**API**

```bash
curl -X POST https://api.sb/petpantry.shop/offers/offer_1/accept \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"party":"Lena Fischer"}'
```

```json
{
  "api": "https://api.sb/petpantry.shop",
  "customer": {
    "$id": "https://api.sb/petpantry.shop/customers/customer_1",
    "$type": "Customer",
    "since": "2026-10-22T12:00:00Z"
  },
  "offer": {
    "$id": "https://api.sb/petpantry.shop/offers/offer_1",
    "$type": "Offer",
    "price": {
      "amount": 54,
      "currency": "USD"
    }
  },
  "action": {
    "$id": "https://api.sb/petpantry.shop/actions/action_1",
    "operation": "Offer.accept",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/petpantry.shop/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const { customer, offer } = await $.Offer.accept({ offer: 'offer_1', party: 'Lena Fischer' })
```

**CLI**

```bash
npx startup-builder do Offer.accept --json '{"offer":"offer_1","party":"Lena Fischer"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Offer.accept({ offer: 'offer_1', party: 'Lena Fischer' })"
  }
}
```

## Changing a Price
A new Price applies to new buyers only. Existing Customers keep the Version they accepted until they switch. The [withdraw](/business/nouns/offer/withdraw) Verb closes an Offer to new Customers, and every Order and Subscription on it stays in force.

Copy, pages, and packaging run as [Experiments](/business/nouns/experiment): variants against a Hypothesis and one [Metric](/business/nouns/metric), with the threshold fixed before the start. Price is the exception. Two people never see two Prices for the same Offer in the same market.

A Price is tested another way: a sibling Offer at the new Price, a second market, or a switchback. In a switchback, every buyer sees one Price this week and the other Price next week. The [Pricing](/workflows/processes/pricing) [Process](/business/nouns/process) runs each test and records the winner as a [Decision](/business/nouns/decision).

The cheapest pricing evidence comes before delivery. A [reserve](/products/selling/reserve) page at the real Price counts who pays a deposit. A deposit is a commitment; a compliment on a call is an opinion.

## Who the Offer is for
The Motion of an Offer records who buys and who acts. In b2a2b, a business is the Customer and an Agent calls the API for it. The Offer names both, so terms, Limits, and receipts reach the party that owes the money.

An Offer can also sell another party's Product. It then names the merchant of record and whether the Startup earns as principal or as agent. One checkout never hides who holds the promise.

## Next
- [Earning models](/products/selling/earning-models): how accepted Offers turn into revenue.
- [Selling to agents](/products/selling/selling-to-agents): the 402 reply, quotes, and Agent buyers in depth.
- [Selling](/systems/sales/selling): carrying a buyer to acceptance.