Skip to content

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).

Answer a form in 5 minutesMode try
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"
  }
}
Response200application/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"
  }
}
sample

What it does

What you pay forPrice per unit (sample)The call
An answer drafted and sent from your Domain$0.04POST /{namespace}/conversations/{conversation}/answer
A lookup of who wrote in$0.06POST /{namespace}/contacts/{contact}/enrich
A Meeting booked$0POST /{namespace}/meetings/book

Run it

StepCallWhat it does here
1POST /{namespace}/leads/{lead}/qualify2m 51s after the form: 340 units fits the $2,400-a-year Offer
2POST /{namespace}/leads/{lead}/assignto the AE, with the Handoff Brief
3POST /{namespace}/meetings/bookTue 15:00 Central, free on both calendars

Set it up

CheckOn the day-0 StartupFixYour timeWaitThen
inbound-sourcefailforward sales@ to your inbound address, or connect your form5 minnonePOST /{namespace}/integrations/connect
domain-authenticatedfailadd the 3 DNS records shown10 minuntil DNS resolves, often under 1 hPOST /{namespace}/domains/{domain}/authenticate
approved-pagesfailpublish your pricing Page: answers quote only your own pages15 minnonePOST /{namespace}/sites/{site}/publish
role-unstaffedwarnstaff the AE, or leave it: its routes come to you0 minnonePOST /{namespace}/roles/{role}/staff

The records

The Lead, after Lead.qualify · sample
{
  "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"
  }
}
The Conversation, first answered in 2m 51s · sample
{
  "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

CallWhat it doesWhat else happensEvent
POST /{namespace}/leads/{lead}/qualifyQualify confirms a Lead matches an Offer’s ICP and opens a Deal for it.—Lead.qualified
POST /{namespace}/leads/{lead}/assignAssign 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/bookBook schedules a Meeting with a Contact at a time both calendars hold free.—Meeting.booked
POST /{namespace}/conversations/{conversation}/answerAnswer 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}/enrichEnrich 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

Lead.qualified · StartupBuilder-Signature
{
  "$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"
    }
  }
}
Lead.assigned · StartupBuilder-Signature
{
  "$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"
    }
  }
}
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"
    }
  }
}
Conversation.answered · StartupBuilder-Signature
{
  "$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"
    }
  }
}
Contact.enriched · StartupBuilder-Signature
{
  "$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

CheckRefusesFixThen
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 connectedForward sales@ to your inbound address, or connect your form or ad source.POST /{namespace}/integrations/connect
domain-authenticateda send from a Domain whose DNS records do not resolveAdd 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 backCut the sentence, or publish the Page that says it.POST /{namespace}/sites/{site}/publish
claima term with no accepted terms Version, or money back that no Action keepsCut the line, or cite the Offer term that grants it.POST /{namespace}/conversations/{conversation}/answer
suppressed-contacta send or Sequence step to a Contact on a Suppression, from any PlayLeave them out: run the List again, which drops every suppressed Contact.POST /{namespace}/collections/query
422RefusedStep two to Lakeside Rentals’ owner did not send: they asked us to stop on Oct 12.
CheckFixThen
suppressed-contact failLeave 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.

422RefusedPinecrest Homes’ second visitor was not enrolled: no Consent on record for sales email.
CheckFixThen
suppressed-contact pass—POST /{namespace}/collections/query
no-consent failRecord 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.

422RefusedThe Tuesday cold email did not send: mail.leaseline.app has 1 of its 3 DNS records.
CheckFixThen
domain-authenticated failAdd 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

StopPauses whenFixThen
unanswered-positivea reply asking to meet that waits 60 minutes for a personAnswer the reply, then approve the resume.POST /{namespace}/approvals/{approval}/approve
kill-switchyou press it, or the injection Stop firesReview what fired, then turn the Process back on.POST /{namespace}/processes/{process}/enable
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

PlayWhat it doesIts Metric
Instant responseAnswers 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.devIdWhat it holds
Inbound salesprocess:inbound-salesthe Process, its steps and its Roles
Leadnoun:leadthe record, its fields and every call on it
Conversationnoun:conversationthe record, its fields and every call on it
SDRrole:prospectorthe Role contract the seat fills

Example

Leaseline, whenWhat happenedCost (sample)
2026-10-19 14:02Rosa at Birchway Properties asks for a demo for 340 units—
14:04:58the SDR agent answers, qualifies her and routes her to the AE$0.10 of Worker cost
14:05Tuesday 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.

Contents