# Find out if anyone wants this

URL: /start/guides/find-out-if-anyone-wants-this · Id: `guide:find-out-if-anyone-wants-this`

> Say "find out if anyone wants this" and get a reserve page that takes refundable deposits against a bar you set before it goes live.

Ask for money before you build anything. A refundable deposit shows who switches, and a signup only shows who was polite.

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: “Ask the people who put down a deposit, or only new ones?”
- First question at Live: “Which feature is the waitlist for?”
- What it costs: The card fee on each deposit.
- To undo it: Withdraw the Offer and refund every deposit. The answers stay.

## What you get
- 1 reserve page: the problem in your buyer’s words, the price and the ship date (Site)
- 1 bar set before it goes live: deposits, people reached, and a date (Hypothesis)
- 1 refundable $29 deposit that pays the first month at ship (Offer)
- 3 questions after each deposit: what they use today, the hardest part, what it is worth (Survey)
- 1 Customer per reserver, refunded on request or if it misses the date (Customer)
- 1 Evidence per deposit and answer, filed on the Problem it names (Evidence)

### Reading the result
Set the bar before the page goes live: how many deposits, from how many people reached, by what date. Nobody moves it after the first visitor arrives.

Only outside buyers count. A deposit from you, a cofounder or another [Startup](/business/nouns/startup) you own is recorded and left out of the count.

Clear the bar and you build: deposits are the [Evidence](/business/nouns/evidence) that opens [Building](/business/lifecycle/states/building). Miss it and every reserver gets a full refund, and the [Decision](/business/nouns/decision) records what you learned.

## Your agent does
**For agents**

