# Book problem interviews from my waitlist

URL: /systems/sales/book-problem-interviews · Id: `guide:book-problem-interviews` · Status: `planned`

> Say "book 15 problem interviews from my waitlist" and get an interview link sent to everyone waiting, with each call on your calendar.

Talk to the people who signed up before you build more. Its status is `planned`: your agent tells you so and runs nothing yet.

Needs: [Start a waitlist](/start/guides/start-a-waitlist) · [Give me a booking link](/systems/sales/give-me-a-booking-link)

**Before it runs**

- Who says yes: You, for its `send`. Your agent shows you the run and waits for your [Approval](/business/nouns/approval).
- You leave the chat: Never.
- What it costs: Nothing.
- To undo it: Delete the Meeting Type; it stays restorable. The invitation stays sent.

## What you get
- 1 interview link with your one question (Meeting Type)
- 1 invitation to every Lead on the waitlist (Message)
- 15 20-minute calls, each with a transcript (Meeting)

## Your agent does
**For agents**

- Guide: `guide:book-problem-interviews`, status `planned`: say it is planned; do not run it. Page: [/systems/sales/book-problem-interviews.md](/systems/sales/book-problem-interviews.md).
- Approval: ask the founder first. Show the run, then wait for their Approval; a refusal ends it. Action class: `send`.
- Leaves the chat: never.
- Needs first: [Start a waitlist](/start/guides/start-a-waitlist), [Give me a booking link](/systems/sales/give-me-a-booking-link).
- 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 | [`MeetingType.create`](/business/nouns/meeting-type/create) (`verb:MeetingType.create`) | `name` string, required: example `"Problem interview"`; `duration` integer, required: example `20`; `medium` string, required: example `"video"`; `availability` Availability (an id), required: the `$id` of the first Availability `Availability.list` returns; `questions` string[]: example `["How do you track lease renewals today?"]` | `meetingType` MeetingType |
| 2 | [`MeetingType.publish`](/business/nouns/meeting-type/publish) (`verb:MeetingType.publish`) | `meetingType` MeetingType (an id), required: the `$id` step 1 returns | `meetingType` MeetingType |
| 3 | [`Message.broadcast`](/business/nouns/message/broadcast) (`verb:Message.broadcast`) | `message` Message (an id), required: the `$id` of the first Message `Message.list` returns; `audience` Audience (an id), required: the `$id` of the first Audience `Audience.list` returns | `messages` Message[], `message` Message |

Returns: the last call answers with `messages`, `message` 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",
  "messages": [
    {
      "$id": "https://api.sb/leaseline.app/messages/message_3Dg8ysSOyQ",
      "$type": "Message"
    }
  ],
  "message": {
    "$id": "https://api.sb/leaseline.app/messages/message_3Dg8ysSOyQ",
    "$type": "Message"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/act_br07HsG8MG",
    "operation": "Message.broadcast",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/act_br07HsG8MG"
  }
}
```

Next: offer “Stop at 15 bookings”, or “Only invite managers with more than 50 units”.

Calls: `MeetingType.create` → `MeetingType.publish` → `Message.broadcast`

Ask:

```text
Book 15 problem interviews from my waitlist.
Get me calls with people on the waitlist.
Ask the waitlist for 20-minute interviews.
```

API:

```bash
# Look up the Availability: Availability.list
AVAILABILITY=$(curl "https://api.sb/leaseline.app/availabilities?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.availabilities[0]["$id"] | split("/") | last')

# 1. MeetingType.create
MEETING_TYPE=$(curl -X POST https://api.sb/leaseline.app/meeting-types \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Problem interview","duration":20,"medium":"video","availability":"'"$AVAILABILITY"'","questions":["How do you track lease renewals today?"]}' | jq -r '.meetingType["$id"] | split("/") | last')

# 2. MeetingType.publish
curl -X POST https://api.sb/leaseline.app/meeting-types/$MEETING_TYPE/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# Look up the Message: Message.list
MESSAGE=$(curl "https://api.sb/leaseline.app/messages?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.messages[0]["$id"] | split("/") | last')

# Look up the Audience: Audience.list
AUDIENCE=$(curl "https://api.sb/leaseline.app/audiences?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.audiences[0]["$id"] | split("/") | last')

# 3. Message.broadcast
IDEMPOTENCY_KEY=$(uuidgen)
curl -X POST https://api.sb/leaseline.app/messages/$MESSAGE/broadcast \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"audience":"'"$AUDIENCE"'"}'
```

SDK:

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

const [availability] = await $.Availability.list({ limit: 1 })
const meetingType = await $.MeetingType.create({ name: 'Problem interview', duration: 20, medium: 'video', availability: availability.$id, questions: ['How do you track lease renewals today?'] })
await $.MeetingType.publish({ meetingType: meetingType.$id })
const [message] = await $.Message.list({ limit: 1 })
const [audience] = await $.Audience.list({ limit: 1 })
await $.Message.broadcast({ message: message.$id, audience: audience.$id })
```

CLI:

```bash
AVAILABILITY=$(npx startup-builder do Availability.list --json '{"limit":1}' | jq -r '.availabilities[0]["$id"] | split("/") | last')
MEETING_TYPE=$(npx startup-builder do MeetingType.create --json '{"name":"Problem interview","duration":20,"medium":"video","availability":"'"$AVAILABILITY"'","questions":["How do you track lease renewals today?"]}' | jq -r '.meetingType["$id"] | split("/") | last')
npx startup-builder do MeetingType.publish --json '{"meetingType":"'"$MEETING_TYPE"'"}'
MESSAGE=$(npx startup-builder do Message.list --json '{"limit":1}' | jq -r '.messages[0]["$id"] | split("/") | last')
AUDIENCE=$(npx startup-builder do Audience.list --json '{"limit":1}' | jq -r '.audiences[0]["$id"] | split("/") | last')
IDEMPOTENCY_KEY=$(uuidgen)
npx startup-builder do Message.broadcast --json '{"message":"'"$MESSAGE"'","audience":"'"$AUDIENCE"'"}' --idempotency-key "$IDEMPOTENCY_KEY"
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "const [availability] = await $.Availability.list({ limit: 1 })\nconst meetingType = await $.MeetingType.create({ name: 'Problem interview', duration: 20, medium: 'video', availability: availability.$id, questions: ['How do you track lease renewals today?'] })\nawait $.MeetingType.publish({ meetingType: meetingType.$id })\nconst [message] = await $.Message.list({ limit: 1 })\nconst [audience] = await $.Audience.list({ limit: 1 })\nreturn await $.Message.broadcast({ message: message.$id, audience: audience.$id })"
  }
}
```

## Change it
- Stop at 15 bookings.
- Only invite managers with more than 50 units.
- Send me each transcript the hour after the call.

## Under the hood
- Systems: [Scheduling](/systems/scheduling), [Waitlists](/systems/waitlists), [Discovery](/business/discovery)
- Nouns: [Meeting Type](/business/nouns/meeting-type), [Meeting](/business/nouns/meeting), [Interview](/business/nouns/interview), [Lead](/business/nouns/lead)
- Events: [`MeetingType.published`](/business/events/MeetingType.published), [`Meeting.booked`](/business/events/Meeting.booked)

The invitation goes out by [`Message.broadcast`](/business/nouns/message/broadcast) to the [Leads](/business/nouns/lead) on the [Waitlist](/business/nouns/waitlist). Each held call keeps its transcript, which [Discovery](/business/discovery) grades as [Evidence](/business/nouns/evidence) for the problem slot of the Founding Hypothesis.