Skip to content

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: a Product at a Price, on terms. It implements Offers and pricing.

  • offers/
  • pro.mdx$29 a month
  • pro-annual.mdx$290 a year

Reference

MDX, frontmatter only. The frontmatter is the 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.

KeyTypeHolds
price{ amount, currency }What it charges each interval. Required
intervalonce, day, week, month or yearHow often it bills. once is a one-time charge; anything else is a Subscription
termstextWhat the buyer accepts, refund rights included
trial{ days, card }A free trial before the first charge; card: true takes a card up front
seatsmanual or membersFor a per-seat Price: who sets the quantity
atBoundstop, overage or upgradeWhat a call past an Entitlement's Limit gets
credit{ amount, currency }Prepaid credit each purchase issues
availableFrom, availableUntildatetimeWhen it can first and last be bought
privateToParty idThe one buyer who may accept it; no pricing page lists it

What a buyer may call is granted with Offer.grant, one Entitlement at a time: see how to lock a feature to a plan.

Examples

Minimal

offers/pro.mdx
---
price: { amount: 29, currency: USD }
interval: month
---

Leaseline

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 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's Domain, a payment link and an MCP buy tool
  • the pricing section every Site reads
  • the 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