Skip to content

Risk-reversal offers

Takes the risk off the buyer: a written results-or-free bar, a 14-day top-tier trial with no card, a one-press refund and free data moves.

Channel
Offers and Deals
Run oneMode try
You, to your agent

Hand our latest trial start to the CSM agent and show me what it chose and why. Don’t send.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Offer.trialed%22%2C%20%22Objection.raised%22%2C%20%22Invoice.paid%22%2C%20%22Import.requested%22%2C%20%22Obligation.missed%22%2C%20%22Guarantee.flagged%22%2C%20%22Schedule.fired%22%2C%20%22Refund.requested%22%2C%20%22Threshold.crossed%22%2C%20%22Collection.imported%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_9540"}'

# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22customer_66%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%22customer_66%22" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const { events: [last] } = await $.Event.list({ where: 'name in ("Offer.trialed", "Objection.raised", "Invoice.paid", "Import.requested", "Obligation.missed", "Guarantee.flagged", "Schedule.fired", "Refund.requested", "Threshold.crossed", "Collection.imported")', 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 (\"Offer.trialed\", \"Objection.raised\", \"Invoice.paid\", \"Import.requested\", \"Obligation.missed\", \"Guarantee.flagged\", \"Schedule.fired\", \"Refund.requested\", \"Threshold.crossed\", \"Collection.imported\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_9540"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"customer_66\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"customer_66\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Offer.trialed\", \"Objection.raised\", \"Invoice.paid\", \"Import.requested\", \"Obligation.missed\", \"Guarantee.flagged\", \"Schedule.fired\", \"Refund.requested\", \"Threshold.crossed\", \"Collection.imported\")', 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"
  }
}
Response200application/json
{
  "decision": {
    "$id": "https://api.sb/leaseline.app/decisions/decision_811",
    "$type": "Decision",
    "choice": "reverse-trial",
    "reason": "a new account with no card on Oct 19, inside block 8 (a guarantee block, Oct 12–25)",
    "stakes": "low",
    "options": [
      "reverse-trial",
      "offer-the-guarantee",
      "answer-the-risk",
      "move-their-data",
      "pay-the-waiver",
      "refund-on-press",
  …
sample · 4 Not live yetPreview

On PATCH /{namespace}/campaigns/{id}Off PATCH /{namespace}/campaigns/{id}Take this one POST /{namespace}/tasks/{task}/claim

action_2 caps the trial’s costly lease reads at its Credit Grant. action_3 is the day-1 trial notice; the day-12 notice states the drop to Free and the loss list, counted from what this account made.

+11.7 kept paid per 100 trials · ■□□□ Too early to tell · n 94 matured · path → arr

Try another: the trialChoiceReason
Larkspur Rentals: a new account, no card, Oct 19reverse-trialevery new account gets Team for 14 days
Marlow Estates paid for Pro inside a guarantee blockoffer-the-guaranteeeligible, and the block offers it
“What if it doesn’t work for our 30 units?”answer-the-riskthe exact terms in force for them
Fernhill: “Can you move our 46 units from a spreadsheet?”move-their-datafree migration, with a dry run
A window closed at 2 notices sent against the bar of 6pay-the-waiverunder the bar: the month back, unasked

Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Guarantee lift → New paying Customers → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +11.7 kept paid per 100 trials × 43 trial starts a month × $347 Pro ARR ≈ +$1,746. Under First signal: At 43 trials a month in alternating blocks, about 22 weeks to tell a +10 lift at day 60; at 10 a week, about 30.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Offer.trialed · first trial notice 40 s after signup · 9 keys Not live yet

Start it this week

Terminal
npx startup-builder add play risk-reversal-offers   # 1 · writes plays/risk-reversal-offers.mdx (Not live yet, gaps #5)

# 2 · dry run; below, its 422 on 2026-06-29
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":"risk-reversal-offers"}'

# 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":"risk-reversal-offers"}'

# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/risk-reversal-offers \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":null}'

# off: no new guarantees; owed waivers and in-terms refunds still pay
curl -X PATCH https://api.sb/leaseline.app/campaigns/risk-reversal-offers \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
422Refusedrisk-reversal-offers can’t start yet: 1 check fails and 1 warns.
CheckFixThen
use-when pass · Not live yet, gaps #8Keep 10 or more trial starts a week, or run written-references.POST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #8Read it once; it fills Before in Your number.POST /{namespace}/metrics/query
billing-connected pass · Not live yet, gaps #8Connect Stripe so waivers and refunds pay without a person.POST /{namespace}/integrations/connect
bar-cap failSet the bar at the 15th percentile: 6 notices in 30 days.POST /{namespace}/offers/{offer}/publish
role-unstaffed warn · Not live yet, gaps #8Staff Onboarding, or leave it: data moves come to you, and Priya’s 2 get drafts.POST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "risk-reversal-offers can’t start yet: 1 check fails and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "43 trial starts in 30 days; renewal notices counted per Customer",
      "doc": "/plays/risk-reversal-offers#check-use-when",
      "fix": "Keep 10 or more trial starts a week, or run written-references.",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "19.6 kept paid per 100 trials at day 60, n 140 in 90 days",
      "doc": "/plays/risk-reversal-offers#check-baseline",
      "fix": "Read it once; it fills Before in Your number.",
      "then": "Metric.query"
    },
    {
      "check": "billing-connected",
      "status": "pass",
      "observed": "Stripe: Subscriptions, Credit Grants and refunds live",
      "doc": "/plays/risk-reversal-offers#check-billing-connected",
      "fix": "Connect Stripe so waivers and refunds pay without a person.",
      "then": "Integration.connect"
    },
    {
      "check": "bar-cap",
      "status": "fail",
      "observed": "the proposed bar, 10 notices in 30 days, missed 31 % of past first months",
      "doc": "/plays/risk-reversal-offers#check-bar-cap",
      "fix": "Set the bar at the 15th percentile: 6 notices in 30 days.",
      "then": "Offer.publish"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "onboarding-specialist",
        "billing-specialist"
      ],
      "owned": 2,
      "doc": "/plays/risk-reversal-offers#check-role-unstaffed",
      "fix": "Staff Onboarding, or leave it: data moves come to you, and Priya’s 2 get drafts.",
      "then": "Role.staff"
    }
  ]
}

