URL: /revenue/meetings · Id: `page:/revenue/meetings`

# Meetings: booked from the reply

> Book the call from the reply that said yes, at a time both calendars hold free, and brief the AE.

[Meetings](https://startupbuilder.dev/business/nouns/meeting) books the call from the reply that said yes, at a time both calendars hold free, and briefs the AE. A Meeting costs $0 (sample).

```text title="Ask"
Book a call with the lead who said yes, without sending the invite.
```

```ts title="SDK"
import { $ } from 'startup-builder'

const { meeting } = await $.Meeting.book({ contact: 'contact_88', at: '2026-10-21T19:00:00Z' }, { mode: 'try' })   // Northgate Rentals said “Interested. Can you send times for Tuesday?”
await $.Task.assign({ task: 'task_118', worker: 'worker_3' }, { mode: 'try' })   // the Handoff Brief, to the AE, due in 60 min
return meeting
```

```json title="Response · sample"
{
  "meeting": {
    "$id": "https://api.sb/leaseline.app/meetings/meeting_14",
    "$type": "Meeting",
    "at": "2026-10-21T19:00:00Z",
    "agenda": "Northgate Rentals: 180 units, renewals by hand today",
    "contact": {
      "$id": "https://api.sb/leaseline.app/contacts/contact_88",
      "$type": "Contact",
      "name": "Lee Park"
    },
    "mode": "try"
  }
}
```

## What it does
| What you pay for | Price per unit (sample) | The call |
| --- | --- | --- |
| A Meeting booked | $0 | <Op verb="Meeting.book" /> |
| The Handoff Brief on the AE’s Task | $0.01 | <Op verb="Task.assign" /> |

## Run it
| Step | Call | What it does here |
| --- | --- | --- |
| <a id="step-1"></a>1 | <Op verb="Meeting.book" /> | Northgate Rentals said “Interested. Can you send times for Tuesday?” |
| <a id="step-2"></a>2 | <Op verb="Task.assign" /> | the Handoff Brief, to the AE, due in 60 min |

## Set it up
| Check | On the day-0 Startup | Fix | Your time | Wait | Then |
| --- | --- | --- | --- | --- | --- |
| <a id="check-role-unstaffed"></a>`role-unstaffed` | warn | staff the AE, or leave it: Meetings book on your calendar | 0 min | none | <Op verb="Role.staff" /> |
| <a id="check-domain-authenticated"></a>`domain-authenticated` | pass | invites send from your Domain | 0 min | none | <Op verb="Domain.authenticate" /> |

<div className="sbO-divider" role="separator" aria-label="Reference" data-divider="reference">Reference</div>

## The records
```json title="The Meeting · sample"
{
  "meeting": {
    "$id": "https://api.sb/leaseline.app/meetings/meeting_14",
    "$type": "Meeting",
    "at": "2026-10-21T19:00:00Z",
    "agenda": "Northgate Rentals: 180 units, renewals by hand today"
  }
}
```

```json title="The Handoff Brief · sample"
{
  "task": {
    "$id": "https://api.sb/leaseline.app/tasks/task_118",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-19T16:41:00Z",
    "brief": {
      "who": "Lee Park, Northgate Rentals",
      "said": "Interested. Can you send times for Tuesday?",
      "booked": "Tue 14:00 Central",
      "never": [
        "a price beyond the list",
        "a discount",
        "terms"
      ]
    }
  }
}
```

## Calls
| Call | What it does | What else happens | Event |
| --- | --- | --- | --- |
| <Op verb="Meeting.book" /> | Book schedules a Meeting with a Contact at a time both calendars hold free. | — | [`Meeting.booked`](#event-meeting-booked) |
| <Op verb="Task.assign" /> | Assign gives a Task to a Worker, human or agent, and places it in that Worker’s worklist. | Moves the waiting Action from `awaitingWorker` to `awaitingAction`. | [`Task.assigned`](#event-task-assigned) |

## Events
<a id="event-meeting-booked"></a>

```json title="Meeting.booked · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Meeting.booked",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "meeting": {
      "$id": "https://api.sb/leaseline.app/meetings/meeting_1",
      "$type": "Meeting",
      "at": "2026-10-22T12:00:00Z"
    }
  }
}
```

<a id="event-task-assigned"></a>

```json title="Task.assigned · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1",
  "$type": "Event",
  "name": "Task.assigned",
  "at": "2026-10-22T12:00:00Z",
  "seq": 1,
  "data": {
    "task": {
      "$id": "https://api.sb/leaseline.app/tasks/task_1",
      "$type": "Task",
      "status": "pending",
      "mode": "try"
    }
  }
}
```

## Refuses when
| Check | Refuses | Fix | Then |
| --- | --- | --- | --- |
| [`owned-by-a-person`](/code/refusals#check-owned-by-a-person) <NotLiveYet gap="play-dry-run-codes" /> | a send to a Contact whose Lead, open Deal or Conversation a person owns | Leave it to the person who owns it: the draft waits in their queue. | <Op verb="Task.assign" /> |
| [`suppressed-contact`](/code/refusals#check-suppressed-contact) | a send or Sequence step to a Contact on a Suppression, from any Play | Leave them out: run the List again, which drops every suppressed Contact. | <Op verb="Collection.query" /> |

```json title="422 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Step two to Lakeside Rentals’ owner did not send: they asked us to stop on Oct 12.",
  "checks": [
    {
      "check": "suppressed-contact",
      "status": "fail",
      "observed": "Suppression suppression_6, unsubscribed 2026-10-12",
      "doc": "/code/refusals#check-suppressed-contact",
      "fix": "Leave them out: run the List again, which drops every suppressed Contact.",
      "then": "Collection.query"
    }
  ]
}
```


```json title="422 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Pinecrest Homes’ second visitor was not enrolled: no Consent on record for sales email.",
  "checks": [
    {
      "check": "suppressed-contact",
      "status": "pass"
    },
    {
      "check": "no-consent",
      "status": "fail",
      "observed": "no Consent for purpose sales-email",
      "doc": "/code/refusals#check-no-consent",
      "fix": "Record the Contact’s yes, with where they gave it, before the first send.",
      "then": "Consent.create"
    }
  ]
}
```

## Pauses when
| Stop | Pauses when | Fix | Then |
| --- | --- | --- | --- |
| [`unanswered-positive`](/code/refusals#stop-unanswered-positive) | a reply asking to meet that waits 60 minutes for a person | Answer the reply, then approve the resume. | <Op verb="Approval.approve" /> |

```json title="Campaign.paused · unanswered-positive · Not live yet, gaps #2 · sample"
{
  "$id": "https://api.sb/leaseline.app/events/event_951",
  "$type": "Event",
  "name": "Campaign.paused",
  "at": "2026-10-19T16:45:00Z",
  "data": {
    "campaign": {
      "$id": "https://api.sb/leaseline.app/campaigns/cold-email",
      "$type": "Campaign"
    },
    "reason": {
      "limit": "unanswered-positive",
      "observed": "64m",
      "bound": "60m",
      "window": "60m"
    },
    "task": {
      "$id": "https://api.sb/leaseline.app/tasks/task_88",
      "$type": "Task"
    }
  }
}
```

## Plays that use it
| Play | What it does | Its Metric |
| --- | --- | --- |
| [Instant response](/plays/instant-response) | Answers every form and email within 5 minutes from your own pages, books the call, starts the trial or hands it to the right person. | `inbound-meeting-rate` |
| [Cold email](/plays/cold-email) | Writes first to people at companies that showed two fresh public reasons to talk, three short emails at most, and answers every reply by kind. | `positive-reply-rate` |
| [Warm intros](/plays/warm-intros) | Finds who already knows each company you want, and that person asks them first, from their own account, before any introduction. | `intro-acceptance-rate` |
| [Proof-of-work outreach](/plays/proof-of-work-outreach) | Sends each Prospect one finished piece of your product’s work, made from their own public data, in a plain email that asks for nothing. | `proof-reply-rate` |
| [LinkedIn outbound](/plays/linkedin-outbound) | Picks each day’s People on LinkedIn, drafts the connection note and the Messages, and queues them in your send tray; you press every send. | `linkedin-reply-rate` |
| [Outbound calling](/plays/outbound-calling) | A disclosed voice agent calls back anyone who asks within 60 seconds and answers your number; a person dials every cold call. | `callback-meeting-rate` |
| [Gifting](/plays/gifting) | Sends one gift the Person picks after two relevant touches at a live moment, with you approving each, and counts the Meetings it adds. | `gift-meetings-per-100` |
| [Lead reactivation](/plays/lead-reactivation) | Writes once to each old Lead nobody works, only when something new answers what they asked, from their last contact at the Startup. | `reactivated-pipeline` |
| [Account visits](/plays/account-visits) | Finds the fitting companies behind visits to your own buying pages and writes to the right person there, from facts, never from the visit. | `visit-reply-lift` |
| [Product signals](/plays/product-signals) | Finds teams getting value on a free account and writes to the right person, citing only their own usage, after you approve the first send. | `pql-deal-rate` |
| [Buying committee](/plays/buying-committee) | Writes to 3 or more roles at each named company, one a week, and hands each engaged company to your AE within a day. | `committee-deal-lift` |
| [Waitlist interviews](/plays/signup-interviews) | Interviews each Waitlist signup with your disclosed agent, admits by fit under a published cap, and sends a result built on their company. | `interview-activation-rate` |

Cost only: it moves no Metric itself, and what it costs counts against each Play that uses it.

## Hub guides it deepens
| On startupbuilder.dev | Id | What it holds |
| --- | --- | --- |
| [Meeting](https://startupbuilder.dev/business/nouns/meeting) | `noun:meeting` | the record, its fields and every call on it |
| [AE](https://startupbuilder.dev/agents/sales/sales-lead) | `role:sales-lead` | the Role contract the seat fills |

## Example
| Leaseline, when | What happened | Cost (sample) |
| --- | --- | --- |
| 2026-10-19 15:41 | Northgate Rentals says yes | — |
| 16:12 | Tuesday 14:00 Central is booked and the AE has the Brief | $0.01 |