URL: /plays/risk-reversal-offers · Id: `play:risk-reversal-offers`

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

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.

```text title="Set it up · Ask"
Be our CSM: give every new account Team free for 14 days with no card, guarantee 6 renewal notices sent in the first paid month or the month back without asking, and make the refund one press. Run it in alternating two-week blocks so we can see what it adds. Show me what’s missing; don’t send.
```

```text title="Run one · Ask"
Hand our latest trial start to the CSM agent and show me what it chose and why. Don’t send.
```

```ts title="Run one · SDK"
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 }
```

```json title="Run one · Response · sample"
{
  "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",
      "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"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_5",
      "verb": "Offer.trial",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_5",
      "verb": "CreditGrant.issue",
      "checks": [
        {
          "check": "trial-cost",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingTime",
      "mode": "try",
      "by": "worker_5",
      "verb": "Message.schedule",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "price",
          "status": "pass"
        },
        {
          "check": "claims-resolve",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`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 trial | Choice | Reason |
| --- | --- | --- |
| Larkspur Rentals: a new account, no card, Oct 19 | `reverse-trial` | every new account gets Team for 14 days |
| Marlow Estates paid for Pro inside a guarantee block | `offer-the-guarantee` | eligible, and the block offers it |
| “What if it doesn’t work for our 30 units?” | `answer-the-risk` | the exact terms in force for them |
| Fernhill: “Can you move our 46 units from a spreadsheet?” | `move-their-data` | free migration, with a dry run |
| A window closed at 2 notices sent against the bar of 6 | `pay-the-waiver` | under the bar: the month back, unasked |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$1,700 ARR a month at 43 | 1 h week 1, then 15 min a week | $0.90 per trial, ~$39 a month at 43, plus waivers paid | Day 3: the first guaranteed upgrade paid | 10+ trial starts a week, an output you can count | Under 10 a week: `written-references` · nothing to count: define it (<Op verb="Metric.define" />) |

**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
```bash
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"}'
```


```json title="The dry run’s 422 · 2026-06-29 · sample"
{
  "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"
    }
  ]
}
```

| Check | Fix (one call) | Your time | Wait |
| --- | --- | --- | --- |
| <a id="check-use-when"></a>`use-when` · <a id="check-baseline"></a>`baseline` · pass: 43 trials a month; 19.6 kept paid per 100, n 140 (gaps #8) | <Op verb="Metric.query" /> on `guarantee-lift`, which fills Before in Your number | 1 min | none |
| <a id="check-billing-connected"></a>`billing-connected` · pass: Stripe | <Op verb="Integration.connect" /> with `system` recurring-billing (Stripe) | 0 min | none |
| <a id="check-bar-cap"></a>`bar-cap` · fail: the bar misses 31 % of past first months | <Op verb="Offer.publish" /> with the bar at 6 notices in 30 days | 15 min | none |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): 2 trials have a person owner, Priya | <Op verb="Role.staff" />, or leave it: data moves come to you, and Priya’s 2 get drafts in her queue | 0 min | none |

`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
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| A new account starts, with no card | `trial-started` | `event` on `Offer.trialed` where a new Organization starts the reverse trial, no card | the 14-day trial | your signup posts to <Op verb="Offer.trial" /> |
| A Lead or trial asks whether it is safe to buy | `risk-objection` | `event` on `Objection.raised` where a Lead or trial Customer doubts it is safe to buy | answer within 3d | replies and chats reach <Op verb="Conversation.answer" /> |
| A Customer’s 30-day guarantee window ends | `guarantee-window-closed` | `at` on `Schedule.fired` where the guarantee window's end, counted from the first charge | the verdict within 1d | the 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`) | | | | |

```json title="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
  }
}
```

