Building a service business
Build a Service Startup that fixes online store catalogs, with an Outcome Contract, an Evaluator on every delivery, and a fee earned only on acceptance.
You build catalogmend.com, a Service Startup that audits an online store's product catalog and fixes its listing errors. Agents do the work, an Evaluator checks it, and the fee is earned only when the Customer accepts.
What you build
The Startup sells one Offer: a catalog audit for $99, with every listing error fixed or explained within 48 hours. An Outcome Contract states what done means, who accepts, and the remedy for a miss.
You write the Offer, the contract, and the rubric. The Agent-run services firm Startup Template supplies the rest: the delivery Workflow, an agent in each Role the Startup needs, the Site, and the Portal.
Launch reads 12 checks for catalogmend.com, a Agent-run services firm Startup.
| Check | Id | Kind | Applies to | Passes when |
|---|---|---|---|---|
| Offers published | live-offers | registry | Every Startup | At least one Offer is published with a price and terms; launch refuses a Startup without one. |
| Work defined | live-work | registry | Every Startup | 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 Startup | Every role the workflows need is held by an Agent or a person, with instructions and limits. |
| Site published | live-site | ui | Every Startup | The site serves home, pricing, terms, and privacy pages under the Brand, readable by people and agents. |
| Test run passed | live-test-run | transcript | Every Startup | A sample Customer completes every published Offer end to end in test, with no real charge or message. |
| Portal ready | live-portal | ui | Every Startup | The customer portal on the site shows each Customer their orders, deliveries, invoices, and messages. |
| Agent API open | live-agent-api | contract | Every Startup | The API, MCP server, OpenAPI document, llms.txt, and agents.json serve every published Offer and pass conformance. |
| Payouts connected | live-payouts | contract | Every Startup | Stripe takes payments for the Startup and pays out to its bank account. |
| Address resolves | live-address | contract | Every Startup | 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 | Every Startup | All five Founding Hypothesis slots hold Commitment Evidence from outside people. Slots customer, problem, approach, switch, differentiation at Commitment or stronger, outside Evidence only. |
| Evals passing | live-evals | transcript | Agent as a Service | The Agent passes its evaluation suite on every task type its Offers sell. |
| SLA published | live-sla | registry | Services-as-Software, E2E managed service | Every service Offer states its outcome, its SLA, and the remedy when the SLA is missed. |
You need node 20 or later and a terminal. Every command runs in the test environment, so no store is charged or contacted.
Steps
To create the Startup, run
create startupswith the template:npm create startups catalogmend.com -- --template agent-run-servicescd catalogmendCreated Catalogmend in testStartup startup_1Template Agent-run services firmRoles Founder,Sales Lead, Delivery Manager, Customer Lead, each held by an agentAsleep 33 Roles, each waking on its triggerClaim token ct_4Rk9mP To define the work, create the Offer:
Terminal OFFER=$(npx startup-builder do Offer.create --json '{ "price":{ "amount": 99, "currency": "USD" }, "interval": "once", "terms": "Every listing error in your catalog fixed or explained within 48 hours." }' | jq -r '.offer["$id"] | split("/ ") | last') To grade every delivery before the Customer sees it, create the Evaluator:
npx startup-builder do Evaluator.create --json '{"kind":"generative", "rubric": "Every flagged listing has a title, a price, an image, and a valid category, or a note explaining why not."}' The rubric is the promise in testable form. An Evaluator that cannot fail checks nothing.
To warrant the result, write the Offer's Outcome Contract:
npx startup-builder do OutcomeContract.update --json '{"id":"outcome_contract_1", "done": "The Evaluator passes on every flagged listing", "accept": "The Customer, within 3 days; silence accepts", "remedy": "One free revision within 24 hours, then a full refund"}' Done is not accepted. Done is the Startup's claim, checked by the Evaluator; acceptance is the Customer's, and only acceptance earns the fee.
Publish the Offer:
npx startup-builder do Offer.publish --json '{"offer":"'"$OFFER"'"}' To place a test Order, have a sample store accept the Offer:
npx startup-builder do Offer.accept --json '{"offer":"'"$OFFER"'", "party": "Sample Store"}' The delivery Workflow starts on
Order.placed. Agents read the sample catalog, fix each listing, and attach the evidence.To watch delivery, follow the Order's Events:
npx startup-builder show /orders/order_1/ events Order.placed action_7 by customer_1Action.evaluated action_12 listing-check:fail, 2 listings lack a categoryAction.evaluated action_15 listing-check: passOrder.delivered action_16 acceptance window closes in 3 days The first pass failed the rubric, so the work went back inside the delivery window. The Customer saw only the passing result.
To close the test run, confirm the delivery as the sample store:
npx startup-builder do Order.confirm --json '{"order":"order_1"}' Order.confirmedfires, the fee is earned, and billing starts. A dispute instead would hold the fee and start the remedy.To see what remains before Live, preview launch:
npx startup-builder do Startup.launch --json '{"startup":"startup_1"}' --try Refused:1 of 12 checks failsfail Payouts connected Startup not claimed To connect payouts, claim the Startup with the token from step 1, then finish payouts onboarding at the link it prints:
npx startup-builder do Startup.claim --json '{"startup":"startup_1", "claimToken": "ct_4Rk9mP"}' Launch:
npx startup-builder do Startup.launch --json '{"startup":"startup_1"}'
Result
The Startup is Live and passes all twelve launch checks, including SLA published. A store that buys the audit pays $99, and the agents fix its catalog. The Evaluator grades the work, and the fee is earned when the store accepts or lets 3 days pass.
Next steps
- Outcome contracts: done, acceptance, assurance, and remedy in depth.
- Delivery and acceptance: what happens when delivery misses.
- Spend $1k to find your first customers: the first stores, once the free Plays run.
- Building an API business: the same path for a Dataset sold by the call.