# Take a deposit

URL: /start/guides/take-a-deposit · Id: `guide:take-a-deposit`

> Say "take a refundable deposit" and get a reserve page checkout that holds each deposit until you ship, then counts it as the first payment.

Take a refundable deposit on what you sell before it exists. Each deposit holds a place in line, and at ship it pays the first month.

Needs: [Startup](/business/nouns/startup)

**Before real money moves**

- Who says yes: You. Your agent shows you the run and waits for your [Approval](/business/nouns/approval).
- You leave the chat: Once, at Stripe: to confirm who you are and add the bank account payouts land in.
- First question at Idea: “How many deposits, from how many people reached, by what date?”
- First question at Building: “Should the deposit pay the first month, or the whole first order?”
- What it costs: The card fee on each deposit.
- To undo it: Withdraw the Offer, and refund every deposit from its Order.

## What you get
- 1 Offer with a refundable $29 deposit that pays the first month (Offer)
- 1 checkout on your reserve page, card and wallets (Stripe's Checkout Session)
- 1 Order per reserver, held until it ships (Order)
- 1 Customer per reserver, first in line at ship (Customer)
- 1 refund to every reserver if it misses the ship date (Order)
- 1 Evidence per deposit, graded as commitment (Evidence)

Every deposit comes with four promises the reserve page states:

| Promise | What happens |
| --- | --- |
| Refund on request | In full, any time before the ship date |
| Refund on a miss | Automatic, to every reserver, if it does not ship by the date |
| Conversion | At ship, the deposit pays the first invoice or the first order |
| Disclosure | The page says the product is not built and names the ship date |

## Your agent does
**For agents**

- Guide: `guide:take-a-deposit`, status `live`. Page: [/start/guides/take-a-deposit.md](/start/guides/take-a-deposit.md).
- Approval: ask the founder first. Show the run, then wait for their Approval; a refusal ends it.
- Leaves the chat: Once, at Stripe: to confirm who you are and add the bank account payouts land in.
- Needs first: [Startup](/business/nouns/startup).
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Offer.create`](/business/nouns/offer/create) (`verb:Offer.create`) | `price` money, required: example `{"amount":29,"currency":"USD"}`; `terms` text: example `"Refundable deposit. Refunded in full on request before Leaseline ships, and to everyone if it misses its ship date. At ship it pays the first month."`; `interval` string: example `"once"` | `offer` Offer |
| 2 | [`Offer.publish`](/business/nouns/offer/publish) (`verb:Offer.publish`) | `offer` Offer (an id), required: the `$id` step 1 returns | `offer` Offer |

Returns: the last call answers with `offer` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "offer": {
    "$id": "https://api.sb/leaseline.app/offers/offer_1",
    "$type": "Offer",
    "price": {
      "amount": 29,
      "currency": "USD"
    },
    "interval": "once",
    "terms": "Refundable deposit. Refunded in full on request before Leaseline ships, and to everyone if it misses its ship date. At ship it pays the first month."
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Offer.publish",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/action_1"
  }
}
```

Next: offer “Make it $49”, or “Make the deposit the whole first year”.

Calls: `Offer.create` → `Offer.publish`

Ask:

```text
Take a deposit.
Take a refundable deposit.
Take a $50 deposit.
```

API:

```bash
# 1. Offer.create
OFFER=$(curl -X POST https://api.sb/leaseline.app/offers \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price":{"amount":29,"currency":"USD"},"interval":"once","terms":"Refundable deposit. Refunded in full on request before Leaseline ships, and to everyone if it misses its ship date. At ship it pays the first month."}' | jq -r '.offer["$id"] | split("/") | last')

# 2. Offer.publish
curl -X POST https://api.sb/leaseline.app/offers/$OFFER/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

SDK:

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

const offer = await $.Offer.create({ price: { amount: 29, currency: 'USD' }, interval: 'once', terms: 'Refundable deposit. Refunded in full on request before Leaseline ships, and to everyone if it misses its ship date. At ship it pays the first month.' })
await $.Offer.publish({ offer: offer.$id })
```

CLI:

```bash
OFFER=$(npx startup-builder do Offer.create --json '{"price":{"amount":29,"currency":"USD"},"interval":"once","terms":"Refundable deposit. Refunded in full on request before Leaseline ships, and to everyone if it misses its ship date. At ship it pays the first month."}' | jq -r '.offer["$id"] | split("/") | last')
npx startup-builder do Offer.publish --json '{"offer":"'"$OFFER"'"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "const offer = await $.Offer.create({ price: { amount: 29, currency: 'USD' }, interval: 'once', terms: 'Refundable deposit. Refunded in full on request before Leaseline ships, and to everyone if it misses its ship date. At ship it pays the first month.' })\nreturn await $.Offer.publish({ offer: offer.$id })"
  }
}
```

| State | Calls | Asks first |
| --- | --- | --- |
| [Idea](/business/lifecycle/states/idea) | [`Offer.create`](/business/nouns/offer/create), [`Offer.publish`](/business/nouns/offer/publish) | How many deposits, from how many people reached, by what date? |
| [Building](/business/lifecycle/states/building) | [`Offer.create`](/business/nouns/offer/create), [`Offer.publish`](/business/nouns/offer/publish) | Should the deposit pay the first month, or the whole first order? |

## Change it
- Make it $49.
- Make the deposit the whole first year.
- Refund everyone and close it.
- Find out if anyone wants this.

## Under the hood
- Systems: [Billing](/systems/billing), [Ledger](/systems/ledger), [Discovery](/business/discovery)
- Nouns: [Offer](/business/nouns/offer), [Order](/business/nouns/order), [Customer](/business/nouns/customer), [Evidence](/business/nouns/evidence)
- Events: [`Offer.published`](/business/events/Offer.published), [`Offer.accepted`](/business/events/Offer.accepted), [`Order.placed`](/business/events/Order.placed), [`Order.refunded`](/business/events/Order.refunded)
- Stripe objects: `Product`, `Price`, `Checkout Session`, `PaymentIntent`, `Refund`

A deposit accepts the [Offer](/business/nouns/offer) through [`Offer.accept`](/business/nouns/offer/accept), which records the reserver as a [Customer](/business/nouns/customer) and places an [Order](/business/nouns/order) that ships later. The deposit is that Order's first payment, collected on the [Startup](/business/nouns/startup)'s own Stripe account. To test whether anyone wants the product, with a bar set first, [find out if anyone wants this](/start/guides/find-out-if-anyone-wants-this).