```bash title="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.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| Start the reverse trial · Refund on one press | It does it | 160 of 160 · 7 of 7 | — | — | <Op verb="Action.redirect" /> on a trial; never on a refund |
| Offer the guarantee · Pay the waiver | It does it, you can stop it | 38 of 38 · 3 of 3 | met on day 14 (the first 10 notices) | a notice fails a Check → You approve each one | <Op verb="Action.cancel" /> on a notice; a waiver owed always pays |
| Answer the risk | You approve each one | 12 of 13 (1 refused) | at 20 passed in a row | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Move their data free · To the AE | It does it | 9 of 9 · 2 of 2 | — | — | <Op verb="Task.claim" /> |
| Change the bar | You approve each one; new Customers only | 0 merged | never | — | <Op verb="Change.merge" /> · <Op verb="Change.revert" /> |
| Never: risk-free beyond the terms, a save offer in front of a refund, a bar over the 25 % miss line | Refused, every time | 1 answer refused | never | — | 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 <Op verb="Offer.trial" />, <Op verb="Conversation.answer" />, <Op verb="Integration.sync" />, <Op verb="CreditGrant.issue" />, <Op verb="Invoice.refund" />, <Op verb="Conversation.escalate" />, <Op verb="Task.assign" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="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. <Op verb="Role.staff" /> seats it.

```bash
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
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
| --- | --- | --- | --- | --- | --- |
| Start the reverse trial `reverse-trial` | a new account, no card | Your rule (line 3) | <Op verb="Offer.trial" /> on Team for 14 days → `reverse-trial-notices` | the Customer’s press to subscribe | the same |
| Offer the guarantee `offer-the-guarantee` | an eligible account pays, in a guarantee block | Your rule (line 4) | `guarantee-notices`: the bar, the window, the remedy, the sheet | nobody | the same |
| Answer the risk `answer-the-risk` | a doubt about whether it is safe to buy | Agent’s call, with its reason | <Op verb="Conversation.answer" /> with the exact terms and the waiver rate | you approve it · Take this one | you |
| Move their data free `move-their-data` | they ask to move data in, or import from another tool | Agent’s call, with its reason | <Op verb="Integration.sync" /> dry run → `migration-updates`, undo for 30 days | Onboarding, so you, due 1 business day · Take this one | you |
| Pay the waiver `pay-the-waiver` | the window closed under the bar, or it cannot be scored | Your rule (line 4) | <Op verb="CreditGrant.issue" /> for the month → the verdict notice | nobody; it pays unasked | the same |
| Refund on one press `refund-on-press` | they press refund inside the window | Your rule (Refunds stand) | <Op verb="Invoice.refund" /> → `refund-confirmation`, with the rail’s settlement time | nobody | the same |
| To the AE `to-the-ae` | terms beyond the sheet | Agent’s call, with its reason | <Op verb="Conversation.escalate" /> → <Op verb="Task.assign" /> | <Op verb="Task.assign" /> → AE · Priya Shah, due 1 business day · Take this one | you |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | “OK, we’ll keep Team after the trial.” | the one-press subscribe link; the guarantee starts with the first charge in a guarantee block | the Customer | — | <Op verb="Subscription.switch" /> (theirs) |
| Send me pricing | “What do we pay after the 14 days?” | Team’s and Pro’s live Prices, and what Free keeps | CSM · your agent | 5 min | <Op verb="Conversation.answer" /> |
| Not now | “We’ll drop to free and see.” | the trial notices stop; Free keeps every record | nobody | at once | <Op verb="Decision.list" /> |
| Wrong person | “Our owner decides on billing.” | asks them to forward the sheet link; it never writes to an address from their text | CSM · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply until Oct 27 | the next notice waits; the trial’s end date does not move | nobody | the return date | <Op verb="Message.schedule" /> |
| Question it can’t answer | “Would you guarantee it for our whole portfolio?” | To the AE: terms beyond the sheet | AE · Priya Shah | 1 business day | <Op verb="Conversation.escalate" /> |
| Stop | “Stop the emails.” | promotional notices stop; the verdict and the refund confirmation still send | nobody | at once | <Op verb="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).

