Taking a test payment in five minutes
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, so no card is charged and no message leaves. You need node 20 or later and a terminal, and no Stripe account up front.
What you build
You build leaseclock.com, a Solo SaaS Startup that tracks lease renewal dates for small property managers. It sells one Offer, the pro plan at $29 a month, and takes its first payment from a sample Customer in test.
Steps
To create the Startup, run
create startupswith a template:npm create startups leaseclock.com -- --template solo-saas --yesCreated Leaseclock in testStartup startup_1State IdeaTemplate Solo SaaSOffer offer_1,Pro at $29 a month, draftClaim token ct_7Hq2xVNext: cat leaseclock/ startup.ts To read the Startup as code, print its root file:
cat leaseclock/startup.ts import { Startup } from 'startup-builder' export default Startup({name:'Leaseclock', domain: 'leaseclock.com', extends: 'solo-saas', }) Three lines. The Site, the Offer, the Roles and the Processes come from the template, and
offers/holds the price.pro.mdx To put the plan on sale in test, publish the Offer:
npx startup-builder do Offer.publish --json '{"offer":"offer_1"}' Published offer_1 in testPrice $29 a monthCheckout card,Apple Pay and Google Pay, test cards only To take a test payment, subscribe a sample Customer:
npx startup-builder do Offer.subscribe --json '{"offer":"offer_1"}' Subscribed in testSubscription subscription_1,$29 a month, renews 2026-11-23Customer customer_1, sample, Visa 4242Invoice invoice_1, $29.00, paidLedger 2 entries: cash and deferred revenue To see what the payment set off, list the latest Events:
npx startup-builder show /events --fields 'seq,name, at' seq name at1 Offer.published 2026-10-22T12:00: 00Z2 Offer.subscribed 2026-10-22T12: 00: 04Z3 Invoice.billed 2026-10-22T12: 00: 04Z4 Invoice.collected 2026-10-22T12: 00: 05Z Each Event can wake a Workflow. The receipt email went to a seed inbox, because test sends nothing outside.
To take real money, claim the Startup with the token from step 1:
npx startup-builder do Startup.claim --json '{"startup":"startup_1", "claimToken": "ct_7Hq2xV"}' Claimed LeaseclockOwner of record pending Stripe onboardingFinish 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.
To see what stands between you and Live, preview launch with
--try, which checks and stores nothing:npx startup-builder do Startup.launch --json '{"startup":"startup_1"}' --try Refused:2 of 10 checks failfail Test run passed no completed test orderfail 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 on api.sb, the same call through the API, SDK, CLI and MCP.
Launch reads 10 checks for leaseclock.com, a Solo SaaS Startup: the ones every Startup passes. Some templates add more; the 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: the dev server, Events forwarded to your machine, and a price change as a Change.
- Launch my business: what launch does once every check passes.
- Plans and tiers: how many plans to sell, what goes in each, and when a free plan beats a trial.
- Connect my domain: serve the Site at a name you already own.
- create-startups: every flag and every Startup Template.