# Turn my app into a business

URL: /start/guides/turn-my-app-into-a-business · Id: `guide:turn-my-app-into-a-business`

> Point your agent at the app you already built and get a Startup around it, with an Offer, a Site, terms, Roles and a claim link for Stripe.

Give your agent the app's address. [`Startup.import`](/business/nouns/startup/import) reads it into a new [Startup](/business/nouns/startup), and [`Startup.build`](/business/nouns/startup/build) builds the business around it while the app keeps running where it runs.

**Before it runs**

- You leave the chat: Never: it all happens in the chat.
- First question at Idea: “Who pays for it, and how much?”
- What it costs: Nothing. Fees start with the first live charge.
- To undo it: Nothing outside test changed, and the app was never touched.

## What you get
- 1 business wrapped around your app, in test (Startup)
- 1 product that points at your app, which keeps running where it runs (Product)
- 1 name, logo, colors and voice, read from the app (Brand)
- 1 Offer drafted from the price on your app, a draft until you publish it (Offer)
- 1 site with pricing, sign-up, terms and privacy (Site)
- 10 Teams, from Product to Legal (Team)
- 38 Roles, an agent named in each (Role)
- 67 Systems: billing, ledger, CRM, support and the rest (System)
- 1 claim link: connect Stripe and own the business (Stripe's connected Account)

Nothing moves. The app keeps its code, its host and its sign-in, and the [Product](/business/nouns/product) points at it. What the business adds sits beside it: checkout, invoices, terms, books, support and an agent in every [Role](/business/nouns/role).

## Your agent does
**For agents**

- Guide: `guide:turn-my-app-into-a-business`, status `beta`. Page: [/start/guides/turn-my-app-into-a-business.md](/start/guides/turn-my-app-into-a-business.md).
- Approval: none. Run it when the founder asks.
- Leaves the chat: never.
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Startup.import`](/business/nouns/startup/import) (`verb:Startup.import`) | `source` url, required: example `"https://leaseline.app"`; `template` Template (an id): example `"solo-saas"` | `startup` Startup |
| 2 | [`Startup.build`](/business/nouns/startup/build) (`verb:Startup.build`) | `startup` Startup (an id), required: the `$id` step 1 returns | `startup` Startup |

Returns: the last call answers with `startup` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "startup": {
    "$id": "https://api.sb/leaseline.app/startups/startup_1",
    "$type": "Startup",
    "name": "Leaseline"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Startup.build",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/action_1"
  }
}
```

Next: offer “Charge $49 a month instead”, or “Call it Renewly”.

Calls: `Startup.import` → `Startup.build`

Ask:

```text
Turn my app into a business.
I already built the app. Make it a real business.
Put a company around leaseline.app so it can sell.
```

API:

```bash
# 1. Startup.import
STARTUP=$(curl -X POST https://api.sb/leaseline.app/startups/import \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":"https://leaseline.app","template":"solo-saas"}' | jq -r '.startup["$id"] | split("/") | last')

# 2. Startup.build
curl -X POST https://api.sb/leaseline.app/startups/$STARTUP/build \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

SDK:

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

const startup = await $.Startup.import({ source: 'https://leaseline.app', template: 'solo-saas' })
await $.Startup.build({ startup: startup.$id })
```

CLI:

```bash
STARTUP=$(npx startup-builder do Startup.import --json '{"source":"https://leaseline.app","template":"solo-saas"}' | jq -r '.startup["$id"] | split("/") | last')
npx startup-builder do Startup.build --json '{"startup":"'"$STARTUP"'"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "const startup = await $.Startup.import({ source: 'https://leaseline.app', template: 'solo-saas' })\nreturn await $.Startup.build({ startup: startup.$id })"
  }
}
```

The agent reads the app's pages, prices and copy, then maps them onto the closest [Startup Template](/business/nouns/startup-template). It asks one question when the app shows no price.

## Change it
- Charge $49 a month instead.
- Call it Renewly.
- Connect leaseline.com.
- Hire an agent to answer my customers.

## Under the hood
- Systems: [Sites](/products/site/sites), [Billing](/systems/billing), [Ledger](/systems/ledger), [CRM](/systems/crm), [Support](/systems/support)
- Nouns: [Startup](/business/nouns/startup), [Product](/business/nouns/product), [Brand](/business/nouns/brand), [Offer](/business/nouns/offer), [Site](/business/nouns/site)
- Events: [`Startup.imported`](/business/events/Startup.imported), [`Startup.built`](/business/events/Startup.built)
- Stripe objects: `Account`

Import reads the app and never writes to it. Every imported fact keeps its source, so a price read from the app's pricing page says so until you change it.