```json title="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 <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, or <Op verb="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 <Op verb="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:** <Op verb="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 |
| --- | --- | --- | --- |
| <a id="check-owned-by-a-person"></a>`owned-by-a-person` (rule j; gaps #8) | a notice to a trial whose open Deal a person owns, or whose Conversation a person claimed | Leave it to the person who owns it: the draft waits in their queue. | <Op verb="Task.assign" /> |
| <a id="check-claims-resolve"></a>`claims-resolve` (hub) | a sentence that calls the Offer safe beyond its written terms, or a typical result with no outcome Fact | State the exact bar, window and remedy, with the sheet link. | <Op verb="Content.draft" /> |
| <a id="check-price"></a>`price` (gaps #1) | a Price in a notice that differs from the Offer’s live Price | Quote the Pricing Page’s live Price. | <Op verb="Approval.approve" /> |
| <a id="check-exit-never-waits"></a>`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 cancel | Remove the step: the refund completes on one press. | <Op verb="Invoice.refund" /> |
| `bar-cap` (the record’s Bar cap) | a bar whose past miss share is 25 % or more, whoever proposes it | Set the bar at the 15th percentile of your own first months. | <Op verb="Offer.publish" /> |
| <a id="check-sheet-lock"></a>`sheet-lock` (the record’s Sheet lock) | an edit to a sheet version a Customer has accepted | Publish a new version; it reaches new Customers only. | <Op verb="Offer.publish" /> |
| <a id="check-customer-side"></a>`customer-side` (the record’s Customer side) | a verdict against a Customer when the window cannot be scored, or an Incident blocked an obligation | Nothing to do: the waiver pays. | <Op verb="CreditGrant.issue" /> |
| <a id="check-trial-cost"></a>`trial-cost` (the record’s Trial cost cap) | a costly lease read past the trial’s Credit Grant | Free Limits apply after the grant, stated in the Product. | <Op verb="Entitlement.check" /> |
| <a id="check-evaluator-lock"></a>`evaluator-lock` (the record’s Evaluator lock) | a change to the Evaluator version inside an open window | Pin the new version to windows that open after it. | <Op verb="Change.merge" /> |
| <a id="check-obligation-void"></a>`obligation-void` (the record’s Obligation void) | voiding a guarantee before 2 help Messages and 3 days past the due day | Send the help Messages; the guarantee stands until then. | <Op verb="Message.schedule" /> |
| <a id="check-cluster"></a>`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 months | Offer the plain trial; the account keeps every other term. | <Op verb="Offer.trial" /> |
| <a id="check-count-check"></a>`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. | <Op verb="Integration.sync" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-waiver-ceiling"></a>`waiver-ceiling` | waived windows above 25 % of closed windows over 60 days, with 20 or more closed | new guaranteed acceptances pause at once; open windows run and pay |
| <a id="stop-second-trip"></a>`second-trip` | 2 waiver-ceiling trips in 90 days | the guarantee retires on that Offer until a fix ships |
| <a id="stop-waiver-watch"></a>`waiver-watch` | a waiver rate above 15 % on the same base | the cause split comes to you; an Issue per cause |
| <a id="stop-exposure"></a>`exposure` | open exposure reaches the guarantee Limit | new guaranteed acceptances pause; an Approval goes to you |
| <a id="stop-refund-share"></a>`refund-share` | self-serve refunds above 10 % of first charges over 30 days, with 50 or more | a Product Issue with the reasons |
| <a id="stop-dispute"></a>`dispute` | Disputes at 0.5 % of a month’s charges | new reverse trials and guarantees pause; Billing, so you, is alerted |
| <a id="stop-migration-cap"></a>`migration-cap` | one move’s spend reaches 50 % of the first period’s Price | it pauses; an Approval goes to you |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | every 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.

```json title="The captured refusal · sample"
{
  "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"
    }
  ]
}
```


```json title="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 <Op verb="Metric.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`

