# Building a service business

URL: /start/tutorials/building-a-service-business · Id: `page:start/tutorials/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](/business/nouns/service) [Startup](/business/nouns/startup) that audits an online store's product catalog and fixes its listing errors. [Agents](/business/nouns/agent) do the work, an [Evaluator](/business/nouns/evaluator) checks it, and the fee is earned only when the [Customer](/business/nouns/customer) accepts.

## What you build
The Startup sells one [Offer](/business/nouns/offer): a catalog audit for $99, with every listing error fixed or explained within 48 hours. An [Outcome Contract](/business/nouns/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](/start/templates/agent-run-services) [Startup Template](/business/nouns/startup-template) supplies the rest: the delivery [Workflow](/business/nouns/workflow), an agent in each [Role](/business/nouns/role) the Startup needs, the [Site](/business/nouns/site), and the [Portal](/business/nouns/portal).

Launch reads 12 checks for `catalogmend.com`, a [Agent-run services firm](/start/templates/agent-run-services) 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](/products/templates/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](/products/templates/services-as-software), [E2E managed service](/products/templates/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
1. To create the Startup, run `create startups` with the template:

   ```bash
   npm create startups catalogmend.com -- --template agent-run-services
   cd catalogmend
   ```

   ```text
   Created Catalogmend in test
     Startup      startup_1
     Template     Agent-run services firm
     Roles        Founder, Sales Lead, Delivery Manager, Customer Lead, each held by an agent
     Asleep       33 Roles, each waking on its trigger
     Claim token  ct_4Rk9mP
   ```

2. To define the work, create the Offer:

   ```bash
   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')
   ```

3. To grade every delivery before the Customer sees it, create the Evaluator:

   ```bash
   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.

4. To warrant the result, write the Offer's Outcome Contract:

   ```bash
   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.

5. [Publish](/business/nouns/offer/publish) the Offer:

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

6. To provision the Site, the Portal, and every [Interface](/business/nouns/interface), [build](/business/nouns/startup/build) the Startup:

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

7. To place a test [Order](/business/nouns/order), have a sample store [accept](/business/nouns/offer/accept) the Offer:

   ```bash
   npx startup-builder do Offer.accept --json '{"offer":"'"$OFFER"'","party":"Sample Store"}'
   ```

   The delivery Workflow starts on [`Order.placed`](/business/events/Order.placed). Agents read the sample catalog, fix each listing, and attach the evidence.

8. To watch delivery, follow the Order's [Events](/business/nouns/event):

   ```bash
   npx startup-builder show /orders/order_1/events
   ```

   ```text
   Order.placed      action_7   by customer_1
   Action.evaluated  action_12  listing-check: fail, 2 listings lack a category
   Action.evaluated  action_15  listing-check: pass
   Order.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.

9. To close the test run, [confirm](/business/nouns/order/confirm) the delivery as the sample store:

   ```bash
   npx startup-builder do Order.confirm --json '{"order":"order_1"}'
   ```

   [`Order.confirmed`](/business/events/Order.confirmed) fires, the fee is earned, and billing starts. A dispute instead would hold the fee and start the remedy.

10. To see what remains before Live, preview [launch](/business/nouns/startup/launch):

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

    ```text
    Refused: 1 of 12 checks fails
      fail  Payouts connected    Startup not claimed
    ```

11. To connect payouts, [claim](/business/nouns/startup/claim) the Startup with the token from step 1, then finish payouts onboarding at the link it prints:

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

12. Launch:

    ```bash
    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](/products/service/outcome-contracts): done, acceptance, assurance, and remedy in depth.
- [Delivery and acceptance](/products/service/delivery-and-acceptance): what happens when delivery misses.
- [Spend $1k to find your first customers](/workflows/spend-1k-to-find-customers): the first stores, once the free [Plays](/business/nouns/play) run.
- [Building an API business](/start/tutorials/building-an-api-business): the same path for a [Dataset](/business/nouns/dataset) sold by the call.