Skip to content

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

What you get

  • 1reserve page: the problem in your buyer’s words, the price and the ship dateSite
  • 1bar set before it goes live: deposits, people reached, and a dateHypothesis
  • 1refundable $29 deposit that pays the first month at shipOffer
  • 3questions after each deposit: what they use today, the hardest part, what it is worthSurvey
  • 1Customer per reserver, refunded on request or if it misses the dateCustomer
  • 1Evidence per deposit and answer, filed on the Problem it namesEvidence

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 you own is recorded and left out of the count.

Clear the bar and you build: deposits are the Evidence that opens Building. Miss it and every reserver gets a full refund, and the Decision records what you learned.

Your agent does

Hypothesis.create → Offer.create → Offer.publish → Survey.create → Site.publish
You, to your agent

Find out if anyone wants this.

Validate this idea.

Test demand before I build anything.

# 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"
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 })
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"'"}'
{
  "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:

StateCallsAsks first
IdeaHypothesis.create, Offer.create, Offer.publish, Survey.create, Site.publishHow many deposits, from how many people reached, by what date?
BuildingSurvey.create, Site.publishAsk the people who put down a deposit, or only new ones?
LiveWaitlist.create, Site.publishWhich 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, Billing, Surveys, Discovery
Nouns
Hypothesis, Offer, Order, Survey, Evidence, Problem
Events
Site.published, Offer.published, Offer.accepted
Stripe objects
Checkout Session, PaymentIntent, Refund

The bar is a Hypothesis with its threshold.

Each deposit accepts the Offer and places an Order that ships later. Each answer becomes Evidence on the Problem it describes.

Reserve explains the terms that keep a deposit honest, and take a deposit runs the deposit on its own.