It says no, says why, and names the fix.

CheckFix (one call)Your timeWait
use-when · baseline · pass: 43 trials a month; 19.6 kept paid per 100, n 140 (gaps #8)POST /{namespace}/metrics/query on guarantee-lift, which fills Before in Your number1 minnone
billing-connected · pass: StripePOST /{namespace}/integrations/connect with system recurring-billing (Stripe)0 minnone
bar-cap · fail: the bar misses 31 % of past first monthsPOST /{namespace}/offers/{offer}/publish with the bar at 6 notices in 30 days15 minnone
role-unstaffed · warn (gaps #8): 2 trials have a person owner, PriyaPOST /{namespace}/roles/{role}/staff, or leave it: data moves come to you, and Priya’s 2 get drafts in her queue0 minnone

Your number · Before 19.6 · Now 31.3 kept paid per 100 trials · Target 30 by Dec 31 · ■□□□ Too early to tell · n 94 matured

Each reverse trial costs about $0.80 in lease reads under its Credit Grant, and each notice $0.04 (Worker cost); a free data move about $1.20. Waivers cost the month they credit back: 3 so far, $87. That comes to about $39 a month at 43 trials, plus waivers.

When it starts

WhenTrigger idStarts onWindowHow it gets in
A new account starts, with no cardtrial-startedevent on Offer.trialed where a new Organization starts the reverse trial, no cardthe 14-day trialyour signup posts to POST /{namespace}/offers/{offer}/trial
A Lead or trial asks whether it is safe to buyrisk-objectionevent on Objection.raised where a Lead or trial Customer doubts it is safe to buyanswer within 3dreplies and chats reach POST /{namespace}/conversations/{conversation}/answer
A Customer’s 30-day guarantee window endsguarantee-window-closedat on Schedule.fired where the guarantee window's end, counted from the first chargethe verdict within 1dthe window’s end, from the first charge
+ 8 more for guarantee starts, data moves, missed obligations, at-risk windows, refund presses, waiver rates, trial ends and imports (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_9540",
  "$type": "Event",
  "name": "Offer.trialed",
  "at": "2026-10-19T11:20:05Z",
  "seq": 9540,
  "data": {
    "customer": "customer_66",
    "offer": "leaseline-team",
    "days": 14,
    "card": false,
    "block": 8,
    "guarantee": true
  }
}
Reproduce it in test
npx startup-builder trigger Offer.trialed --like event_9540   # replays the trial start
npx startup-builder clock advance --by 14d   # runs the day-12 notice and the drop to Free
npx startup-builder listen Offer.trialed --forward-to http://localhost:3000/hook

Who runs it

CSM · your agent (role:success-manager, worker_5) holds the Key Result. Data moves go to the Onboarding Role, unstaffed, so you (Dana Okafor, person, worker_1); terms beyond the sheet go to AE · Priya Shah (person) (role:sales-lead, worker_3). Waivers and refunds pay through Stripe with no person in front of them. Your number links to Did it work.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Start the reverse trial · Refund on one pressIt does it160 of 160 · 7 of 7——POST /{namespace}/actions/{action}/redirect on a trial; never on a refund
Offer the guarantee · Pay the waiverIt does it, you can stop it38 of 38 · 3 of 3met on day 14 (the first 10 notices)a notice fails a Check → You approve each onePOST /{namespace}/actions/{action}/cancel on a notice; a waiver owed always pays
Answer the riskYou approve each one12 of 13 (1 refused)at 20 passed in a row—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Move their data free · To the AEIt does it9 of 9 · 2 of 2——POST /{namespace}/tasks/{task}/claim
Change the barYou approve each one; new Customers only0 mergednever—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: risk-free beyond the terms, a save offer in front of a refund, a bar over the 25 % miss lineRefused, every time1 answer refusednever—nothing; the Checks hold it

What it reads · What it may call. It reads each account’s own counted notices against the bar, its Subscription and charges from Stripe, and the block the trial started in. A refund press and a cancel never wait on the agent (exit-never-waits). Its tools are POST /{namespace}/offers/{offer}/trial, POST /{namespace}/conversations/{conversation}/answer, POST /{namespace}/integrations/{integration}/sync, POST /{namespace}/credit-grants/issue, POST /{namespace}/invoices/{invoice}/refund, POST /{namespace}/conversations/{conversation}/escalate, POST /{namespace}/tasks/{task}/assign, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:risk-reversal-offers@1 · each line names its record key
You hold the CSM Key Result: 30 kept paid per 100 trials at day 60 by 2026-12-31. ← worker, metric
On each Trigger, choose one option and say why.                                  ← triggers, chooses
The bar: 6 renewal notices sent in the first 30 paid days, or the month back.    ← your file, line 4
Pay a waiver unasked; a window you cannot score pays.                            ← customer-side
State the exact terms in force for that person, and the sheet link.              ← copyRules 1, 11; tactic risk-answer
Never mention a refund they did not ask about, except the verdict.               ← copyRules 12

The slow loop. The bar locked per Customer at acceptance (sheet-lock), and no Change was merged in the window, so there is no replay or read-back to print. The waiver rate, 3 of 22 closed windows, stays under the 15 % watch line.

Bring your own agent (folded) starts at It does it, you can stop it for notices when it matches the seated agent on the eval suite; refunds and waivers never wait on any agent. POST /{namespace}/roles/{role}/staff seats it.

Terminal
npx startup-builder eval --scenario risk-reversal-offers-160 --agent "claude -p" --seat success-manager   # seated: every waiver paid unasked, 0 Checks failed sent, refund p95 6 s · yours: 1 waiver paid a day late

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Start the reverse trial reverse-triala new account, no cardYour rule (line 3)POST /{namespace}/offers/{offer}/trial on Team for 14 days → reverse-trial-noticesthe Customer’s press to subscribethe same
Offer the guarantee offer-the-guaranteean eligible account pays, in a guarantee blockYour rule (line 4)guarantee-notices: the bar, the window, the remedy, the sheetnobodythe same
Answer the risk answer-the-riska doubt about whether it is safe to buyAgent’s call, with its reasonPOST /{namespace}/conversations/{conversation}/answer with the exact terms and the waiver rateyou approve it · Take this oneyou
Move their data free move-their-datathey ask to move data in, or import from another toolAgent’s call, with its reasonPOST /{namespace}/integrations/{integration}/sync dry run → migration-updates, undo for 30 daysOnboarding, so you, due 1 business day · Take this oneyou
Pay the waiver pay-the-waiverthe window closed under the bar, or it cannot be scoredYour rule (line 4)POST /{namespace}/credit-grants/issue for the month → the verdict noticenobody; it pays unaskedthe same
Refund on one press refund-on-pressthey press refund inside the windowYour rule (Refunds stand)POST /{namespace}/invoices/{invoice}/refund → refund-confirmation, with the rail’s settlement timenobodythe same
To the AE to-the-aeterms beyond the sheetAgent’s call, with its reasonPOST /{namespace}/conversations/{conversation}/escalate → POST /{namespace}/tasks/{task}/assignPOST /{namespace}/tasks/{task}/assign → AE · Priya Shah, due 1 business day · Take this oneyou
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“OK, we’ll keep Team after the trial.”the one-press subscribe link; the guarantee starts with the first charge in a guarantee blockthe Customer—POST /{namespace}/subscriptions/{subscription}/switch (theirs)
Send me pricing“What do we pay after the 14 days?”Team’s and Pro’s live Prices, and what Free keepsCSM · your agent5 minPOST /{namespace}/conversations/{conversation}/answer
Not now“We’ll drop to free and see.”the trial notices stop; Free keeps every recordnobodyat onceGET /{namespace}/decisions
Wrong person“Our owner decides on billing.”asks them to forward the sheet link; it never writes to an address from their textCSM · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply until Oct 27the next notice waits; the trial’s end date does not movenobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Would you guarantee it for our whole portfolio?”To the AE: terms beyond the sheetAE · Priya Shah1 business dayPOST /{namespace}/conversations/{conversation}/escalate
Stop“Stop the emails.”promotional notices stop; the verdict and the refund confirmation still sendnobodyat oncePOST /{namespace}/contacts/{contact}/unsubscribe

When it hands to you

Data moves come to you, because the Onboarding Role has no person; terms beyond the sheet go to AE · Priya Shah (person). Waivers and refunds go to no one: they pay. One Brief per Role, as captured (brief is Not live yet, gaps #7).

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_833",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-15T17:00:00Z",
    "on": "customer_61",
    "brief": {
      "who": "Fernhill Property Co, trial",
      "said": "Can you move our 46 units from a spreadsheet?",
      "chose": "move-their-data",
      "why": "free migration is part of the Offer",
      "dryRun": "46 units, 52 leases mapped; 3 rows with no lease end",
      "never": [
        "a charge for the move"
      ]
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_821",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-08T15:00:00Z",
    "on": "customer_58",
    "brief": {
      "who": "Northgate Residential, 220 units",
      "said": "Would you guarantee it for our whole portfolio?",
      "chose": "to-the-ae",
      "why": "terms beyond the sheet",
      "never": [
        "a bar the sheet does not hold",
        "risk-free"
      ]
    }
  }
]

Each 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 notices to that account wait for them (claimedByPerson, Not live yet, gaps #7). A Task nobody claims by its due time goes up a Role through POST /{namespace}/tasks/{task}/escalate, and person-promise fires.

On time: you, 9 of 9 data moves within 1 business day, median 5 h, n 9; AE · Priya Shah, 2 of 2, n 2, ■□□□ Too early to tell beside Other Startups’ 93 % on time. Your queue: in week 1, 6 answers to approve and 1 weekly review; then about 1 data move and 1 answer 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)RefusesFixThen
owned-by-a-person (rule j; gaps #8)a notice to a trial whose open Deal a person owns, or whose Conversation a person claimedLeave it to the person who owns it: the draft waits in their queue.POST /{namespace}/tasks/{task}/assign
claims-resolve (hub)a sentence that calls the Offer safe beyond its written terms, or a typical result with no outcome FactState the exact bar, window and remedy, with the sheet link.POST /{namespace}/content/draft
price (gaps #1)a Price in a notice that differs from the Offer’s live PriceQuote the Pricing Page’s live Price.POST /{namespace}/approvals/{approval}/approve
exit-never-waits (the record’s Refunds stand; gaps #3)any form, save offer or Approval in front of an in-terms refund or a cancelRemove the step: the refund completes on one press.POST /{namespace}/invoices/{invoice}/refund
bar-cap (the record’s Bar cap)a bar whose past miss share is 25 % or more, whoever proposes itSet the bar at the 15th percentile of your own first months.POST /{namespace}/offers/{offer}/publish
sheet-lock (the record’s Sheet lock)an edit to a sheet version a Customer has acceptedPublish a new version; it reaches new Customers only.POST /{namespace}/offers/{offer}/publish
customer-side (the record’s Customer side)a verdict against a Customer when the window cannot be scored, or an Incident blocked an obligationNothing to do: the waiver pays.POST /{namespace}/credit-grants/issue
trial-cost (the record’s Trial cost cap)a costly lease read past the trial’s Credit GrantFree Limits apply after the grant, stated in the Product.POST /{namespace}/entitlements/check
evaluator-lock (the record’s Evaluator lock)a change to the Evaluator version inside an open windowPin the new version to windows that open after it.POST /{namespace}/changes/{change}/merge
obligation-void (the record’s Obligation void)voiding a guarantee before 2 help Messages and 3 days past the due daySend the help Messages; the guarantee stands until then.POST /{namespace}/messages/{message}/schedule
cluster (the record’s Cluster rule)a reverse trial or guarantee for a new account in a cluster with 2 refunded first charges in 12 monthsOffer the plain trial; the account keeps every other term.POST /{namespace}/offers/{offer}/trial
count-check (the record’s Count check)a data move whose counts differ from its dry run by over 0.5 %Fix the count, then rerun the dry run; the Customer hears within 1 h.POST /{namespace}/integrations/{integration}/sync
Stop (pauses the Play)Pauses whenThen
waiver-ceilingwaived windows above 25 % of closed windows over 60 days, with 20 or more closednew guaranteed acceptances pause at once; open windows run and pay
second-trip2 waiver-ceiling trips in 90 daysthe guarantee retires on that Offer until a fix ships
waiver-watcha waiver rate above 15 % on the same basethe cause split comes to you; an Issue per cause
exposureopen exposure reaches the guarantee Limitnew guaranteed acceptances pause; an Approval goes to you
refund-shareself-serve refunds above 10 % of first charges over 30 days, with 50 or morea Product Issue with the reasons
disputeDisputes at 0.5 % of a month’s chargesnew reverse trials and guarantees pause; Billing, so you, is alerted
migration-capone move’s spend reaches 50 % of the first period’s Priceit pauses; an Approval goes to you
kill-switchyou press itevery Tactic pauses; owed waivers and in-terms refunds still pay
+ 2 more: store-billed for app stores, listing guard for listings (?lanes=all)

The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the answer that sent is the Willow Park thread in Example.

422RefusedThe answer to Willow Park did not send: it calls Leaseline completely risk-free.
CheckFixThen
claims-resolve failState the exact bar, window and remedy, with the sheet link.POST /{namespace}/content/draft
price pass · Not live yet, gaps #1—POST /{namespace}/approvals/{approval}/approve
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The answer to Willow Park did not send: it calls Leaseline completely risk-free.",
  "checks": [
    {
      "check": "claims-resolve",
      "status": "fail",
      "doc": "/plays/risk-reversal-offers#check-claims-resolve",
      "fix": "State the exact bar, window and remedy, with the sheet link.",
      "then": "Content.draft"
    },
    {
      "check": "price",
      "status": "pass"
    }
  ]
}

It says no, says why, and names the fix.

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "reason": {
      "limit": "migration-cap",
      "observed": "$16.40",
      "bound": "$14.50, half of Pro’s first month",
      "window": "the Harbor Row move"
    },
    "doc": "/plays/risk-reversal-offers#stop-migration-cap",
    "task": "task_806"
  }
]

Did it work

Two-week blocks with and without the guarantee were alternated at random, 4 of each (rules m–o): the agent half is the guarantee blocks, your half the blocks without. Each figure’s call is POST /{namespace}/metrics/query by node and by block; the leaf and every node above it are Not live yet (gaps #4).

+11.7 kept paid per 100 trials · ■□□□ Too early to tell · n 94 matured · path → arr

Chose
reverse-trial
Why
a new account with no card on Oct 19, inside block 8 (a guarantee block, Oct 12–25)
From
reverse-trial · offer-the-guarantee · answer-the-risk · move-their-data · pay-the-waiver · refund-on-press · to-the-ae
Expects
kept paid at day 60
Reopens when
no Invoice.paid for customer_66 by day 14, or a refund press
By
worker_5
JSON
{
  "$id": "decisions/decision_811",
  "$type": "Decision",
  "choice": "reverse-trial",
  "reason": "a new account with no card on Oct 19, inside block 8 (a guarantee block, Oct 12–25)",
  "stakes": "low",
  "options": [
    "reverse-trial",
    "offer-the-guarantee",
    "answer-the-risk",
    "move-their-data",
    "pay-the-waiver",
    "refund-on-press",
    "to-the-ae"
  ],
  "by": "worker_5",
  "on": "customer_66",
  "expected": "kept paid at day 60",
  "reopensWhen": "no Invoice.paid for customer_66 by day 14, or a refund press"
}
NodeAgent half (guarantee blocks)Your half (no guarantee)AddedConfidenceBasis
guarantee-lift31.3 kept paid per 100 trials (15 of 48)19.6 (9 of 46)+11.7 [−5.7, 29.1]■□□□ Too early to tellalternating two-week blocks at random · 8 blocks · n 94 at day 60 · 66 still maturing · Other Startups’ results +8.4, ■■■□ Likely, n 5,300
new-paying-customers26.3 per 100 (21 of 80) paid by day 3018.8 (15 of 80)+7.5 [−5.4, 20.4] · Not carrying up yet■□□□ Too early to tellthe same blocks
new-arr ↑$5,205, 15 Customers kept on Pro · Booked: credited, not all caused by this Play$3,123, 9 Customers+$1,946 [−$955, +$4,847] · Worth about +$1,700 a month■□□□ Too early to tell (15 vs 9 Customers)the same · 6 still inside their window
net-new-arr · arr+$5,205+$3,123+$1,946, carried: it moves no other bridge term■□□□ Too early to tellcarried from new-arr

The leaf counts trials still paying at day 60 per 100 trial starts in guarantee blocks, minus the same in no-guarantee blocks, to 100 matured on each side; at 48 and 46 the Experiment runs on, and blocks keep alternating.

How it moves it: a buyer at the first charge saw one block with the bar, the window and the remedy, and the refund one press away; 3 of 22 closed windows paid the month back unasked.

Guardrails: treated against held back, under new-paying-customers: refunds in 30 days, 4 of 21 first charges against 3 of 15, and Disputes, 0 against 0.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/risk-reversal-offers",
  "$type": "Campaign",
  "play": "play:risk-reversal-offers@1",
  "path": [
    "guarantee-lift",
    "new-paying-customers",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "guarantee-lift",
    "unit": "per-100",
    "heldBack": 80,
    "decision": null
  },
  "readout": {
    "value": 11.7,
    "n": 94,
    "maturing": 66,
    "interval": [
      -5.7,
      29.1
    ],
    "readability": "inadmissible",
    "basis": "alternating-weeks",
    "pooled": false
  },
  "ledger": {
    "spend": 87,
    "workerCost": 144,
    "hours": 3.4,
    "pipelineArr": 2400,
    "wonArr": 5205,
    "projectedArr": 1746,
    "paybackDays": 20
  }
}

Outside benchmark: this Play’s catalog record carries no sourced range yet, so Other Startups’ results stand in: +8.4 kept paid per 100 trials, ■■■□ Likely, n 5,300.

Before it · After it. Before it: product-led, instant-response and retargeting bring the trials. After it: run-beside holds the first 30 paid days, and review-requests asks Customers who met the bar; a refund press ends it at once.

Example

Leaseline ran it from 2026-06-29 to 2026-10-19 (112 days, 8 two-week blocks): 160 trial starts, 80 in guarantee blocks and 80 in blocks without; 94 have reached day 60. Read every captured thread at ?threads=all; three follow the tables.

What happened, by optionDecisionsResult (counts)Kept paid (credited, not all caused by this Play)
Start the reverse trial16041 subscribed by day 14counted below
Offer the guarantee · Pay the waiver38 · 322 windows closed · 3 credited back ($87)15 kept at day 60, of 48 matured
Answer the risk · Move their data free · Refund on one press · To the AE13 · 9 · 7 · 21 refused, rewritten · 9 moved · 7 refunded, p95 6 s · 1 Quote open—
Guarantee blocks · blocks without80 · 80 trials21 paid by day 30 · 1515 of 48 · 9 of 46
At 10 trials a week (the Use it when volume)about 160 in 112 daysalternating blocks at randomOther Startups’ results: +8.4 per 100, ■■■□ Likely, n 5,300
DayEventWhat happenedYour time
0event_9302 Campaign.createdthe three steps; the dry run fails bar-cap20 min
0event_9305 Offer.publishedthe sheet, version 1: 6 notices in 30 days, the month back15 min
3event_9318 Invoice.paidthe first guaranteed upgrade paid—
14event_9361 Role.updatedpromoted: guarantee notices send after a 2-minute hold—
47event_9420 CreditGrant.issuedthe first waiver: 2 notices against 6, $29 back, unasked—
88event_9488 Campaign.pausedmigration-cap on the Harbor Row move; you approved $16.406 min
1–112event_9311 Approval.created, first of 13you approved 12 answers; claims-resolve refused 1, rewritten once and sent; 9 data moves; weekly reviews2 h 40 min · total 3.4 h measured, 3.5 h asked

Leaseline → Marlow Estates, Sep 2 09:14 · Your guarantee: send 6 renewal notices from Leaseline in your first 30 paid days, or we credit your first month back, without you asking.¹ The full terms: leaseline.app/guarantee.² *Signed with the Role’s disclosure line.*³

Oct 2 09:00 · the verdict: 14 notices sent, bar met. Marlow is still paying at day 60.

Willow Park, 2026-08-11 · the answer claims-resolve refused, then the answer that sent
- Don’t worry, Leaseline is completely risk-free.
+ If you send fewer than 6 renewal notices in your first 30 paid days, your first month is credited back automatically. Refunds are one press for 14 days.

Fernhill Property Co, 2026-10-14 16:30 · “Can you move our 46 units from a spreadsheet?” · Leaseline, 16:31 · *Yes, free. Dana, our founder, checks the dry run with you by tomorrow 17:00.*⁴ The Brief went to you (task_833); you approved the move at 11:20, and the 30-day undo stayed open.

¹ One block: the bar, the window, the obligation and the remedy. ² The sheet, one click away, dated. ³ The fixed signature line, compiled from the Role’s disclosure Setting. ⁴ The routed line, compiled from the Role’s Settings.

Your settings

plays/risk-reversal-offers.mdx
---
holdout: blocks    # two-week blocks with and without the guarantee, at random
---
Every new account gets Team free for 14 days, no card, then Free.
The bar: 6 renewal notices in the first 30 paid days, or the first month back, unasked.
Refunds are one press for 14 days; data moves are free.
Text
$ npx startup-builder show plays/risk-reversal-offers
holdout blocks · reverse trial Team 14 days · bar 6 notices in 30 days · refund 14 days     your file  plays/risk-reversal-offers.mdx:2,4,5,6 (Ask 2026-06-29)
worker role:success-manager, owns never · chooses 7 (4 rule, 3 read) · sequences reverse-trial-notices, guarantee-notices, refund-confirmation, migration-updates · approval every-send · checks owned-by-a-person, claims-resolve, price, exit-never-waits, bar-cap, sheet-lock, customer-side, trial-cost, evaluator-lock, obligation-void, cluster, count-check (+2 on store and listing lanes) · stops 8 · placements google-search, bing, gmail, outlook, yahoo-mail    catalog  play:risk-reversal-offers@1 (Not live yet, gaps #5)

Every key from the catalog

Key Id What it is
Tactic guarantee-sheet Guarantee sheet sets a results-or-free bar at the 15th percentile of the Startup’s own first-month counts on one Product output, and publishes it dated. Starts at You approve each one.
Tactic guarantee-window Guarantee window runs one Customer’s guarantee from the first charge to a verdict, helps with each obligation, and issues any waiver through Stripe unasked. Starts at You approve each one.
Tactic reverse-trial Reverse trial gives a new Organization the top paid tier for 14 days with no card, then drops it to the free Offer. Starts at You approve each one.
Tactic instant-refund Instant refund refunds a new paid Subscription’s first charge through Stripe on one press inside the published window, with no form, save offer or approval. Starts at Sends nothing.
Tactic free-migration Free migration imports a new Customer’s data at no charge, with a dry run, a mapping report and a 30-day one-action undo. Starts at You approve each one.
Tactic risk-answer Risk answer meets a risk objection with the exact terms in force for that Person, the sheet link and the published waiver rate. Starts at You approve each one.
Tactic guarantee-switchback Guarantee switchback alternates the guarantee in 2-week block pairs per Market, reads kept-paid lift and waivers, and pauses new guarantees past 25 percent. Starts at Sends nothing.
Tactic send-gate-check Send gate check: Checks Suppression, a live reason, the Market, the basis stamp, the Person-month grant, the facts and the labels before any cold Message exists. Starts at Sends nothing.
Trigger trial-started Trial started: event on Offer.trialed, window 14d.
Trigger trial-ending Trial ending: at on Offer.trialed, window 3d.
Trigger risk-objection Risk objection: event on Objection.raised, window 3d.
Trigger guarantee-started Guarantee started: event on Invoice.paid, window 45d.
Trigger migration-requested Migration requested: event on Import.requested, window 2d.
Trigger obligation-missed Obligation missed: state on Obligation.missed, window 3d.
Trigger guarantee-at-risk Guarantee at risk: threshold on Guarantee.flagged, window 15d.
Trigger guarantee-window-closed Guarantee window closed: at on Schedule.fired, window 1d.
Trigger refund-pressed Refund pressed: event on Refund.requested, window 1h.
Trigger waiver-rate-high Waiver rate high: threshold on Threshold.crossed, window 1d.
Trigger first-rival-import First rival import: event on Collection.imported, window 30d.
Sequence reverse-trial-notices Reverse trial notices: 5 steps; it ends on The Customer subscribes; A written stop; An unsubscribe from promotional Messages; The account is deleted; Day 30.
Sequence guarantee-notices Guarantee notices: 5 steps; it ends on The verdict is sent; A refund ends the Subscription first.
Sequence refund-confirmation Refund confirmation: 1 steps; it ends on The Message is sent.
Sequence migration-updates Migration updates: 3 steps; it ends on A commit; An undo; A written stop; Day 7.

Compiled, not written: edit the Play record risk-reversal-offers 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.