| Node | Agent half (guarantee blocks) | Your half (no guarantee) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `guarantee-lift` | 31.3 kept paid per 100 trials (15 of 48) | 19.6 (9 of 46) | +11.7 [−5.7, 29.1] | ■□□□ Too early to tell | alternating 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-customers` | 26.3 per 100 (21 of 80) paid by day 30 | 18.8 (15 of 80) | +7.5 [−5.4, 20.4] · Not carrying up yet | ■□□□ Too early to tell | the 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 tell | carried 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.

```json title="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 option | Decisions | Result (counts) | Kept paid (credited, not all caused by this Play) |
| --- | --- | --- | --- |
| Start the reverse trial | 160 | 41 subscribed by day 14 | counted below |
| Offer the guarantee · Pay the waiver | 38 · 3 | 22 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 AE | 13 · 9 · 7 · 2 | 1 refused, rewritten · 9 moved · 7 refunded, p95 6 s · 1 Quote open | — |
| **Guarantee blocks** · blocks without | **80** · 80 trials | **21** paid by day 30 · 15 | **15** of 48 · 9 of 46 |
| At 10 trials a week (the Use it when volume) | about 160 in 112 days | alternating blocks at random | Other Startups’ results: +8.4 per 100, ■■■□ Likely, n 5,300 |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_9302` Campaign.created | the three steps; the dry run fails `bar-cap` | 20 min |
| 0 | `event_9305` Offer.published | the sheet, version 1: 6 notices in 30 days, the month back | 15 min |
| 3 | `event_9318` Invoice.paid | the first guaranteed upgrade paid | — |
| 14 | `event_9361` Role.updated | promoted: guarantee notices send after a 2-minute hold | — |
| 47 | `event_9420` CreditGrant.issued | the first waiver: 2 notices against 6, $29 back, unasked | — |
| 88 | `event_9488` Campaign.paused | `migration-cap` on the Harbor Row move; you approved $16.40 | 6 min |
| 1–112 | `event_9311` Approval.created, first of 13 | you approved 12 answers; `claims-resolve` refused 1, rewritten once and sent; 9 data moves; weekly reviews | 2 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.

```diff title="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
```mdx title="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 | <a id="tactic-guarantee-sheet"></a>`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 | <a id="tactic-guarantee-window"></a>`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 | <a id="tactic-reverse-trial"></a>`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 | <a id="tactic-instant-refund"></a>`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 | <a id="tactic-free-migration"></a>`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 | <a id="tactic-risk-answer"></a>`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 | <a id="tactic-guarantee-switchback"></a>`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 | <a id="tactic-send-gate-check"></a>`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 | <a id="trigger-trial-started"></a>`trial-started` | Trial started: `event` on `Offer.trialed`, window 14d. |
| Trigger | <a id="trigger-trial-ending"></a>`trial-ending` | Trial ending: `at` on `Offer.trialed`, window 3d. |
| Trigger | <a id="trigger-risk-objection"></a>`risk-objection` | Risk objection: `event` on `Objection.raised`, window 3d. |
| Trigger | <a id="trigger-guarantee-started"></a>`guarantee-started` | Guarantee started: `event` on `Invoice.paid`, window 45d. |
| Trigger | <a id="trigger-migration-requested"></a>`migration-requested` | Migration requested: `event` on `Import.requested`, window 2d. |
| Trigger | <a id="trigger-obligation-missed"></a>`obligation-missed` | Obligation missed: `state` on `Obligation.missed`, window 3d. |
| Trigger | <a id="trigger-guarantee-at-risk"></a>`guarantee-at-risk` | Guarantee at risk: `threshold` on `Guarantee.flagged`, window 15d. |
| Trigger | <a id="trigger-guarantee-window-closed"></a>`guarantee-window-closed` | Guarantee window closed: `at` on `Schedule.fired`, window 1d. |
| Trigger | <a id="trigger-refund-pressed"></a>`refund-pressed` | Refund pressed: `event` on `Refund.requested`, window 1h. |
| Trigger | <a id="trigger-waiver-rate-high"></a>`waiver-rate-high` | Waiver rate high: `threshold` on `Threshold.crossed`, window 1d. |
| Trigger | <a id="trigger-first-rival-import"></a>`first-rival-import` | First rival import: `event` on `Collection.imported`, window 30d. |
| Sequence | <a id="sequence-reverse-trial-notices"></a>`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 | <a id="sequence-guarantee-notices"></a>`guarantee-notices` | Guarantee notices: 5 steps; it ends on The verdict is sent; A refund ends the Subscription first. |
| Sequence | <a id="sequence-refund-confirmation"></a>`refund-confirmation` | Refund confirmation: 1 steps; it ends on The Message is sent. |
| Sequence | <a id="sequence-migration-updates"></a>`migration-updates` | Migration updates: 3 steps; it ends on A commit; An undo; A written stop; Day 7. |