When to reach out: the Event and the window
Every Event that starts an Outreach Play, the window it stays open and the payload it carries.
When to reach out lists every Event that starts an Outreach Play, the window it stays open and the payload it carries. A Trigger costs $0; each touch costs what its email costs.
Which Events start our outreach, how long does each stay open, and send me each one as it happens.
curl "https://api.sb/leaseline.app/triggers?limit=20" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
curl "https://api.sb/leaseline.app/events?where=name%20%3D%20%22Conversation.answered%22&limit=1" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
curl -X POST "https://api.sb/leaseline.app/watches?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"selector":"Conversation.answered","url":"https://leaseline.app/hooks/sb"}'import { $ } from 'startup-builder'
const { triggers } = await $.Trigger.list({ limit: 20 }) // what starts each Play, and its selector
const { events: [last] } = await $.Event.list({ where: 'name = "Conversation.answered"', limit: 1 }) // the latest reply that names a date to write again
await $.Watch.create({ selector: 'Conversation.answered', url: 'https: //leaseline.app/ hooks/ sb' }, { mode: 'try' }) // each delivery signed
return triggers
npx startup-builder do Trigger.list --json '{"limit":20}'
npx startup-builder do Event.list --json '{"where":"name = \"Conversation.answered\"","limit":1}'
npx startup-builder do Watch.create --json '{"selector":"Conversation.answered","url":"https://leaseline.app/hooks/sb"}' --try{
"name": "do",
"arguments": {
"code": "const { triggers } = await $.Trigger.list({ limit: 20 }) // what starts each Play, and its selector\nconst { events: [last] } = await $.Event.list({ where: 'name = \"Conversation.answered\"', limit: 1 }) // the latest reply that names a date to write again\nawait $.Watch.create({ selector: 'Conversation.answered', url: 'https://leaseline.app/hooks/sb' }, { mode: 'try' }) // each delivery signed\nreturn triggers",
"mode": "try"
}
}application/json{
"triggers": [
{
"$id": "https: //api.sb/ leaseline.app/ triggers/ not-now-date",
"$type": "Trigger",
"event": "Conversation.answered",
"where": "reply.kind = 'not-now' and reply.date <= now"
},
{
"$id": "https: //api.sb/ leaseline.app/ triggers/ pricing-visit",
"$type": "Trigger",
"event": "Visit.recorded",
"where": "page.path = '/pricing'"
},
{
"$id": "https: //api.sb/ leaseline.app/ triggers/ form-submitted",
"$type": "Trigger",
"event": "Lead.created"
}
]
}
samplePreviewWhat it does
| What you pay for | Price per unit (sample) | The call |
|---|---|---|
| A Trigger | $0 | POST /{namespace}/triggers |
| A signed delivery to your endpoint | $0 | POST /{namespace}/watches |
Run it
| Step | Call | What it does here |
|---|---|---|
| 1 | GET /{namespace}/triggers | what starts each Play, and its selector |
| 2 | GET /{namespace}/events | the latest reply that names a date to write again |
| 3 | POST /{namespace}/watches | each delivery signed |
Set it up
| Check | On the day-0 Startup | Fix | Your time | Wait | Then |
|---|---|---|---|---|---|
inbound-source | fail | connect the form, inbox or ad source whose Events start your Plays | 5 min | none | POST /{namespace}/integrations/connect |
The records
{
"trigger": {
"$id": "https://api.sb/leaseline.app/triggers/not-now-date" ,
"$type": "Trigger",
"event": "Conversation.answered",
"where": "reply.kind = 'not-now' and reply.date <= now"
}
}| When | Event | Starts on | Window | Plays | Payload |
|---|---|---|---|---|---|
| Introducer answer | Action.answered |
event where action.kind = 'intro-ask' |
1d | Warm intros | { action } · payload |
| Target opt-in | Action.answered |
event where answer = 'yes' |
2d | Warm intros | { action } · payload |
| Organization ad engagement | Ad.clicked |
threshold where 3 or more clicks, |
14d | Buying committee | Not live yet |
| Introducer joined | Agreement.signed |
event where kind in ('holder', |
14d | Warm intros | { agreement } · payload |
| Account touch hold | Approval.approved |
event where kind = 'account-touch' |
14d | Lead nurture, Product signals | { approval } · payload |
| Voice requested | Call.requested |
event where channel = 'voice' |
1h | Waitlist interviews | Not live yet |
| Inbound call | Channel.called |
event where direction = 'inbound' |
1h | Outbound calling | Not live yet |
| Dropped call | Channel.missed |
event where answered = false or callbackAsked = true |
1d | Outbound calling | Not live yet |
| Cap mismatch | Check.failed |
event where page.cap differs from waitlist.cap |
1d | Waitlist interviews | Not live yet |
| Checkout exit | Checkout.abandoned |
state where status = 'abandoned' on a started signup or checkout |
7d | Product-led growth | Not live yet |
| Public filing | Company.filed |
event where a permit, |
14d | Cold email | Not live yet |
| Funding | Company.funded |
at where day 21 to day 45 after a priced round or grant is announced |
45d | Cold email | Not live yet |
| Named organization moment | Company.funded |
event where funding, |
30d | Buying committee, Moment outreach | Not live yet |
| Voice consent form | Consent.granted |
event where purpose = 'ai-voice-call' |
1d | Outbound calling | Not live yet |
| Member role change | Contact.enriched |
event where a mapped member left, |
30d | Buying committee | { contact } · payload |
| Dormant connection | Contact.imported |
state where first-degree, |
30d | LinkedIn outbound | Not live yet |
| Records imported | Contact.imported |
event where each row carries its collecting Form, |
730d | Lead reactivation | Not live yet |
| Stalled signup | Contact.stalled |
state where status = 'stalled': |
30d | Product-led growth | Not live yet |
| Answer owed | Content.published |
event where matches a ghosted Form’s question at 0.8 or more |
30d | Lead reactivation | { content } · payload |
| Outcome fact | Content.published |
event where kind = 'outcome' and verified |
30d | Lead reactivation | { content } · payload |
| Form non-booker | Conversation.answered |
state where a booking link offered and no Meeting.booked 24 hours after the answer |
7d | Lead nurture | { conversation } · payload |
| Not now date | Conversation.answered |
at where the date the Person’s own reply named |
14d | Cold email | { conversation } · payload |
| Referral named | Conversation.answered |
event where the reply names a colleague and agrees to be mentioned |
7d | Cold email | { conversation } · payload |
| Chat non-booker | Conversation.closed |
state where an address captured, |
7d | Lead nurture | { conversation } · payload |
| Customer words batch | Conversation.closed |
threshold where newQuotes >= 30 |
30d | Positioning tournament | { conversation } · payload |
| Call me reply | Conversation.labeled |
event where label = 'call-me' |
1d | Outbound calling | Not live yet |
| Activation reached | Customer.activated |
event where first = true |
72h | Lead nurture, Product-led growth, Waitlist interviews | { customer } · payload |
| Senior signup | Customer.activated |
event where the Person's own stated role is director or above, |
7d | Product signals | { customer } · payload |
| Dormant signup | Customer.stalled |
state where status = 'stalled': |
14d | Product signals | Not live yet |
| Heatmap due | Dashboard.scheduled |
at where month.start |
7d | Positioning tournament | { dashboard } · payload |
| Single sign-on objection lost | Deal.lost |
event where reason mentions 'single-sign-on' |
180d | Lead reactivation | { deal } · payload |
| Decision hold | Deal.proposed |
state where status in ('proposed', |
90d | Gifting | { deal } · payload |
| Quiet deal | Deal.stalled |
state where status = 'open' and a Meeting held and no member reply for 10 business days |
30d | Gifting | Not live yet |
| Free limit near | Entitlement.checked |
threshold where used / bound >= 0.8 on a free meter |
7d | Lead nurture | { allowed, · payload |
| Limit approach | Entitlement.checked |
threshold where used / bound at 0.8 or more this period |
7d | Agent-to-agent selling | { allowed, · payload |
| Limit pair | Entitlement.checked |
threshold where allowed = false for 2 or more People at one Organization on the same Limit |
7d | Product signals | { allowed, · payload |
| Limit pressure | Entitlement.checked |
threshold where used / bound >= 0.8 inside the first 30 paid days, |
3d | Product-led growth | { allowed, · payload |
| Limit reached | Entitlement.checked |
threshold where used past bound; |
1d | Agent-to-agent selling | { allowed, · payload |
| Locked verb call | Entitlement.checked |
event where a locked Verb, |
24h | Agent-to-agent selling | { allowed, · payload |
| Usage threshold | Entitlement.checked |
threshold where allowed = false, |
2d | Product-led growth | { allowed, · payload |
| Lead pricing return | Event.captured |
threshold where pricing or plan Page views on 2 or more days in 7 |
72h | Lead nurture | { event } · payload |
| Organization visit | Event.captured |
event where page in ('pricing', |
3d | LinkedIn outbound | { event } · payload |
| Paid predictor | Event.captured |
threshold where the fitted usage Event reaches its fitted count within 7 days of signup |
7d | Product-led growth | { event } · payload |
| Team cluster | Event.captured |
threshold where 3 or more active People at one free or trial Organization within 14 days |
14d | Product signals | { event } · payload |
| Commitment stated | Evidence.created |
event where kind = 'commitment' |
3d | Waitlist interviews | { evidence } · payload |
| Read-me request | Form.submitted |
event where form = 'read-me', |
24h | Benchmark rows | Not live yet |
| Regrade request | Form.submitted |
event where form = 'regrade', |
24h | Benchmark rows | Not live yet |
| Reading dispute | Form.submitted |
event where form = 'dispute', |
2d | Benchmark rows | Not live yet |
| Gathering announced | Gathering.opened |
event where a topic or series a pooled Person registered for |
21d | Lead reactivation | Not live yet |
| Registrant silent | Gathering.registered |
state where last Registration 180 days old, |
365d | Lead reactivation | { registration, · payload |
| Fixable error | Interface.called |
event where an error kind with a recorded fix, |
7d | Agent-to-agent selling | Not live yet |
| Principal quiet | Interface.called |
state where no call for 14 days after 4 weeks of weekly paid calls |
30d | Agent-to-agent selling | Not live yet |
| Unclaimed use | Interface.called |
threshold where the third successful non-empty call while unclaimed |
48h | Agent-to-agent selling | Not live yet |
| Interview abandoned | Interview.abandoned |
event where kind = 'signup' |
7d | Waitlist interviews | Not live yet |
| Interview completed | Interview.completed |
event where kind = 'signup' |
1h | Waitlist interviews | Not live yet |
| Ad lead form | Lead.created |
event | 1d | Instant response | { lead } · payload |
| Form submitted | Lead.created |
event | 1d | Instant response | { lead } · payload |
| Nurture handoff | Lead.nurtured |
at where 60 days after a silent or ceiling exit from lead-nurture |
365d | Lead reactivation | { lead } · payload |
| Lead routed to nurture | Lead.qualified |
event where route in ('nurture', |
24h | Lead nurture | { deal, · payload |
| Tournament signup matured | Lead.qualified |
event where experiment != null and age = 14d |
14d | Positioning tournament | { deal, · payload |
| Strong fit lead | Lead.qualified |
event where fit = 'strong' and intent = 'strong' and voiceConsent = false |
1d | Outbound calling | { deal, · payload |
| Meeting no-show | Meeting.booked |
state where missed and not rebooked within 2 hours |
72h | Lead nurture | { meeting } · payload |
| Onboarding held | Meeting.held |
event where kind = 'onboarding' |
7d | Waitlist interviews | Not live yet |
| Chat app message | Message.created |
event where direction = 'inbound' |
1d | Instant response | { message } · payload |
| Direct message | Message.created |
event where direction = 'inbound' |
1d | Instant response | { message } · payload |
| Inbound email | Message.created |
event where direction = 'inbound' |
1d | Instant response | { message } · payload |
| Site chat opened | Message.created |
event where direction = 'inbound' |
1h | Instant response | { message } · payload |
| Address given | Message.received |
event where direction = 'inbound' and postalAddress is set |
30d | Gifting | Not live yet |
| Intro made | Message.received |
event where participants include the introducer and the target |
4h | Warm intros | Not live yet |
| LinkedIn reply | Message.replied |
event where direction = 'inbound' |
1h | LinkedIn outbound | Not live yet |
| Output disputed | Message.replied |
event where says an output fact is wrong |
1d | Waitlist interviews | Not live yet |
| Air cover requested | Message.scheduled |
event where step = 1 and sendAt >= now + 9d |
14d | Cold email, Moment outreach, LinkedIn outbound, Account visits | { message } · payload |
| Pool threshold | Metric.watched |
threshold where month-to-date pool cost reaches 80 % or 100 % |
1d | Product-led growth | { watch, · payload |
| Stance decay | Metric.watched |
threshold where rate <= 0.7 × verdictRate |
30d | Positioning tournament | { watch, · payload |
| Verb cost shift | Metric.watched |
threshold where a Verb's p95 cost per call moves 30 % or more against its prior 28 days |
7d | Product-led growth | { watch, · payload |
| Cell filled | Monitor.checked |
threshold where rivalsSaying(winningCell) >= 2 |
14d | Positioning tournament | { monitor } · payload |
| Fix live | Monitor.checked |
event where the fix named in the row is live on the company's page |
30d | Benchmark rows | { monitor } · payload |
| Index due | Monitor.checked |
at where 7 days after the last reading, |
7d | Benchmark rows | { monitor } · payload |
| Lead silent 90 | Monitor.checked |
state where 90 days since the last Lead Event |
1d | Lead nurture, Lead reactivation | { monitor } · payload |
| Open issue | Monitor.checked |
state where status = 'open' and unassigned, |
30d | Proof-of-work outreach | { monitor } · payload |
| Public change | Monitor.checked |
event where a content change on one of the company's measured public Pages |
24h | Benchmark rows | { monitor } · payload |
| Public surface change | Monitor.checked |
event where the changed surface is one the Product's cheapest Verb can assess |
14d | Proof-of-work outreach | { monitor } · payload |
| Rank move | Monitor.checked |
threshold where value moved by the smallest real change, |
3d | Benchmark rows | { monitor } · payload |
| Rival claim change | Monitor.checked |
event where changed = true |
30d | Positioning tournament | { monitor } · payload |
| Ready row | Monitor.checked |
state where gap over the floor, |
7d | Benchmark rows | { monitor } · payload |
| Technology change | Monitor.checked |
event where a product the Startup integrates with or replaces is added or dropped |
30d | Cold email | { monitor } · payload |
| Offer changed | Offer.published |
event where answers a blocker a pooled Person stated |
30d | Lead reactivation | { offer } · payload |
| First paid | Offer.subscribed |
event where the first Price above 0 |
30d | Product-led growth | { subscription, · payload |
| Trial ending | Offer.trialed |
at where 3 days before trialEndsAt, |
3d | Lead nurture | { subscription, · payload |
| Trial lapsed | Offer.trialed |
at where 60 days after trial access ended with no paid Period |
365d | Lead reactivation | { subscription, · payload |
| Opening published | Opening.published |
event where the opening is for the role the Product serves or replaces |
30d | Cold email | Not live yet |
| Checkout abandoned | Order.started |
state where a known Lead and no Order.placed within 60 minutes |
48h | Lead nurture | { order } · payload |
| Acquisition hold | Organization.acquired |
state where hold = 'acquisition' |
90d | Moment outreach | Not live yet |
| Renewal window | Organization.adopted |
at where termEnds - 75d |
45d | Moment outreach | Not live yet |
| Stated initiative | Organization.announced |
event where topic = 'renewals' |
30d | Moment outreach | Not live yet |
| New leader | Organization.appointed |
event where function = 'operations' |
60d | Moment outreach | Not live yet |
| Alternative outage | Organization.degraded |
event where severity = 'major' |
90d | Moment outreach | Not live yet |
| Upstream deprecation | Organization.deprecated |
at where endOfLife - 90d |
90d | Moment outreach | Not live yet |
| Crisis hold | Organization.disrupted |
state where hold = 'crisis' |
30d | Moment outreach | Not live yet |
| Layoff hold | Organization.downsized |
state where hold = 'layoff' |
14d | Moment outreach | Not live yet |
| Fiscal year end | Organization.filed |
at where fiscalYearEnd - 56d |
28d | Moment outreach | Not live yet |
| Site change | Organization.published |
event where path in ('trust', |
30d | Moment outreach | Not live yet |
| Stale job post | Organization.reposted |
threshold where openDays >= 60 |
30d | Moment outreach | Not live yet |
| Alternative price rise | Organization.repriced |
event where namedByOrganization = true |
60d | Moment outreach | Not live yet |
| Tender hold | Organization.tendered |
event where status = 'open' |
90d | Gifting | Not live yet |
| Active pricing | Page.viewed |
event where path = '/ |
3d | Product signals | Not live yet |
| Customer pricing visit | Page.viewed |
event where path in ('/ |
7d | Product signals | Not live yet |
| Sample forwarded | Page.viewed |
threshold where the Sample Page read from 3 or more places at one Organization within 14 days |
14d | Proof-of-work outreach | Not live yet |
| Sample viewed | Page.viewed |
event where path = the Person's own Sample Page; |
30d | Proof-of-work outreach | Not live yet |
| Announced moment | Person.announced |
event where kind in ('new-role', |
21d | LinkedIn outbound | Not live yet |
| Rival post commenter | Person.commented |
event where on a rival’s or an ICP creator’s public Post, |
7d | LinkedIn outbound | Not live yet |
| Request accepted | Person.connected |
event | 3d | LinkedIn outbound | Not live yet |
| Problem post | Person.posted |
event where about the Problem, |
7d | LinkedIn outbound | Not live yet |
| Own post reactor | Person.reacted |
event where on the Human’s own Post, |
7d | LinkedIn outbound | Not live yet |
| Tournament funded | PlayMix.compiled |
threshold where budget >= 1500 |
7d | Positioning tournament | { playMix } · payload |
| Event trip | Post.published |
event where kind = 'event-attendance' |
21d | Gifting | { post } · payload |
| Cold call reason | Prospect.created |
event where reason != null and businessNumber != null |
7d | Outbound calling | { prospect } · payload |
| Member engaged | Prospect.engaged |
event where replies, |
14d | Buying committee | { lead, · payload |
| Member hand raise | Prospect.engaged |
event where asks for a Meeting, |
24h | Buying committee | { lead, · payload |
| Product hand raise | Prospect.engaged |
event where the answer is to a touch of this Play, |
1d | Product signals | { lead, · payload |
| Public ask | Question.asked |
event where asks for a link, |
24h | Proof-of-work outreach | Not live yet |
| Competitor complaint | Review.published |
event where a public review or thread names an alternative |
7d | Cold email | { review } · payload |
| Admit due | Schedule.fired |
at where each Monday 09: |
1d | Waitlist interviews | Not live yet |
| Slots published | Schedule.fired |
at where each Friday 16: |
7d | Waitlist interviews | Not live yet |
| Story ungraded | Story.revised |
state where stance.backedBy = null |
30d | Positioning tournament | Not live yet |
| Subscription ended | Subscription.ended |
state where status = 'ended' after a cancel |
60d | Product-led growth | Not live yet |
| Agent provision | Tenant.provisioned |
event where the caller has no API Key |
72h | Agent-to-agent selling | { tenant } · payload |
| Claim expiry due | Tenant.provisioned |
at where 24 hours before expiresAt |
24h | Agent-to-agent selling | { tenant } · payload |
| Sibling cell claim | Territory.requested |
event where cell = winningCell |
7d | Positioning tournament | Not live yet |
| Intro path | Thing.related |
event where grade >= 70 or grade rose by 20 |
30d | Warm intros | { relationship, · payload |
| Interest match | Version.deployed |
event where matches the Lead’s recorded interest |
30d | Lead nurture | { version } · payload |
| Loss reason resolved | Version.deployed |
event where matches a recorded loss reason |
30d | Lead reactivation | { version } · payload |
| Need shipped | Version.deployed |
event where answers a need a pooled Person stated |
30d | Lead reactivation | { version } · payload |
| Reason fixed | Version.deployed |
event where the Change names a churn reason code in its fixes |
30d | Product-led growth | { version } · payload |
| Claim page open | Visit.recorded |
event where the claim Page, |
24h | Agent-to-agent selling | Not live yet |
| Evaluation visit | Visit.recorded |
event where page in ('setup docs', |
7d | Account visits | Not live yet |
| Pricing visit | Visit.recorded |
event where a resolved company reads the pricing or comparison Pages |
72h | Cold email | Not live yet |
| Repeat visit | Visit.recorded |
threshold where a buying Page on a second day within 7 days |
7d | Account visits | Not live yet |
| Activation stalled | Visitor.identified |
state where no activation Event 24 hours after signup |
7d | Lead nurture | { contact, · payload |
| Form ghosted | Visitor.identified |
state where made by a Form, |
730d | Lead reactivation | { contact, · payload |
| Known return | Visitor.identified |
event where a pooled Contact, |
72h | Lead reactivation | { contact, · payload |
| Organization surge | Visitor.identified |
threshold where 3 or more Visitors resolved to one treated company within 7 days |
7d | Buying committee, Account visits | { contact, · payload |
| Person match | Visitor.identified |
threshold where match confidence above the floor and the notice accepted |
72h | Account visits | { contact, · payload |
| Admitted unbooked | Waitlist.admitted |
state where admittedAt < now - 2d and onboardingMeeting is null |
5d | Waitlist interviews | { leads, · payload |
| Waitlist admitted | Waitlist.admitted |
event | 7d | Lead nurture | { leads, · payload |
| Waitlist joined | Waitlist.joined |
event where waitlist.status = 'open' |
7d | Waitlist interviews | { lead, · payload |
146 Triggers on 86 Events. An Event the snapshot lacks waits on the hub and reads Not live yet.
Calls
| Call | What it does | What else happens | Event |
|---|---|---|---|
GET /{namespace}/triggers | Not in the hub registry snapshot. | Today: — | — |
POST /{namespace}/triggers | Not in the hub registry snapshot. | Today: — | — |
GET /{namespace}/events | Not in the hub registry snapshot. | Today: — | — |
POST /{namespace}/watches | Not in the hub registry snapshot. | Today: — | — |
Events
{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Trigger.created",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"trigger": {
"$id": "https://api.sb/leaseline.app/triggers/trigger_1" ,
"$type": "Trigger",
"event": "Example event",
"schedule": "Example schedule"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Watch.created",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"watch": {
"$id": "https://api.sb/leaseline.app/watches/watch_1" ,
"$type": "Watch",
"selector": "Example selector",
"url": "https://leaseline.app"
}
}
}Each live Event below is the signed delivery a Watch on it receives, projected from the hub’s registry. Reproduce one in test with npx startup-builder trigger <Event>, then npx startup-builder clock advance --by <window>.
{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Action.answered",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"action": {
"$id": "https://api.sb/leaseline.app/actions/action_1" ,
"$type": "Action",
"status": "pending",
"mode": "try"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Agreement.signed",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"agreement": {
"$id": "https://api.sb/leaseline.app/agreements/agreement_1" ,
"$type": "Agreement",
"status": "signed"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Approval.approved",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"approval": {
"$id": "https://api.sb/leaseline.app/approvals/approval_1" ,
"$type": "Approval",
"status": "pending",
"mode": "try"
}
}
}{
"$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"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Content.published",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"content": {
"$id": "https://api.sb/leaseline.app/content/content_1" ,
"$type": "Content",
"title": "Leaseline Pro"
}
}
}{
"$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": "Conversation.closed",
"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": "Customer.activated",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"customer": {
"$id": "https://api.sb/leaseline.app/customers/customer_1" ,
"$type": "Customer",
"since": "2026-10-22T12:00:00Z"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Dashboard.scheduled",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"dashboard": {
"$id": "https://api.sb/leaseline.app/dashboards/dashboard_1" ,
"$type": "Dashboard",
"scope": "Startup"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Deal.lost",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"deal": {
"$id": "https://api.sb/leaseline.app/deals/deal_1" ,
"$type": "Deal",
"status": "Lost"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Deal.proposed",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"deal": {
"$id": "https://api.sb/leaseline.app/deals/deal_1" ,
"$type": "Deal",
"status": "Proposed"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Entitlement.checked",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"allowed": true,
"entitlement": {
"$id": "https://api.sb/leaseline.app/entitlements/entitlement_1" ,
"$type": "Entitlement",
"verb": "verb_1"
},
"remaining": 1,
"resetsAt": "2026-10-22T12:00:00Z" ,
"upgrade": {
"$id": "https://api.sb/leaseline.app/offers/offer_1" ,
"$type": "Offer",
"price": {
"amount": 29,
"currency": "USD"
}
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Event.captured",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"event": {
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Leaseline",
"at": "2026-10-22T12:00:00Z"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Evidence.created",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"evidence": {
"$id": "https://api.sb/leaseline.app/evidence/evidence_1" ,
"$type": "Evidence",
"grade": "Behavior"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Gathering.registered",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"registration": {
"$id": "https://api.sb/leaseline.app/registrations/registration_1" ,
"$type": "Registration",
"status": "invited"
},
"gathering": {
"$id": "https://api.sb/leaseline.app/gatherings/gathering_1" ,
"$type": "Gathering",
"title": "Leaseline Pro",
"at": "2026-10-22T12:00:00Z"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Lead.created",
"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": "Lead.nurtured",
"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": "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": "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": "Message.created",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"message": {
"$id": "https://api.sb/leaseline.app/messages/message_1" ,
"$type": "Message",
"medium": "email",
"direction": "inbound",
"body": "Example body"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Message.scheduled",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"message": {
"$id": "https://api.sb/leaseline.app/messages/message_1" ,
"$type": "Message",
"medium": "email",
"direction": "inbound",
"body": "Example body"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Metric.watched",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"watch": {
"$id": "https://api.sb/leaseline.app/watches/watch_1" ,
"$type": "Watch",
"selector": "Example selector",
"url": "https://leaseline.app"
},
"metric": {
"$id": "https://api.sb/leaseline.app/metrics/metric_1" ,
"$type": "Metric",
"query": "Example query",
"status": "draft"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Monitor.checked",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"monitor": {
"$id": "https://api.sb/leaseline.app/monitors/monitor_1" ,
"$type": "Monitor",
"kind": "internal",
"target": "/health"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Offer.published",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"offer": {
"$id": "https://api.sb/leaseline.app/offers/offer_1" ,
"$type": "Offer",
"price": {
"amount": 29,
"currency": "USD"
}
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Offer.subscribed",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"subscription": {
"$id": "https://api.sb/leaseline.app/subscriptions/subscription_1" ,
"$type": "Subscription",
"status": "active"
},
"offer": {
"$id": "https://api.sb/leaseline.app/offers/offer_1" ,
"$type": "Offer",
"price": {
"amount": 29,
"currency": "USD"
}
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Offer.trialed",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"subscription": {
"$id": "https://api.sb/leaseline.app/subscriptions/subscription_1" ,
"$type": "Subscription",
"status": "active"
},
"offer": {
"$id": "https://api.sb/leaseline.app/offers/offer_1" ,
"$type": "Offer",
"price": {
"amount": 29,
"currency": "USD"
}
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Order.started",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"order": {
"$id": "https://api.sb/leaseline.app/orders/order_1" ,
"$type": "Order",
"total": {
"amount": 29,
"currency": "USD"
},
"status": "placed"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "PlayMix.compiled",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"playMix": {
"$id": "https://api.sb/leaseline.app/play-mixes/play_mix_1" ,
"$type": "PlayMix",
"version": 1,
"plays": {},
"compiledAt": "2026-10-22T12:00:00Z"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Post.published",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"post": {
"$id": "https://api.sb/leaseline.app/posts/post_1" ,
"$type": "Post",
"format": "Example format",
"status": "draft"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Prospect.created",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"prospect": {
"$id": "https://api.sb/leaseline.app/prospects/prospect_1" ,
"$type": "Prospect",
"foundIn": "Example found in",
"basis": "Example basis"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Prospect.engaged",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"lead": {
"$id": "https://api.sb/leaseline.app/leads/lead_1" ,
"$type": "Lead",
"status": "new"
},
"prospect": {
"$id": "https://api.sb/leaseline.app/prospects/prospect_1" ,
"$type": "Prospect",
"foundIn": "Example found in",
"basis": "Example basis"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Review.published",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"review": {
"$id": "https://api.sb/leaseline.app/reviews/review_1" ,
"$type": "Review",
"rating": 1,
"status": "submitted"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Tenant.provisioned",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"tenant": {
"$id": "https://api.sb/leaseline.app/tenants/tenant_1" ,
"$type": "Tenant",
"placement": "path",
"apiVersion": "v2"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Thing.related",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"relationship": {
"$id": "https://api.sb/leaseline.app/relationships/relationship_1" ,
"$type": "Relationship",
"predicate": "Example predicate",
"inverse": "Example inverse"
},
"thing": {
"$id": "https://api.sb/leaseline.app/things/thing_1" ,
"$type": "Thing",
"id": "Example id",
"type": [
"noun_1"
]
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Version.deployed",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"version": {
"$id": "https://api.sb/leaseline.app/versions/version_1" ,
"$type": "Version",
"fingerprint": "sha256:9f2c4e1a7b3d"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Visitor.identified",
"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"
},
"visitor": {
"$id": "https://api.sb/leaseline.app/visitors/visitor_1" ,
"$type": "Visitor",
"firstSeenAt": "2026-10-22T12:00:00Z"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Waitlist.admitted",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"leads": [
{
"$id": "https://api.sb/leaseline.app/leads/lead_1" ,
"$type": "Lead",
"status": "new"
}
],
"waitlist": {
"$id": "https://api.sb/leaseline.app/waitlists/waitlist_1" ,
"$type": "Waitlist",
"invited": 1,
"rank": "signup"
}
}
}{
"$id": "https://api.sb/leaseline.app/events/event_1" ,
"$type": "Event",
"name": "Waitlist.joined",
"at": "2026-10-22T12:00:00Z" ,
"seq": 1,
"data": {
"lead": {
"$id": "https://api.sb/leaseline.app/leads/lead_1" ,
"$type": "Lead",
"status": "new"
},
"waitlist": {
"$id": "https://api.sb/leaseline.app/waitlists/waitlist_1" ,
"$type": "Waitlist",
"invited": 1,
"rank": "signup"
}
}
}Refuses when
| Check | Refuses | Fix | Then |
|---|---|---|---|
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 |
no-consent | a send or Sequence step whose purpose the Contact has given no Consent for | Record the Contact’s yes, with where they gave it, before the first send. | POST /{namespace}/consents |
| 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 |
|---|---|---|---|
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": "kill-switch",
"observed": "pressed by worker_1",
"bound": "off",
"window": "now"
}
}
}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 |
| Lead nurture | Follows up each unbought Lead with notes keyed to what they did, most in month one, until they buy, reply or go quiet 90 days. | nurture-conversion |
| 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 |
|---|---|---|
| Trigger | noun: | the record, its fields and every call on it |
| Event | noun: | the record, its fields and every call on it |
| Schedules | capability: | the System, its capability and its calls |
Example
| Leaseline, when | What happened | Cost (sample) |
|---|---|---|
| 2026-10-19 | Lee at Northgate Rentals writes “Try us again in January” | — |
| 2027-01-05 | the Trigger fires inside its 14-day window, and the SDR agent writes once | $0.04 |
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.