# Taking a test payment in five minutes

URL: /code/quickstart · Id: `page:code/quickstart`

> Seven commands create a Startup from a template, sell a $29 monthly plan in test, take a test payment, and show what stands before launch.

Everything runs in test until you claim the [Startup](/business/nouns/startup), so no card is charged and no message leaves. You need `node` 20 or later and a terminal, and no Stripe account up front.

```bash
npm create startups
```

## What you build
You build leaseclock.com, a [Solo SaaS](/start/templates/solo-saas) Startup that tracks lease renewal dates for small property managers. It sells one [Offer](/business/nouns/offer), the `pro` plan at $29 a month, and takes its first payment from a sample [Customer](/business/nouns/customer) in test.

## Steps
1. To create the Startup, run `create startups` with a template:

   ```bash
   npm create startups leaseclock.com -- --template solo-saas --yes
   ```

   ```text
   Created Leaseclock in test
     Startup      startup_1
     State        Idea
     Template     Solo SaaS
     Offer        offer_1, Pro at $29 a month, draft
     Claim token  ct_7Hq2xV
   Next: cat leaseclock/startup.ts
   ```

2. To read the Startup as code, print its root file:

   ```bash
   cat leaseclock/startup.ts
   ```

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

   export default Startup({
     name: 'Leaseclock',
     domain: 'leaseclock.com',
     extends: 'solo-saas',
   })
   ```

   Three lines. The [Site](/business/nouns/site), the Offer, the [Roles](/business/nouns/role) and the [Processes](/business/nouns/process) come from the template, and `offers/pro.mdx` holds the price.

3. To put the plan on sale in test, [publish](/business/nouns/offer/publish) the Offer:

   ```bash
   npx startup-builder do Offer.publish --json '{"offer":"offer_1"}'
   ```

   ```text
   Published offer_1 in test
     Price     $29 a month
     Checkout  card, Apple Pay and Google Pay, test cards only
   ```

4. To take a test payment, [subscribe](/business/nouns/offer/subscribe) a sample Customer:

   ```bash
   npx startup-builder do Offer.subscribe --json '{"offer":"offer_1"}'
   ```

   ```text
   Subscribed in test
     Subscription  subscription_1, $29 a month, renews 2026-11-23
     Customer      customer_1, sample, Visa 4242
     Invoice       invoice_1, $29.00, paid
     Ledger        2 entries: cash and deferred revenue
   ```

5. To see what the payment set off, list the latest [Events](/business/nouns/event):

   ```bash
   npx startup-builder show /events --fields 'seq,name,at'
   ```

   ```text
   seq   name                at
   1     Offer.published     2026-10-22T12:00:00Z
   2     Offer.subscribed    2026-10-22T12:00:04Z
   3     Invoice.billed      2026-10-22T12:00:04Z
   4     Invoice.collected   2026-10-22T12:00:05Z
   ```

   Each Event can wake a [Workflow](/business/nouns/workflow). The receipt email went to a seed inbox, because test sends nothing outside.

6. To take real money, [claim](/business/nouns/startup/claim) the Startup with the token from step 1:

   ```bash
   npx startup-builder do Startup.claim --json '{"startup":"startup_1","claimToken":"ct_7Hq2xV"}'
   ```

   ```text
   Claimed Leaseclock
     Owner of record  pending Stripe onboarding
     Finish at        https://connect.stripe.com/setup/s/acct_1Q7Lc
   ```

   Open the link and give Stripe your identity and bank details. The Startup gets a Stripe account of its own, and you become its owner of record.

7. To see what stands between you and [Live](/business/lifecycle/states/live), preview launch with `--try`, which checks and stores nothing:

   ```bash
   npx startup-builder do Startup.launch --json '{"startup":"startup_1"}' --try
   ```

   ```text
   Refused: 2 of 10 checks fail
     fail  Test run passed           no completed test order
     fail  Five slots at Commitment  0 of 5 slots at Commitment
   ```

   The template passed six checks before you typed a word, and steps 3 and 6 passed two more. The test run needs one sample Customer to receive the work, not only pay for it. The slot check needs answers and payments from outside people, which no command fakes.

## Result
leaseclock.com sells a $29 monthly plan, took one test payment end to end, and has a Stripe account in its own name. Every command above was one [Verb](/business/nouns/verb) on [api.sb](/code/platform/api-sb), the same call through the API, SDK, CLI and MCP.

Launch reads 10 checks for `leaseclock.com`, a [Solo SaaS](/start/templates/solo-saas) Startup: the ones every Startup passes. Some templates add more; the [launch checklist](/start/launch-checklist) lists them all.

| Check | Id | Kind | Passes when |
| --- | --- | --- | --- |
| Offers published | `live-offers` | `registry` | At least one Offer is published with a price and terms; launch refuses a Startup without one. |
| Work defined | `live-work` | `registry` | Every published Offer has a workflow that delivers it, with each step assigned to software, an Agent, or a person. |
| People assigned | `live-people` | `registry` | Every role the workflows need is held by an Agent or a person, with instructions and limits. |
| Site published | `live-site` | `ui` | The site serves home, pricing, terms, and privacy pages under the Brand, readable by people and agents. |
| Test run passed | `live-test-run` | `transcript` | A sample Customer completes every published Offer end to end in test, with no real charge or message. |
| Portal ready | `live-portal` | `ui` | The customer portal on the site shows each Customer their orders, deliveries, invoices, and messages. |
| Agent API open | `live-agent-api` | `contract` | The API, MCP server, OpenAPI document, llms.txt, and agents.json serve every published Offer and pass conformance. |
| Payouts connected | `live-payouts` | `contract` | Stripe takes payments for the Startup and pays out to its bank account. |
| Address resolves | `live-address` | `contract` | The canonical Domain serves the Site over HTTPS with a valid certificate and, where it embeds a payment form, Stripe lists it as a payment method domain. |
| Five slots at Commitment | `live-slots` | `grade` | All five Founding Hypothesis slots hold Commitment Evidence from outside people. Slots `customer`, `problem`, `approach`, `switch`, `differentiation` at Commitment or stronger, outside Evidence only. |

## Next steps
- [With code](/start/with-code): the dev server, Events forwarded to your machine, and a price change as a [Change](/business/nouns/change).
- [Launch my business](/business/launch-my-business): what launch does once every check passes.
- [Plans and tiers](/products/offers/plans-and-tiers): how many plans to sell, what goes in each, and when a free plan beats a trial.
- [Connect my domain](/products/site/domains/connect-my-domain): serve the Site at a name you already own.
- [create-startups](/code/cli/create-startups): every flag and every [Startup Template](/business/nouns/startup-template).