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 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).
You, to your agent
Book a call with the lead who said yes, without sending the invite.
curl -X POST "https://api.sb/leaseline.app/meetings/book?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contact":"contact_88","at":"2026-10-21T19:00:00Z"}'
curl -X POST "https://api.sb/leaseline.app/tasks/task_118/assign?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"worker":"worker_3"}'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
npx startup-builder do Meeting.book --json '{"contact":"contact_88","at":"2026-10-21T19:00:00Z"}' --try
npx startup-builder do Task.assign --json '{"task":"task_118","worker":"worker_3"}' --try{
"name": "do",
"arguments": {
"code": "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?”\nawait $.Task.assign({ task: 'task_118', worker: 'worker_3' }, { mode: 'try' }) // the Handoff Brief, to the AE, due in 60 min\nreturn meeting",
"mode": "try"
}
}Response200
application/json{
"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"
}
}
sampleWhat it does
| What you pay for | Price per unit (sample) | The call |
|---|---|---|
| A Meeting booked | $0 | POST /{namespace}/meetings/book |
| The Handoff Brief on the AE’s Task | $0.01 | POST /{namespace}/tasks/{task}/assign |
Run it
| Step | Call | What it does here |
|---|---|---|
| 1 | POST /{namespace}/meetings/book | Northgate Rentals said “Interested. Can you send times for Tuesday?” |
| 2 | POST /{namespace}/tasks/{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 |
|---|---|---|---|---|---|
role-unstaffed | warn | staff the AE, or leave it: Meetings book on your calendar | 0 min | none | POST /{namespace}/roles/{role}/staff |
domain-authenticated | pass | invites send from your Domain | 0 min | none | POST /{namespace}/domains/{domain}/authenticate |
Reference
The records
{
"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"
}
}{
"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 |
|---|---|---|---|
POST /{namespace}/meetings/book | Book schedules a Meeting with a Contact at a time both calendars hold free. | — | Meeting.booked |
POST /{namespace}/tasks/{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 |
Events
{
"$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"
}
}
}{
"$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 Not live yet · gaps #8 · today: The dry run renders from the sample; each check names the call that clears it. | 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. | POST /{namespace}/tasks/{task}/assign |
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. | POST /{namespace}/collections/query |
| Check | Fix | Then |
|---|---|---|
suppressed-contact fail | Leave them out: run the List again, which drops every suppressed Contact. | POST /{namespace}/collections/query |
JSON
{
"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"
}
]
}It says no, says why, and names the fix.
| Check | Fix | Then |
|---|---|---|
suppressed-contact pass | — | POST /{namespace}/collections/query |
no-consent fail | Record the Contact’s yes, with where they gave it, before the first send. | POST /{namespace}/consents |
JSON
{
"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"
}
]
}It says no, says why, and names the fix.
Pauses when
| Stop | Pauses when | Fix | Then |
|---|---|---|---|
unanswered-positive | a reply asking to meet that waits 60 minutes for a person | Answer the reply, then approve the resume. | POST /{namespace}/approvals/{approval}/approve |
{
"$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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | noun: | the record, its fields and every call on it |
| AE | role: | 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 |
Compiled, not written: edit its page, then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.