# Offers

URL: /code/file-conventions/offers · Id: `page:code/file-conventions/offers`

> A file in offers/ defines one Offer, a Product at a Price on terms, and publishes it to checkout, the site and agents.

A file in `offers/` defines one [Offer](/business/nouns/offer): a [Product](/business/nouns/product) at a [Price](/business/nouns/price), on terms. It implements [Offers](/products/offers) and [pricing](/products/pricing).

```text
offers/
├── pro.mdx     $29 a month
└── pro-annual.mdx      $290 a year
```

## Reference
MDX, frontmatter only. The frontmatter is the [`Offer.create`](/business/nouns/offer/create) input, key for key, so a file and an API call make the same Offer. Stripe Price ids are observed and never written here.

| Key | Type | Holds |
| --- | --- | --- |
| `price` | `{ amount, currency }` | What it charges each interval. Required |
| `interval` | `once`, `day`, `week`, `month` or `year` | How often it bills. `once` is a one-time charge; anything else is a [Subscription](/business/nouns/subscription) |
| `terms` | text | What the buyer accepts, refund rights included |
| `trial` | `{ days, card }` | A free trial before the first charge; `card: true` takes a card up front |
| `seats` | `manual` or `members` | For a per-seat Price: who sets the quantity |
| `atBound` | `stop`, `overage` or `upgrade` | What a call past an [Entitlement](/business/nouns/entitlement)'s [Limit](/business/nouns/limit) gets |
| `credit` | `{ amount, currency }` | Prepaid credit each purchase issues |
| `availableFrom`, `availableUntil` | datetime | When it can first and last be bought |
| `privateTo` | [Party](/business/nouns/party) id | The one buyer who may accept it; no pricing page lists it |

What a buyer may call is granted with [`Offer.grant`](/business/nouns/offer/grant), one Entitlement at a time: see [how to lock a feature to a plan](/products/offers/lock-a-feature-to-a-plan).

## Examples
### Minimal
```mdx title="offers/pro.mdx"
---
price: { amount: 29, currency: USD }
interval: month
---
```

### Leaseline
```mdx title="offers/pro.mdx"
---
price: { amount: 29, currency: USD }
interval: month
terms: Monthly, billed in advance. Cancel any time from the billing portal.
trial: { days: 14, card: true }
atBound: upgrade
---
```

## What it builds
The [SalesBuilder](/code/builders/sales) compiles the file into `Offer.create` and publishes it with `Offer.publish`.

- an `Offer` and its `Price`
- a Product and a Price on Stripe
- checkout on the [Startup](/business/nouns/startup)'s [Domain](/business/nouns/domain), a payment link and an MCP buy tool
- the pricing section every [Site](/business/nouns/site) reads
- the [Event](/business/nouns/event) `Offer.published`, then `Offer.subscribed` for each buyer

## Routing
Checkout serves at `/checkout/pro` on every Site. `POST /leaseline.app/offers/{offer}/subscribe` subscribes through the API.

## Good to know
- A published Offer is a [Version](/business/nouns/version). An [Order](/business/nouns/order) keeps the Version it bought, so a [Price change](/workflows/processes/pricing/price-change) never reaches a past buyer.
- The founder's form of this file is the guide [charge monthly](/systems/finance/charge-monthly).