Trust pack
Sends the trust page and prefilled security answers with every large Quote, and releases the security report only after a click-through Agreement.
- Step
- Make the sale
- Channel
- Offers and Deals
- Kind
- Conversion
- Summary
- startupbuilder.dev
Be our SE: with every Quote for the $2,400 plan, send our trust page and prefill their security questionnaire from our approved answers. Release the security report only after they click through our confidentiality terms. Questions we have no answer for come to me. Show me what’s missing; don’t send.
# Not live yet (gaps #2)
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"trust-pack"}'import { $ } from 'startup-builder'
return await $.Campaign.create({ play: 'trust-pack' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2
npx startup-builder do Campaign.create --json '{"play":"trust-pack"}' --try # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "return await $.Campaign.create({ play: 'trust-pack' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2",
"mode": "try"
}
}application/json{
"type": "https: //startupbuilder.dev/ errors/ refused",
"title": "Refused",
"status": 422,
"detail": "trust-pack can’t start yet: 1 check fails and 2 warn.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "4 enterprise Quotes and 2 questionnaires in 90 days",
"doc": "/plays/ trust-pack#check-use-when",
"fix": "Nothing to fix: 2 or more enterprise Quotes a month.",
"then": "Metric.query"
},
…
Hand our latest enterprise Quote to the SE agent and show me what it chose and why. Don’t send.
curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Quote.requested%22%2C%20%22Message.received%22%2C%20%22Action.asked%22%2C%20%22Change.merged%22%2C%20%22Thing.shared%22%2C%20%22Approval.approved%22)&limit=1" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #7)
curl -X POST "https://api.sb/leaseline.app/triggers/fire?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"like":"event_1262"}'
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22deal_9%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/actions?where=on%20%3D%20%22deal_9%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
const { events: [last] } = await $.Event.list({ where: 'name in ("Quote.requested", "Message.received", "Action.asked", "Change.merged", "Thing.shared", "Approval.approved")', limit: 1 }) // { play } compiled to this Play’s Trigger Events
const { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7
const { decisions: [decision] } = await $.Decision.list({ where: `on = "${subject}"` }) // what it chose, and why · Not live yet, gaps #7
const { actions } = await $.Action.list({ where: `on = "${subject}"` }) // what it did, with its checks · Not live yet, gaps #7
return { decision, actions }
npx startup-builder do Event.list --json '{"where":"name in (\"Quote.requested\", \"Message.received\", \"Action.asked\", \"Change.merged\", \"Thing.shared\", \"Approval.approved\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1262"}' --try # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"deal_9\""}' # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"deal_9\""}' # Not live yet (gaps #7){
"name": "do",
"arguments": {
"code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Quote.requested\", \"Message.received\", \"Action.asked\", \"Change.merged\", \"Thing.shared\", \"Approval.approved\")', limit: 1 }) // { play } compiled to this Play’s Trigger Events\nconst { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7\nconst { decisions: [decision] } = await $.Decision.list({ where: `on = \"${subject}\"` }) // what it chose, and why · Not live yet, gaps #7\nconst { actions } = await $.Action.list({ where: `on = \"${subject}\"` }) // what it did, with its checks · Not live yet, gaps #7\nreturn { decision, actions }",
"mode": "try"
}
}application/json{
"decision": {
"$id": "https: //api.sb/ leaseline.app/ decisions/ decision_338",
"$type": "Decision",
"choice": "send-the-pack",
"reason": "Northgate asked for a Quote on the $2, 400 plan, at the enterprise line in your file; the trust page and 3 approved answers on tenant data go with it",
"stakes": "low",
"options": [
"send-the-pack",
"answer-the-questionnaire",
"release-the-report",
"to-a-person",
"hold-for-you"
],
…
sample · 4 Not live yetPreviewOn PATCH /{namespace}/campaigns/{id}Off PATCH /{namespace}/campaigns/{id}Take this one POST /{namespace}/tasks/{task}/claim
action_1 renders the pack’s cover from approved answers only. action_2 puts it in Priya’s queue beside her Quote, because she owns the Deal; she sends both in one email.
11 days median against 26 before · before-after,
| Try another: the Deal | Choice | Reason |
|---|---|---|
| Northgate Rentals: a Quote requested for the $2,400 plan | send-the-pack | at the enterprise line |
| Summit Row: a 62-question security questionnaire, 51 in the library | answer-the-questionnaire | 82 % covered; 11 go to you |
| Northgate’s IT lead, on northgate’s own domain, clicked through the terms | release-the-report | domain and screening pass |
| Alder & Co: “Can you sign our NDA instead of yours?” | to-a-person | their own confidentiality terms are yours to read |
| A viewer at a personal email address asked for the report | hold-for-you | outside the buyer’s domains |
- Day 4: first questionnaire returned prefilled
- First signal
Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Contract cycle time → New paying Customers → New Customers ↑ → ARR added each week → ARR
Worth’s formula: about 9 days sooner to signature (Other Startups’ results; no lift of your own yet), read as +6 won per 100 enterprise Quotes at your trailing rate × 2.5 Quotes a month × $2,393 ≈ +$359. Under First signal: At 2.5 Quotes a month, 90 days can tell only a 15-day drop or more, so your file starts at holdout: and reads before-after.
sample · api.sb/
Also runs as: Data residency.
Start it this week
npx startup-builder add play trust-pack # 1 · writes plays/trust-pack.mdx (Not live yet, gaps #5)
# 2 · dry run; below, its 422 on 2026-08-24
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"trust-pack"}'
# 3 · keep it, at You approve each one
curl -X POST https://api.sb/leaseline.app/campaigns \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"trust-pack"}'
# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/trust-pack \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"endsAt":null}'
# off: Quotes send without the pack; open report links stay
curl -X PATCH https://api.sb/leaseline.app/campaigns/trust-pack \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"endsAt":"now"}' | Check | Fix | Then |
|---|---|---|
use-when pass · Not live yet, gaps #8 | Nothing to fix: 2 or more enterprise Quotes a month. | POST /{namespace}/metrics/query |
approved-pages fail · Not live yet, gaps #8 | Publish the trust page and approve the floor answers; the pack quotes only them. | POST /{namespace}/sites/{site}/publish |
baseline warn · Not live yet, gaps #8 | n 3: it reads before-after, not proof, until volume allows a held-back half. | POST /{namespace}/metrics/query |
role-unstaffed warn · Not live yet, gaps #8 | Staff the AE, or leave it: packs for your 6 open Deals go to your queue. | POST /{namespace}/roles/{role}/staff |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "trust-pack can’t start yet: 1 check fails and 2 warn.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "4 enterprise Quotes and 2 questionnaires in 90 days",
"doc": "/plays/trust-pack#check-use-when",
"fix": "Nothing to fix: 2 or more enterprise Quotes a month.",
"then": "Metric.query"
},
{
"check": "approved-pages",
"status": "fail",
"observed": "no trust page; 0 approved answers of the 62 standard questions",
"doc": "/plays/trust-pack#check-approved-pages",
"fix": "Publish the trust page and approve the floor answers; the pack quotes only them.",
"then": "Site.publish"
},
{
"check": "baseline",
"status": "warn",
"observed": "median 26 days from Quote to signature, n 3 in 90 days",
"doc": "/plays/trust-pack#check-baseline",
"fix": "n 3: it reads before-after, not proof, until volume allows a held-back half.",
"then": "Metric.query"
},
{
"check": "role-unstaffed",
"status": "warn",
"roles": [
"sales-engineer",
"sales-lead",
"contracts-manager"
],
"owned": 6,
"doc": "/plays/trust-pack#check-role-unstaffed",
"fix": "Staff the AE, or leave it: packs for your 6 open Deals go to your queue.",
"then": "Role.staff"
}
]
}It says no, says why, and names the fix.
| Check | Fix (one call) | Your time | Wait |
|---|---|---|---|
use-when · pass: 4 enterprise Quotes and 2 questionnaires in 90 days (gaps #8) | POST /{namespace}/metrics/query on contract-cycle-time | 1 min | none |
approved-pages · fail (Not live yet): no trust page, 0 approved answers | POST /{namespace}/sites/{site}/publish the trust page, then approve the 62 floor answers once | 40 min | none |
baseline · warn: median 26 days, n 3 | POST /{namespace}/metrics/query; it fills Before in Your number | 0 min | none |
role-unstaffed · warn: 6 of your open Deals have a person owner, you | POST /{namespace}/roles/{role}/staff, or leave it: every pack lands in the Deal owner’s queue, and terms come to you | 0 min | none |
Your number · Before 26 days · Now 11 days median from Quote to signature · Target 14 days or less by Dec 31 · before-after,
Each pack costs $0.08 to render and check against the live trust records (Worker cost); report links and the click-through cost nothing. That comes to about $0.20 a month at 2.5 enterprise Quotes.
When it starts
| When | Trigger id | Starts on | Window | How it gets in |
|---|---|---|---|---|
| A Quote is asked for at your enterprise line | enterprise-quote-requested | event on Quote.requested where quote.total >= 2400 | the pack within 1 business hour; 24h | POST /{namespace}/quotes/request from the Deal, or the AE’s own Quote |
| A buyer sends a security questionnaire on an open Deal | questionnaire-received | event on Message.received where deal.status = 'open' and kind = 'questionnaire' | return within 2 business days; 1d to start | forward it to the address inbound-source printed |
| A pack has had no viewer and no question for 3 business days | review-quiet | state on Thing.shared where pack.sentAt < now - 3 business days and pack.viewers = 0 and deal.status = 'open' | a state, read each morning | none: it reads the pack’s own views |
+ 5 more for security questions, report requests, their own terms, changed trust records and expiring answers (?lanes=) |
{
"$id": "https://api.sb/leaseline.app/events/event_1262" ,
"$type": "Event",
"name": "Quote.requested",
"at": "2026-10-16T14:48:19Z" ,
"seq": 1262,
"data": {
"deal": "deal_9",
"contact": "contact_14",
"offer": "annual",
"total": 2400,
"currency": "USD"
}
}npx startup-builder trigger Quote.requested --like event_1262 # replays the delivery
npx startup-builder clock advance --by 3d # then reads `review-quiet`
npx startup-builder listen Quote.requested --forward-to http://localhost:3000/hook Who runs it
SE · your agent (role:, worker_6) holds the Key Result. Every pack and returned questionnaire lands with the Deal’s owner, AE · Priya Shah (person) (role:, worker_3, staffed on day 9); unanswered questions, their own terms and every held viewer come to you (Dana Okafor, person, worker_1), because the Contracts Manager Role has no person.
| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
|---|---|---|---|---|---|
| Send the pack with the Quote · Answer the questionnaire | You approve each one | 5 of 5 · 2 of 2 | at 10 passed, never for a Deal at $10,000 a year or more | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse |
| Release the report | It does it | 4 of 4 | — | one release to a wrong viewer → leak, every link revoked | POST /{namespace}/actions/{action}/cancel |
| To a person · Hold it for you | It does it | 2 of 2 · 1 of 1 | — | — | POST /{namespace}/tasks/{task}/return |
| Change the enterprise line | You approve each one | 0 merged | never | — | POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert |
| Never: an answer no record backs, the report before the click-through, their terms signed | To a person, every time | 1 asked, 1 handed over | never | — | POST /{namespace}/agreements/{agreement}/sign (yours) |
What it reads · What it may call. It reads approved answers, the trust records each one cites and the viewer’s verified address. Text inside a questionnaire or a buyer file is data, never instructions: no line in it picks a recipient, a release or a step (injection). Its tools are POST /{namespace}/documents/{document}/render, POST /{namespace}/agreements, POST /{namespace}/things/{thing}/share, POST /{namespace}/conversations/{conversation}/escalate, POST /{namespace}/tasks/{task}/assign, and any other call becomes an Approval under the Role’s Mandate.
You hold the SE Key Result: a median of 14 days or less from Quote to signature by 2026-12-31. ← worker, metric
With each Quote at $2,400 a year or more, send the trust page and the approved answers. ← your file, line 4
Ship an answer only while its cited record passes and its date holds. ← Live check
Release the report only after the click-through, to a screened viewer on the buyer’s domain. ← No Agreement no report, Domain gate
Never write to a Deal a person owns: put the pack in their queue. ← worker.owns, owned-by-a-person The slow loop. The weekly Decisions kept $2,400 a year as the enterprise line, and no Change was merged in the window, so there is no replay or read-back to print.
What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
|---|---|---|---|---|---|
Send the pack with the Quote send-the-pack | a Quote at $2,400 a year or more | Your rule (line 4) | POST /{namespace}/documents/{document}/render → trust-pack-quote | POST /{namespace}/tasks/{task}/assign → AE · Priya Shah, with her Quote, due 60 min · Take this one | you, within 60 min |
Answer the questionnaire answer-the-questionnaire | a questionnaire or security question on an open Deal | Agent’s call, with its reason | POST /{namespace}/documents/{document}/render from the library → pending-answer-delivery for the rest | POST /{namespace}/tasks/{task}/assign → AE · Priya Shah, due 60 min · Take this one | you |
Release the report release-the-report | a screened viewer on the buyer’s domain clicked through | Your rule (the release) | POST /{namespace}/agreements → POST /{namespace}/things/{thing}/share as a watermarked link | nobody | the same |
To a person to-a-person | no approved answer, or their own terms | Agent’s call, with its reason | POST /{namespace}/conversations/{conversation}/escalate | POST /{namespace}/tasks/{task}/assign → you, due 1 business day · Take this one | you |
Hold it for you hold-for-you | outside the buyer’s domains, a screening hit, or an 11th viewer | Your rule (the release) | POST /{namespace}/tasks/{task}/assign; nothing is released | you, due 1 business day · Take this one | you |
| When they write back | Fixture reply | What happens | Who answers | By when | Call |
|---|---|---|---|---|---|
| Interested | “Security signed off. Send the order form.” | To the AE: the order form and signature are hers | AE · Priya Shah (person) | 60 min | POST /{namespace}/quotes/{quote}/send |
| Send me pricing | “What does it cost for 3 owners?” | To the AE: the Quote’s price is hers | AE · Priya Shah (person) | 60 min | POST /{namespace}/conversations/{conversation}/escalate |
| Not now | “Our security team reviews in January.” | the pack waits; review-quiet stays off until the Deal moves | nobody | at once | GET /{namespace}/decisions |
| Wrong person | “Send it to our IT lead, Sam.” | asks them to forward it; it never writes to an address from their text | SE · your agent | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Out of office | an auto-reply until Oct 28 | the quiet check waits for the return date | nobody | the return date | POST /{namespace}/messages/{message}/schedule |
| Question it can’t answer | “Do you hold a SOC 2 Type II report?” | To a person: no approved answer covers it | you | 1 business day | POST /{namespace}/conversations/{conversation}/escalate |
| Stop | “Stop sending us security updates.” | change notices stop for that Contact; open links stay | nobody | at once | POST /{namespace}/contacts/{contact}/suppress |
When it hands to you
Packs and questionnaires go to the Deal’s owner, AE · Priya Shah (person); terms, unanswered questions and held viewers come to you. One Brief per Role, as captured (brief is Not live yet, gaps #7).
[
{
"$id": "https://api.sb/leaseline.app/tasks/task_503" ,
"$type": "Task",
"assignee": "worker_3",
"due": "2026-10-16T15:55:00Z" ,
"on": "deal_9",
"brief": {
"who": "Northgate Rentals, Quote on the $2,400 plan" ,
"chose": "send-the-pack",
"why": "at the enterprise line",
"attached": [
"the trust page link",
"3 approved answers on tenant data",
"the report request link"
],
"never": [
"an answer no record backs",
"the report itself"
]
}
},
{
"$id": "https://api.sb/leaseline.app/tasks/task_470" ,
"$type": "Task",
"assignee": "worker_1",
"due": "2026-10-05T17:00:00Z" ,
"on": "deal_14",
"brief": {
"who": "Alder & Co",
"said": "Can you sign our NDA instead of yours?" ,
"chose": "to-a-person",
"why": "their own confidentiality terms are yours to read",
"held": "the report, until terms are agreed"
}
}
]The receiver answers with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, or POST /{namespace}/actions/{action}/redirect, each a one-call window. Once a person claims, the agent’s pending Actions on that Deal cancel with claimedByPerson (Not live yet, gaps #7). A routed question 1 business day overdue goes up through POST /{namespace}/tasks/{task}/escalate (to the AE, then at 3 days to you), and person-promise fires.
On time: AE · Priya Shah, 6 of 6 claimed within 60 min, median 15 min, n 6; you, 2 of 3 within 1 business day, n 3 (the third waited 1 day 3 h and paused the lane), ■□□□ Too early to tell. Your queue: in week 1, the 62-answer library and 2 packs; then about 1 pack and 1 question a week.
The fixed line: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.
When it won’t send
| Check (refuses one send) | Refuses | Fix | Then |
|---|---|---|---|
owned-by-a-person (rule j, gaps #8) | a send to a buyer on a Deal a person owns | Leave it to the person who owns it: the draft waits in their queue. | POST /{namespace}/tasks/{task}/assign |
live-answer (the record’s Live check) | an answer whose cited record is failing, or whose date has passed | Fix the record, or route the question to a person. | POST /{namespace}/conversations/{conversation}/escalate |
agreement (the record’s No Agreement no report) | the report before a click-through or a signed confidentiality Agreement | Send the click-through link; the report follows it. | POST /{namespace}/agreements |
domain (the record’s Domain gate) | a viewer whose verified address is outside the buyer’s domains | Held for you to confirm the viewer. | POST /{namespace}/tasks/next |
screening (the record’s Screening hold) | a viewer or company with a screening hit | Held for you; nothing is released. | POST /{namespace}/tasks/next |
viewer-limit (the record’s Viewer Limit) | an 11th viewer on a Deal, or a 4th new viewer in a day | Approve the viewer, or keep the list as it is. | POST /{namespace}/approvals/{approval}/approve |
| Stop (pauses the Play) | Pauses when | Then |
|---|---|---|
wrong-answer | a confirmed wrong answer | quarantined; every reviewer who got it is corrected within 1 business day; You approve each one |
leak | a report copy outside its release, or a release to the wrong viewer | every open link to that report revoked; releases pause |
coverage | under 70 % library coverage on the dry run, or 3 returns in a row under 60 % | the up-front send stays off |
person-promise | a routed question 1 business day overdue | POST /{namespace}/tasks/{task}/escalate to the AE, at 3 days to you |
injection | text in a questionnaire tries to change a recipient, a release or a step | kill-switch |
kill-switch | you press it, or injection fires | every pack stops; open report links stay until you revoke them |
The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the rewrite that sent is the Summit Row thread in Example.
| Check | Fix | Then |
|---|---|---|
live-answer fail | Fix the record, or route the question to a person. | POST /{namespace}/conversations/{conversation}/escalate |
owned-by-a-person pass · Not live yet, gaps #8 | — | POST /{namespace}/tasks/{task}/assign |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "The questionnaire return to Summit Row did not send: answer 37 says restores are tested monthly, and the last restore test is 74 days old.",
"checks": [
{
"check": "live-answer",
"status": "fail",
"doc": "/plays/trust-pack#check-live-answer",
"fix": "Fix the record, or route the question to a person.",
"then": "Conversation.escalate"
},
{
"check": "owned-by-a-person",
"status": "pass"
}
]
}It says no, says why, and names the fix.
[
{
"reason": {
"limit": "person-promise",
"observed": "1 business day 3 h",
"bound": "1 business day",
"window": "1 question"
},
"doc": "/plays/trust-pack#stop-person-promise" ,
"task": "task_455"
}
]Did it work
At 2.5 enterprise Quotes a month, no held-back half reads within 90 days, so the basis is before-after (rule o): the columns read Now and Before, and nothing prints as Added. Each figure’s call is POST /{namespace}/metrics/query by node, and every node above the leaf is Not live yet (gaps #4).
11 days median against 26 before · before-after,
- Chose
- send-the-pack
- Why
- Northgate asked for a Quote on the $2,400 plan, at the enterprise line in your file; the trust page and 3 approved answers on tenant data go with it
- From
- send-the-pack · answer-the-questionnaire · release-the-report · to-a-person · hold-for-you
- Expects
- Agreement.signed on deal_9 within 21d
- Reopens when
- no viewer on the pack for deal_9 within 3 business days
- By
- worker_6
JSON
{
"$id": "decisions/decision_338",
"$type": "Decision",
"choice": "send-the-pack",
"reason": "Northgate asked for a Quote on the $2,400 plan, at the enterprise line in your file; the trust page and 3 approved answers on tenant data go with it",
"stakes": "low",
"options": [
"send-the-pack",
"answer-the-questionnaire",
"release-the-report",
"to-a-person",
"hold-for-you"
],
"by": "worker_6",
"on": "deal_9",
"expected": "Agreement.signed on deal_9 within 21d",
"reopensWhen": "no viewer on the pack for deal_9 within 3 business days"
}| Node | Now (56 days) | Before (the 90 days, per 56) | Added | Confidence | Basis |
|---|---|---|---|---|---|
contract-cycle-time ↓ | 11 days median: 3 of 5 packs’ Deals signed · 2 still deciding | 26 days: 3 signed of 4 | — | — | before-after, not proof · Other Startups’ results −9 days, ■■■□ Likely, n 640 |
new-paying-customers | 3 Customers on the $2,400 plan | 1.9 (3 in 90 days, per 56) | — | — | before-after |
new-arr ↑ | $7,179, 3 Customers · Booked: credited, not all caused by this Play | $4,467 | — · Worth about +$360 a month | — | before-after · 2 Deals still deciding |
net-new-arr · arr | carried from new-arr | carried | — | — | carried |
The leaf is the median days from an enterprise Quote sent to its signed Agreement. Before against after reads one window against the 90 days before it; it is not proof, and Other Startups’ results print beside it.
How it moves it: the reviewer had the trust page and the approved answers the day the Quote landed: 51 of Summit Row’s 62 questions came back in 2 business days, where by hand the first answers took 9.
Guardrails: before against after: Deals won per enterprise Quote, 3 of 5 against 3 of 4, and wrong answers sent, 0; 4 report releases, 0 to a wrong viewer.
{
"$id": "https://api.sb/leaseline.app/campaigns/trust-pack" ,
"$type": "Campaign",
"play": "play:trust-pack@1" ,
"path": [
"contract-cycle-time",
"new-paying-customers",
"new-arr",
"net-new-arr",
"arr"
],
"experiment": {
"metric": "contract-cycle-time",
"unit": "days",
"heldBack": 0,
"decision": null
},
"readout": {
"value": null,
"n": 3,
"maturing": 2,
"interval": null,
"readability": "inadmissible",
"basis": "before-after",
"pooled": true
},
"ledger": {
"spend": 0,
"workerCost": 1,
"hours": 1.8,
"pipelineArr": 4786,
"wonArr": 7179,
"projectedArr": 359,
"paybackDays": 1
}
}Outside benchmark: a security review adds a median of 17 days to a business software purchase (a buyer survey of 1,100 companies, 2026-06-30).
Before it · After it. Before it: instant-response and cold-email open the Deals, and buying-committee brings the reviewers. After it: sso-rung hears the questionnaire items on single sign-on, data-residency runs inside it for where tenant data is stored, and written-references answers the other half of the same review.
Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days): 5 packs with enterprise Quotes, 2 questionnaires, 4 report releases and 3 questions routed to people. Read every captured thread at ?threads=; three follow the tables.
| What happened, by option | Decisions | Done | Won (credited, not all caused by this Play) |
|---|---|---|---|
| Send the pack with the Quote | 5 | 5 sent by the Deal owner, median 7 min after the Quote | 3 on the $2,400 plan (+$7,179 ARR), 2 still deciding |
| Answer the questionnaire · Release the report · To a person · Hold it for you | 2 · 4 · 2 · 1 | 113 of 124 answered from the library · 4 releases · 2 answered by you · 1 viewer declined | counted above |
| At 2 a month (the Use it when volume) | about 4 in 56 days | before-after, not proof | Other Startups’ results: −9 days, ■■■□ Likely, n 640 |
| Day | Event | What happened | Your time |
|---|---|---|---|
| 0 | event_119 Campaign.created | the three steps; dry run fails approved-pages | 10 min |
| 0–2 | event_126 Site.published | the trust page; you approved the 62 floor answers | 40 min |
| 4 | event_190 Document.rendered | the first questionnaire returned prefilled: 49 of 62 | 15 min |
| 9 | event_301 Role.staffed | AE · Priya Shah (person) takes role:; packs move to her queue | — |
| 27 | event_448 Action.refused | live-answer refused answer 37; the restore test ran and it sent | 10 min |
| 41 | event_701 Campaign.paused | person-promise: a routed question waited 1 day 3 h; you answered it | 15 min |
| 1–56 | event_131 Approval.created, first of 7 | you approved 7 packs and returns; weekly reviews, from the POST /{namespace}/tasks/next log | 20 min · total 1.8 h measured, 1.9 h asked |
Priya → Northgate, Oct 16, 15:02 · Here is your Quote for the $2,400 plan. With it: our trust page, our answers on where tenant data is stored and who can see it, and a link to request our security report.¹ Each answer cites the record behind it.² *Signed with the Role’s disclosure line.*³
Northgate’s IT lead, Oct 17, 09:15 · clicked through the terms; the report released at 09:16 (
POST /{namespace}/things/{thing}/share). Security signed off on Oct 19.
- Restores from backup are tested every month.
+ Backups run nightly; the last restore test passed on 2026-09-21. Alder & Co, 2026-10-04 14:00 · “Can you sign our NDA instead of yours?” · Leaseline, 14:01 · *Thanks. Dana, our founder, reads confidentiality terms and replies by 17:00 tomorrow.*⁴ The Brief went to Dana (
task_470); she agreed their terms at 16:20 the next day.
¹ Only approved answers and the trust page. ² Each answer cites a passing record and its date. ³ The fixed signature line, compiled from the Role’s disclosure Setting. ⁴ The routed line, compiled from the Role’s Settings.
Your settings
---
holdout: 0 # 2.5 Quotes a month is too few to hold any back; it reads before-after
---
Send the trust pack with every Quote at $2,400 a year or more. Release the report only after the click-through.
Questions with no approved answer, and their own terms, come to Dana. $ npx startup-builder show plays/trust-pack
holdout 0 · enterprise line $2,400 a year · terms to Dana your file plays/trust-pack.mdx:2,4,5 (Ask 2026-08-24)
family demand · worker role:sales-engineer, owns never · chooses 5 (3 rule, 2 read) · sequences trust-pack-quote, pending-answer-delivery, trust-change-notice · checks owned-by-a-person, live-answer, agreement, domain, screening, viewer-limit · stops 6 · placements gmail, outlook · also runs data-residency catalog play:trust-pack@1 (Not live yet, gaps #5) Every key from the catalog
Compiled, not written: edit the Play record trust-pack and its Leaseline run, 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.