Instant response: answer in 5 minutes
Answer every form, email and chat within 5 minutes, route it to its owner and book the call.
Instant response answers every form, email and chat within 5 minutes, routes it to its owner and books the call. It costs $0.04 an answer and $0.06 a lookup (sample).
You, to your agent
Birchway Properties filled our demo form. Answer it within 5 minutes, route it to our AE and book the call. Do not send.
curl -X POST "https://api.sb/leaseline.app/leads/lead_47/qualify?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"offer":"offer_2"}'
curl -X POST "https://api.sb/leaseline.app/leads/lead_47/assign?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"owner":"worker_3"}'
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_47","at":"2026-10-21T20:00:00Z"}'import { $ } from 'startup-builder'
await $.Lead.qualify({ lead: 'lead_47', offer: 'offer_2' }, { mode: 'try' }) // 2m 51s after the form: 340 units fits the $2, 400-a-year Offer
await $.Lead.assign({ lead: 'lead_47', owner: 'worker_3' }, { mode: 'try' }) // to the AE, with the Handoff Brief
const { meeting } = await $.Meeting.book({ contact: 'contact_47', at: '2026-10-21T20: 00: 00Z' }, { mode: 'try' }) // Tue 15: 00 Central, free on both calendars
return meeting
npx startup-builder do Lead.qualify --json '{"lead":"lead_47","offer":"offer_2"}' --try
npx startup-builder do Lead.assign --json '{"lead":"lead_47","owner":"worker_3"}' --try
npx startup-builder do Meeting.book --json '{"contact":"contact_47","at":"2026-10-21T20:00:00Z"}' --try{
"name": "do",
"arguments": {
"code": "await $.Lead.qualify({ lead: 'lead_47', offer: 'offer_2' }, { mode: 'try' }) // 2m 51s after the form: 340 units fits the $2,400-a-year Offer\nawait $.Lead.assign({ lead: 'lead_47', owner: 'worker_3' }, { mode: 'try' }) // to the AE, with the Handoff Brief\nconst { meeting } = await $.Meeting.book({ contact: 'contact_47', at: '2026-10-21T20:00:00Z' }, { mode: 'try' }) // Tue 15:00 Central, free on both calendars\nreturn meeting",
"mode": "try"
}
}Response200
application/json{
"meeting": {
"$id": "https: //api.sb/ leaseline.app/ meetings/ meeting_12",
"$type": "Meeting",
"at": "2026-10-21T20: 00: 00Z",
"agenda": "Birchway Properties: 340 units, 4 owners, renewals keep slipping",
"contact": {
"$id": "https: //api.sb/ leaseline.app/ contacts/ contact_47",
"$type": "Contact",
"name": "Rosa Medina"
},
"mode": "try"
}
}
sampleWhat it does
| What you pay for | Price per unit (sample) | The call |
|---|---|---|
| An answer drafted and sent from your Domain | $0.04 | POST /{namespace}/conversations/{conversation}/answer |
| A lookup of who wrote in | $0.06 | POST /{namespace}/contacts/{contact}/enrich |
| A Meeting booked | $0 | POST /{namespace}/meetings/book |
Run it
| Step | Call | What it does here |
|---|---|---|
| 1 | POST /{namespace}/leads/{lead}/qualify | 2m 51s after the form: 340 units fits the $2,400-a-year Offer |
| 2 | POST /{namespace}/leads/{lead}/assign | to the AE, with the Handoff Brief |
| 3 | POST /{namespace}/meetings/book | Tue 15:00 Central, free on both calendars |
Set it up
| Check | On the day-0 Startup | Fix | Your time | Wait | Then |
|---|---|---|---|---|---|
inbound-source | fail | forward sales@ to your inbound address, or connect your form | 5 min | none | POST /{namespace}/integrations/connect |
domain-authenticated | fail | add the 3 DNS records shown | 10 min | until DNS resolves, often under 1 h | POST /{namespace}/domains/{domain}/authenticate |
approved-pages | fail | publish your pricing Page: answers quote only your own pages | 15 min | none | POST /{namespace}/sites/{site}/publish |
role-unstaffed | warn | staff the AE, or leave it: its routes come to you | 0 min | none | POST /{namespace}/roles/{role}/staff |
Reference
The records
{
"lead": {
"$id": "https://api.sb/leaseline.app/leads/lead_47" ,
"$type": "Lead",
"status": "qualified",
"interest": "Demo request: 340 units, 4 owners, renewals keep slipping" ,
"owner": "worker_3",
"fit": "strong"
}
}{
"conversation": {
"$id": "https://api.sb/leaseline.app/conversations/conversation_29" ,
"$type": "Conversation",
"status": "open",
"firstAnsweredAt": "2026-10-19T14:04:58Z" ,
"respondBy": "2026-10-19T14:07:07Z"
}
}Calls
| Call | What it does | What else happens | Event |
|---|---|---|---|
POST /{namespace}/leads/{lead}/qualify | Qualify confirms a Lead matches an Offer’s ICP and opens a Deal for it. | — | Lead.qualified |
POST /{namespace}/leads/{lead}/assign | Assign gives a Lead one owner Worker, by round robin, territory or ICP fit, as the Startup’s routing Policy says. | — | Lead.assigned |
POST /{namespace}/meetings/book | Book schedules a Meeting with a Contact at a time both calendars hold free. | — | Meeting.booked |
POST /{namespace}/conversations/{conversation}/answer | Answer replies in a Conversation through the Channel it arrived on and closes the reply Task it opened. | Runs the reply through every Guard before it leaves. | Conversation.answered |
POST /{namespace}/contacts/{contact}/enrich | Enrich fills a Contact’s missing fields from outside sources and marks each value with where it came from. | Meters each lookup against the Startup’s usage Limit. | Contact.enriched |
Events
{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Lead.qualified",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"deal": {
"$id": "https://api.sb/leaseline.app/deals/deal_1" ,
"$type": "Deal",
"status": "Open"
},
"lead": {
"$id": "https://api.sb/leaseline.app/leads/lead_1" ,
"$type": "Lead",
"status": "new"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Lead.assigned",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"lead": {
"$id": "https://api.sb/leaseline.app/leads/lead_1" ,
"$type": "Lead",
"status": "new"
}
}
}{
"$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": "Conversation.answered",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"conversation": {
"$id": "https://api.sb/leaseline.app/conversations/conversation_1" ,
"$type": "Conversation",
"subject": "Example subject",
"answeredAt": "2026-10-22T12:00:00Z"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Contact.enriched",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"contact": {
"$id": "https://api.sb/leaseline.app/contacts/contact_1" ,
"$type": "Contact",
"email": "dana@leaseline.app",
"phone": "Example phone"
}
}
}Refuses when
| Check | Refuses | Fix | Then |
|---|---|---|---|
inbound-source Not live yet · gaps #8 · today: The dry run renders from the sample; each check names the call that clears it. | an inbound Play with no form, ad or email source connected | Forward sales@ to your inbound address, or connect your form or ad source. | POST /{namespace}/integrations/connect |
domain-authenticated | a send from a Domain whose DNS records do not resolve | Add the 3 DNS records shown; it passes once they resolve, often within an hour. | POST /{namespace}/domains/{domain}/authenticate |
approved-pages Not live yet · gaps #8 · today: The dry run renders from the sample; each check names the call that clears it. | a sentence that no approved Page and none of the Person’s own words back | Cut the sentence, or publish the Page that says it. | POST /{namespace}/sites/{site}/publish |
claim | a term with no accepted terms Version, or money back that no Action keeps | Cut the line, or cite the Offer term that grants it. | POST /{namespace}/conversations/{conversation}/answer |
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.
| Check | Fix | Then |
|---|---|---|
domain-authenticated fail | Add the 3 DNS records shown; it passes once they resolve, often within an hour. | POST /{namespace}/domains/{domain}/authenticate |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "The Tuesday cold email did not send: mail.leaseline.app has 1 of its 3 DNS records.",
"checks": [
{
"check": "domain-authenticated",
"status": "fail",
"observed": "1 of 3 records resolve",
"doc": "/code/refusals#check-domain-authenticated",
"fix": "Add the 3 DNS records shown; it passes once they resolve, often within an hour.",
"then": "Domain.authenticate"
}
]
}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 |
kill-switch | you press it, or the injection Stop fires | Review what fired, then turn the Process back on. | POST /{namespace}/processes/{process}/enable |
{
"$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 |
Metric it reaches: First response time (first-response-time).
Hub guides it deepens
| On startupbuilder.dev | Id | What it holds |
|---|---|---|
| Inbound sales | process: | the Process, its steps and its Roles |
| Lead | noun: | the record, its fields and every call on it |
| Conversation | noun: | the record, its fields and every call on it |
| SDR | role: | the Role contract the seat fills |
Example
| Leaseline, when | What happened | Cost (sample) |
|---|---|---|
| 2026-10-19 14:02 | Rosa at Birchway Properties asks for a demo for 340 units | — |
| 14:04:58 | the SDR agent answers, qualifies her and routes her to the AE | $0.10 of Worker cost |
| 14:05 | Tuesday 15:00 Central is booked: one Meeting toward the $2,400-a-year Offer | $0 |
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.