URL: /code/files/offers · Id: `page:/code/files/offers`

# The offers/ folder: one file and what it compiles to

> What one offers/ file holds, what each key compiles to, and the checks that read it.

One `offers/` file is one [Offer](https://startupbuilder.dev/business/nouns/offer): its [Price](https://startupbuilder.dev/business/nouns/price), its trial, its checkout and how it is sold. SalesBuilder compiles it, and `show` traces every key.

```mdx title="offers/pro.mdx"
---
price: { amount: 29, currency: USD, per: month }
limit: { units: 200 }
trial: 14d
checkout: self-serve
sale: self-serve
---
Renewal tracking for up to 200 units.
```

```text title="show"
$ npx startup-builder show offers/pro.mdx
price     { amount: 29, currency: USD, per: month }  offers/pro.mdx:2
limit     { units: 200 }                             offers/pro.mdx:3
trial     14d                                        offers/pro.mdx:4
checkout  self-serve                                 offers/pro.mdx:5
sale      self-serve                                 offers/pro.mdx:6
owner     SalesBuilder
```

```text title="leaseline.app"
leaseline.app/
├── plays/
│   ├── cold-email.mdx
│   ├── warm-intros.mdx
│   ├── signup-interviews.mdx
│   ├── lead-reactivation.mdx
│   └── events-and-webinars.mdx
├── audiences/
│   ├── small-property-managers.mdx
│   ├── lapsed-leads.mdx
│   └── renewal-season.mdx
├── sequences/
│   └── cold-email-thread-founder.mdx
├── funnels/
│   └── signup.mdx
├── workflows/
│   └── outbound.mdx
├── agents/
│   ├── sales/prospector.mdx
│   └── marketing/content-lead.mdx
├── systems/
│   └── sequences.mdx
├── domains/
│   └── leaseline.app.mdx
├── offers/   ← this folder
│   ├── pro.mdx
│   └── team.mdx
├── content/
│   └── webinars/60-day-notices.mdx
├── metrics/
│   ├── q4.mdx
│   └── positive-reply-rate.mdx
└── startups.lock
```

## The file
| Key | On the page | Compiles to | Checked by |
| --- | --- | --- | --- |
| `price` | Price | the Offer’s Price, published by <Op verb="Offer.publish" /> | [S8](/code/checks#s8) |
| `limit` | Limit | the Offer’s Limit: what an upgrade Play reads | — |
| `trial` | Trial | <Op verb="Offer.trial" /> for the days given | — |
| `checkout` | Checkout | where the buyer pays: `self-serve` ends at <Op verb="Order.place" /> | — |
| `sale` | How it’s sold | who carries the buyer to yes: `self-serve`, `sales-assisted` (<Op verb="Meeting.book" />, <Op verb="Quote.send" />, <Op verb="Deal.win" />) or `enterprise` | — |

## Checks
| Check | It holds | What dev prints |
| --- | --- | --- |
| [S8](/code/checks#s8) | An Experiment that varies an Offer’s Price assigns by market or by time. | `experiments/pro-price.mdx:3  S8  varies: offers/pro.mdx price, assigned by contact. Assign by market or by time.` |

## Refusals
| Code | Fix, then the call that clears it |
| --- | --- |
| [`activation-event`](/code/refusals#check-activation-event) | Declare the Offer’s activation Event before the first ask, then publish it. Then <Op verb="Offer.publish" />. |
| [`bar-cap`](/code/refusals#check-bar-cap) | Set the bar at the 15th percentile of your own first months. Then <Op verb="Offer.publish" />. |
| [`cluster`](/code/refusals#check-cluster) | Offer the plain trial; the account keeps every other term. Then <Op verb="Offer.trial" />. |
| [`contribution-floor`](/code/refusals#check-contribution-floor) | Raise the Price or lower the cost until the margin clears its target, then publish again. Then <Op verb="Offer.publish" />. |
| [`limit-on-offer`](/code/refusals#check-limit-on-offer) | Add a Limit to the Offer, then publish it. Then <Op verb="Offer.publish" />. |
| [`no-reset`](/code/refusals#check-no-reset) | Keep the close time written at the post’s publish time. Then <Op verb="Offer.publish" />. |
| [`outcome-event`](/code/refusals#check-outcome-event) | Declare the Offer’s delivered-outcome Event, then publish it. Then <Op verb="Offer.publish" />. |
| [`price`](/code/refusals#check-price) | Get the discount approved, or quote at the floor. Then <Op verb="Approval.approve" />. |
| [`price-split-by-buyer`](/code/refusals#check-price-split-by-buyer) | Assign the Price test by market or by time. Then <Op verb="Experiment.start" />. |
| [`price-sync`](/code/refusals#check-price-sync) | Publish the Offer so the price file and Stripe Prices match. Then <Op verb="Offer.publish" />. |
| [`sheet-lock`](/code/refusals#check-sheet-lock) | Publish a new version; it reaches new Customers only. Then <Op verb="Offer.publish" />. |
| [`ship-date`](/code/refusals#check-ship-date) | Set tranche 1 to ship within 90 days of the post. Then <Op verb="Offer.publish" />. |

## Calls

```text title="offers/ compiled · Ask"
Publish the Pro Offer and start a trial, as a dry run.
```

```ts title="offers/ compiled · SDK"
import { $ } from 'startup-builder'

await $.Offer.publish({ offer: 'offer_1' }, { mode: 'try' })   // offers/pro.mdx, $29 a month
return await $.Offer.trial({ offer: 'offer_1', customer: 'customer_1', days: 1 }, { mode: 'try' })
```

```json title="offers/ compiled · Response · sample"
{
  "subscription": {
    "$id": "https://api.sb/leaseline.app/subscriptions/subscription_1",
    "$type": "Subscription",
    "status": "active"
  },
  "offer": {
    "$id": "https://api.sb/leaseline.app/offers/offer_1",
    "$type": "Offer",
    "price": {
      "amount": 29,
      "currency": "USD"
    }
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Offer.trial",
    "status": "done"
  }
}
```

| Call | What it does |
| --- | --- |
| <a id="offer-publish"></a><Op verb="Offer.publish" /> | Publish makes an Offer available for parties to accept. Emits [`Offer.published`](/code/events#offer-published). |
| <a id="offer-trial"></a><Op verb="Offer.trial" /> | Trial starts a Customer on an Offer free for a set number of days, with or without a card, converting or ending by its terms. Emits [`Offer.trialed`](/code/events#offer-trialed). |
| <a id="order-place"></a><Op verb="Order.place" /> | Place commits a Customer to buy an Offer once and records the Offer Version and price at that moment. Emits [`Order.placed`](/code/events#order-placed). |
| <a id="quote-send"></a><Op verb="Quote.send" /> | Send presents a drafted Quote to its buyer and freezes its lines, total and payment terms. Emits [`Quote.sent`](/code/events#quote-sent). |