- Guide: `guide:find-out-if-anyone-wants-this`, status `live`. Page: [/start/guides/find-out-if-anyone-wants-this.md](/start/guides/find-out-if-anyone-wants-this.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 | [`Hypothesis.create`](/business/nouns/hypothesis/create) (`verb:Hypothesis.create`) | `statement` text, required: example `"Property managers with up to 200 units put down $29 to stop missing lease renewals."`; `kind` string, required: example `"switch"`; `threshold` string: example `"10 deposits from outside buyers, out of 300 people reached, within 14 days of going live"` | `hypothesis` Hypothesis |
| 2 | [`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 |
| 3 | [`Offer.publish`](/business/nouns/offer/publish) (`verb:Offer.publish`) | `offer` Offer (an id), required: the `$id` step 2 returns | `offer` Offer |
| 4 | [`Survey.create`](/business/nouns/survey/create) (`verb:Survey.create`) | `fields` json, required: example `[{"name":"today","label":"What do you use for this today?"},{"name":"hardest","label":"What is the hardest part?"},{"name":"worth","label":"What would fixing it be worth to you each month?"}]` | `survey` Survey |
| 5 | [`Site.publish`](/business/nouns/site/publish) (`verb:Site.publish`) | `site` Site (an id), required: the `$id` of the first Site `Site.list` returns | `site` Site |

Returns: the last call answers with `site` 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",
  "site": {
    "$id": "https://api.sb/leaseline.app/sites/site_1",
    "$type": "Site"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Site.publish",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/action_1"
  }
}
```

Next: offer “Make the deposit $49”, or “Give it 30 days instead of 14”.

Calls: `Hypothesis.create` → `Offer.create` → `Offer.publish` → `Survey.create` → `Site.publish`

Ask:

```text
Find out if anyone wants this.
Validate this idea.
Test demand before I build anything.
```

API:

```bash
# 1. Hypothesis.create
curl -X POST https://api.sb/leaseline.app/hypotheses \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"statement":"Property managers with up to 200 units put down $29 to stop missing lease renewals.","kind":"switch","threshold":"10 deposits from outside buyers, out of 300 people reached, within 14 days of going live"}'

# 2. 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')

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

# 4. Survey.create
curl -X POST https://api.sb/leaseline.app/surveys \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fields":[{"name":"today","label":"What do you use for this today?"},{"name":"hardest","label":"What is the hardest part?"},{"name":"worth","label":"What would fixing it be worth to you each month?"}]}'

# Look up the Site: Site.list
SITE=$(curl "https://api.sb/leaseline.app/sites?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.sites[0]["$id"] | split("/") | last')

# 5. Site.publish
curl -X POST https://api.sb/leaseline.app/sites/$SITE/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

SDK:

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

await $.Hypothesis.create({ statement: 'Property managers with up to 200 units put down $29 to stop missing lease renewals.', kind: 'switch', threshold: '10 deposits from outside buyers, out of 300 people reached, within 14 days of going live' })
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 })
await $.Survey.create({ fields: [{ name: 'today', label: 'What do you use for this today?' }, { name: 'hardest', label: 'What is the hardest part?' }, { name: 'worth', label: 'What would fixing it be worth to you each month?' }] })
const [site] = await $.Site.list({ limit: 1 })
await $.Site.publish({ site: site.$id })
```

CLI:

```bash
npx startup-builder do Hypothesis.create --json '{"statement":"Property managers with up to 200 units put down $29 to stop missing lease renewals.","kind":"switch","threshold":"10 deposits from outside buyers, out of 300 people reached, within 14 days of going live"}'
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"'"}'
npx startup-builder do Survey.create --json '{"fields":[{"name":"today","label":"What do you use for this today?"},{"name":"hardest","label":"What is the hardest part?"},{"name":"worth","label":"What would fixing it be worth to you each month?"}]}'
SITE=$(npx startup-builder do Site.list --json '{"limit":1}' | jq -r '.sites[0]["$id"] | split("/") | last')
npx startup-builder do Site.publish --json '{"site":"'"$SITE"'"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "await $.Hypothesis.create({ statement: 'Property managers with up to 200 units put down $29 to stop missing lease renewals.', kind: 'switch', threshold: '10 deposits from outside buyers, out of 300 people reached, within 14 days of going live' })\nconst 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.' })\nawait $.Offer.publish({ offer: offer.$id })\nawait $.Survey.create({ fields: [{ name: 'today', label: 'What do you use for this today?' }, { name: 'hardest', label: 'What is the hardest part?' }, { name: 'worth', label: 'What would fixing it be worth to you each month?' }] })\nconst [site] = await $.Site.list({ limit: 1 })\nreturn await $.Site.publish({ site: site.$id })"
  }
}
```

The same sentence does more as the business grows:

| State | Calls | Asks first |
| --- | --- | --- |
| [Idea](/business/lifecycle/states/idea) | [`Hypothesis.create`](/business/nouns/hypothesis/create), [`Offer.create`](/business/nouns/offer/create), [`Offer.publish`](/business/nouns/offer/publish), [`Survey.create`](/business/nouns/survey/create), [`Site.publish`](/business/nouns/site/publish) | How many deposits, from how many people reached, by what date? |
| [Building](/business/lifecycle/states/building) | [`Survey.create`](/business/nouns/survey/create), [`Site.publish`](/business/nouns/site/publish) | Ask the people who put down a deposit, or only new ones? |
| [Live](/business/lifecycle/states/live) | [`Waitlist.create`](/business/nouns/waitlist/create), [`Site.publish`](/business/nouns/site/publish) | Which feature is the waitlist for? |

## Change it
- Make the deposit $49.
- Give it 30 days instead of 14.
- Use a waitlist with no deposit instead.
- Show me what people are asking for.

## Under the hood
- Systems: [Sites](/products/site/sites), [Billing](/systems/billing), [Surveys](/systems/surveys), [Discovery](/business/discovery)
- Nouns: [Hypothesis](/business/nouns/hypothesis), [Offer](/business/nouns/offer), [Order](/business/nouns/order), [Survey](/business/nouns/survey), [Evidence](/business/nouns/evidence), [Problem](/business/nouns/problem)
- Events: [`Site.published`](/business/events/Site.published), [`Offer.published`](/business/events/Offer.published), [`Offer.accepted`](/business/events/Offer.accepted)
- Stripe objects: `Checkout Session`, `PaymentIntent`, `Refund`

The bar is a [Hypothesis](/business/nouns/hypothesis) with its threshold.

Each deposit accepts the [Offer](/business/nouns/offer) and places an [Order](/business/nouns/order) that ships later. Each answer becomes Evidence on the [Problem](/business/nouns/problem) it describes.

[Reserve](/products/selling/reserve) explains the terms that keep a deposit honest, and [take a deposit](/start/guides/take-a-deposit) runs the deposit on its own.