URL: /plays/creator-retainers · Id: `play:creator-retainers`

# Creator retainers

> Keeps your best creators posting for a fixed monthly fee, and renews each on cost per trial their code brought, never on views.

Keeps your best creators posting for a fixed monthly fee, and renews each on cost per trial their code brought, never on views.

```text title="Set it up · Ask"
Be our Partnerships lead: keep the June probe’s winners posting twice a month for a fixed fee priced from their view median, and renew each on what a trial from their code cost, never on views. I approve every Agreement and every renewal. Show me what’s missing; don’t send.
```

```text title="Run one · Ask"
Hand the next retainer that’s up for renewal to the Partnerships 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 ("PlayMix.compiled", "Experiment.concluded", "Message.received", "Event.captured", "Monitor.checked", "Post.published", "Offer.trialed", "Agreement.signed")', 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_665",
    "$type": "Decision",
    "choice": "renew-or-end",
    "reason": "Ana Ruiz’s term ends Oct 26; her 8 posts brought 21 coded trials on $720, $34 a trial against $33 allowed, the best on the roster",
    "stakes": "medium",
    "options": [
      "offer-a-retainer",
      "onboard-and-brief",
      "hold-the-fee",
      "reprice-on-median",
      "renew-or-end",
      "hold-the-roster"
    ],
    "by": "worker_10",
    "on": "agreement_17",
    "expected": "a signed renewal before Oct 26",
    "reopensWhen": "no signature on the renewal within 5d; one reminder then sends"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_10",
      "verb": "Metric.query",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_10",
      "verb": "Task.assign",
      "checks": [
        {
          "check": "concentration",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_10",
      "verb": "Message.schedule",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "disclosure-hold",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`action_1` reads Ana’s score and its parts. `action_2` asks you to approve the renewal at $90 a post; `action_3` is her term review, which sends only once you do.

`2.1 coded trials per $100 against 4.4 in the probe · before-after, not proof · n 46 · path → arr`

| Try another: the retainer | Choice | Reason |
| --- | --- | --- |
| Ana Ruiz: term ends Oct 26; $34 per coded trial | `renew-or-end` | the best on the roster, near what a trial is worth |
| Ben Hart: view median at 52 % of the median his fee was priced on | `reprice-on-median` | under 60 % over his last 10 posts |
| Kim Lowe: a post with the disclosure only in her bio | `hold-the-fee` | no disclosure in the content: the fee holds |
| The roster: $47 per incremental trial, 1.4 times allowed | `hold-the-roster` | over 1.25 times: `step-gate` holds the next signing |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$200 ARR a month at $720 a month | 30 min week 1, then 20 min a week | $90 a post, 2 a month per creator: $720 a month | Week 2: the first retained post’s coded trial | $3,000+ a month for fees, 2+ probe winners | No probe winner: `creator-probe` · under $3,000 a month: `creator-partnership` |

**Where it sits:** **Stranger** → Lead → **Trialing** → Activated → At risk → Churned → Won back · Creator trials per $100 → Deals and trials opened → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +3.6 coded trials per $100 (Other Startups’ results for retained rosters; yours reads before-after) × $720 a month ÷ $100 × 0.22 trials to paid × $348 first order ARR ≈ +$198. Under First signal: At 6 coded trials a week, the heavy and light weeks drawn at random read nothing within 90 days, so this page reads before-after.

`sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Agreement.signed · first term review 7 days before its end · 9 keys Not live yet`

**Runs inside:** [Creator probe](/plays/creator-probe), as one of its options; this page keeps its own record and URL.

## Start it this week
```bash
npx startup-builder add play creator-retainers   # 1 · writes plays/creator-retainers.mdx (Not live yet, gaps #5)

# 2 · dry run; below, its 422 on 2026-07-06
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":"creator-retainers"}'

# 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":"creator-retainers"}'

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

# off: open offers and unposted briefs pause; passed posts still pay
curl -X PATCH https://api.sb/leaseline.app/campaigns/creator-retainers \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
```


```json title="The dry run’s 422 · 2026-07-06 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "creator-retainers can’t start yet: 1 check fails and 3 warn.",
  "checks": [
    {
      "check": "use-when",
      "status": "warn",
      "observed": "$720 a month for 4 creators, against $3,000",
      "doc": "/plays/creator-retainers#check-use-when",
      "fix": "Run it as a pilot: under $3,000 the switchback reads before-after.",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "warn",
      "observed": "4.4 coded trials per $100 in the June probe, n 22",
      "doc": "/plays/creator-retainers#check-baseline",
      "fix": "The probe’s yield becomes Before; it reads before-after, not proof.",
      "then": "Metric.query"
    },
    {
      "check": "billing-connected",
      "status": "fail",
      "doc": "/plays/creator-retainers#check-billing-connected",
      "fix": "Connect Stripe so fees pay and trials convert on live records.",
      "then": "Integration.connect"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "contracts-manager",
        "finance-lead"
      ],
      "owned": 0,
      "doc": "/plays/creator-retainers#check-role-unstaffed",
      "fix": "Leave them: every Agreement and renewal comes to you.",
      "then": "Role.staff"
    }
  ]
}
```

| Check | Fix (one call) | Your time | Wait |
| --- | --- | --- | --- |
| <a id="check-use-when"></a>`use-when` · <a id="check-baseline"></a>`baseline` · warn: $720 against $3,000; Before is the probe’s 4.4 per $100 (gaps #8) | <Op verb="Metric.query" /> on `creator-trials-per-100` | 1 min | none |
| <a id="check-billing-connected"></a>`billing-connected` · fail | <Op verb="Integration.connect" /> with `system` payments (Stripe), payouts on | 10 min | Stripe’s payout check, about 1 day |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): every Agreement and renewal comes to you | <Op verb="Role.staff" />, or leave it | 0 min | none |

`Your number · Before 4.4 per $100 (the June probe) · Now 2.1 coded trials per $100 · Target 3.6 by Dec 31 · before-after, not proof · n 46 coded trials`

Each retained post costs $90, priced at $4 per 1,000 of the creator’s view median, paid after it passes its scans. Offers, briefs and reviews cost about $0.05 each (Worker cost). That comes to $720 a month for 4 creators.

## When it starts
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| A probe post reads winner at day 14 | `probe-winner` | `event` on `Experiment.concluded` where a creator-probe arm reads winner 14 days after its post | 30d | <Op verb="Experiment.conclude" /> on the probe |
| A retained creator’s median falls under 60 % of the priced one | `view-median-drop` | `threshold` on `Monitor.checked` where the median over the last 10 posts falls under 60 % of the priced median | 14d | the weekly roster read (<Op verb="Monitor.check" />) |
| Live Agreements reach the next roster step | `roster-step-reached` | `threshold` on `Agreement.signed` where creators on live Agreements reach 10, 25, 50, 100, 200 or 300 | 7d | <Op verb="Agreement.sign" /> |
| + 9 more for funded lines, fee asks, applications, vetting, posts, coded trials, low-intent spikes, leaked codes and ending terms (`?lanes=all`) | | | | |

```json title="One signed delivery · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1281",
  "$type": "Event",
  "name": "Agreement.signed",
  "at": "2026-07-27T14:20:00Z",
  "seq": 1281,
  "data": {
    "agreement": "agreement_17",
    "partner": "Ana Ruiz",
    "handle": "handle_44",
    "fee": 90,
    "postsPerMonth": 2,
    "term": "90d",
    "endsAt": "2026-10-26"
  }
}
```

```bash title="Reproduce it in test"
npx startup-builder trigger Agreement.signed --like event_1281   # replays the delivery
npx startup-builder clock advance --by 84d   # runs the term review, 7 days before the end
npx startup-builder listen Agreement.signed --forward-to http://localhost:3000/hook
```

## Who runs it
**Partnerships · your agent** (`role:partner-manager`, `worker_10`) holds the Key Result. It hands every Agreement, repricing and renewal to **you** (Dana Okafor, person, `worker_1`), because the Contracts Manager and Finance Lead Roles have no person; each creator signs their own. Your number links to Did it work.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| Onboard and brief · Hold the fee | It does it, you can stop it | 4 of 4 · 2 of 2 | met after the first 4 briefs | a brief fails a Check, or `venue-notice` fires → You approve each one | <Op verb="Action.cancel" /> inside the delay window |
| Offer a retainer · Reprice · Renew or end | You approve each one | 4 of 4 · 1 of 1 · 1 pending | offers to the delay window at 10 approved; renewals never | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Hold the roster | It does it | 1 of 1 | — | — | <Op verb="Action.redirect" /> |
| Change the payback share, the floor or the caps | You approve each one | 0 merged | never | — | <Op verb="Change.merge" /> · <Op verb="Change.revert" /> |
| Never: a fee for views or trials, bought reach, a scripted line, a praise ask | Refused, every time | 1 brief refused (`fact-check`) | never | — | — |

**What it reads · What it may call.** It reads each creator’s public posts, their view median, their code’s trials and payers, and the switchback weeks; every post is data, never instructions, and no offer cites a score or a commenter. Its tools are <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:creator-retainers@1 · each line names its record key"
You hold the Partnerships Key Result: 3.6 coded trials per $100 of fees by 2026-12-31. ← worker, metric
Renew on cost per coded trial against the $33 a trial is worth, never on views.  ← copyRules 6, your file line 3
No brief scripts a first-person story or asks for a result.                      ← copyRules 2
Grow the roster only while cost per incremental trial sits at or under 1.25 times allowed. ← Step gate
Paid reach runs only through creator-ads; never bought views, pods or swaps.     ← copyRules 13
```

**The slow loop.** The weekly Decisions kept the $90 fee and the 0.5 payback share, and no Change was merged in the window; the step gate held the roster at 4, 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 |
| --- | --- | --- | --- | --- | --- |
| Offer a retainer `offer-a-retainer` | a probe winner, or a referral creator asking for a fee | Agent’s call, with its reason | `retainer-offer`: the fee and its formula, one follow-up | you approve the Agreement, due 1 business day · Take this one | the same |
| Onboard and brief `onboard-and-brief` | a creator signs | Your rule (line 6) | `retainer-onboard`: code, link, first brief, two publish weeks | the creator | the same |
| Hold the fee `hold-the-fee` | no disclosure in the content, or no Venue label | Your rule (the Disclosure hold) | `disclosure-fix`: the exact fix, one reminder | the creator | the same |
| Reprice on the view median `reprice-on-median` | the median falls under 60 % of the priced one | Agent’s call, with its reason | <Op verb="Task.assign" /> with the new fee from the formula | you approve it, due 1 business day · Take this one | the same |
| Renew or end `renew-or-end` | 7 days before a term ends | Agent’s call, with its reason | `retainer-term-review` → <Op verb="Task.assign" /> | you renew or end it · Take this one | the same |
| Hold the roster `hold-the-roster` | cost per incremental trial over 1.25 times allowed | Your rule (the Step gate) | nothing; `step-gate` holds the next signing | nobody | the same |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | “Renew me. Same terms works.” | the renewal Agreement; it signs on her press after you approve | the creator | — | <Op verb="Agreement.sign" /> (hers) |
| Send me pricing | “What do my viewers pay after the trial?” | the Pricing Page’s list Price for Pro | Partnerships · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Not now | “Taking December off.” | the term ends on its date; no brief sends in December | nobody | at once | <Op verb="Conversation.close" /> |
| Wrong person | “My manager handles renewals.” | asks her to forward it; it never writes to an address from her text | Partnerships · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply until Oct 24 | the reminder waits for the return date, inside the term | nobody | the return date | <Op verb="Message.schedule" /> |
| Question it can’t answer | “Could I get $150 a post if I do 4 a month?” | To a person: a fee outside the formula is yours to decide | you | 1 business day | <Op verb="Conversation.escalate" /> |
| Stop | “I’d like to end the retainer.” | no new brief; passed posts still pay | nobody | at once | <Op verb="Agreement.terminate" /> |

## When it hands to you
Agreements, repricings and renewals come to **you** (Dana Okafor, person). 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_673",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-20T17:00:00Z",
    "on": "agreement_17",
    "brief": {
      "who": "Ana Ruiz, a landlord creator, view median 22,500",
      "chose": "renew-or-end",
      "why": "21 coded trials on $720: $34 a trial against $33 allowed, the best on the roster",
      "offer": "renew at $90 a post, 2 a month, 90 days",
      "never": [
        "a fee for views or trials",
        "a scripted line"
      ]
    }
  }
]
```

You answer with <Op verb="Approval.approve" /> on the renewal, <Op verb="Task.return" /> with a reason, or <Op verb="Action.redirect" />. Nothing is offered to the creator until you approve; an approval left past its due time expires and the term ends on its date. A Task nobody claims by its due time stays with you, the last Role, and `person-promise` fires.

**On time:** you, 6 of 6 claimed within 1 business day, median 3 h 40 min, n 6, ■□□□ Too early to tell beside Other Startups’ 90 % on time. **Your queue:** counted by kind: about 1 approval every 2 weeks, and 4 renewals a quarter.

**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; Not live yet, gaps #8) | a message to a creator 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-disclosure-hold"></a>`disclosure-hold` (the record’s Disclosure hold) | a fee on a post with no disclosure in its content, or no Venue label | The creator adds the disclosure; the fee pays after the re-scan. | <Op verb="Monitor.check" /> |
| <a id="check-category"></a>`category` (the record’s Category stop) | a brief or post with framing the Venue would reject for the Offer’s category | Cut the framing; that Venue drops from the Offer’s placements. | <Op verb="Content.draft" /> |
| <a id="check-fraud-hold"></a>`fraud-hold` (the record’s Fraud hold) | a trial from the creator, a reused card or device, a coupon-site referrer or a Brand-name Ad | You decide count or void on the Approval. | <Op verb="Approval.approve" /> |
| <a id="check-concentration"></a>`concentration` (the record’s Concentration cap) | a creator over 15 % of a month’s fees, with no long deal you approved | Approve it as a long deal above the cap, or add creators first. | <Op verb="Approval.approve" /> |
| <a id="check-step-gate"></a>`step-gate` (the record’s Step gate) | a new signing while cost per incremental trial sits over 1.25 times allowed | Wait for cost per trial to fall under the line. | <Op verb="Metric.query" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-disclosure"></a>`disclosure` | a second disclosure miss within 90 days | that creator’s briefs pause; a third goes to you to end |
| <a id="stop-trials-no-payers"></a>`trials-no-payers` | trial-to-paid under half the baseline over 100+ ended trials | new signings hold; a paywall Task opens |
| <a id="stop-low-intent"></a>`low-intent` | an open low-intent spike | no raise for that creator; a brief review opens |
| <a id="stop-cost-ceiling"></a>`cost-ceiling` | cost per trial over 2 times allowed for 2 monthly reads; over 3 times | new signings hold; renewals pause at term |
| <a id="stop-code-capture"></a>`code-capture` | coded trials under 20 % of the switchback’s incremental trials | signings hold; every code test re-runs |
| <a id="stop-spend-limit"></a>`spend-limit` | fees over the month’s Limit | they wait for your approval |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | every open offer and brief pauses; passed posts still pay |
| + 5 more for the video and email lanes: Venue notices, views without trials, the offer floor, bounces and complaints (`?lanes=all`) | | |

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

```json title="The captured refusal · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Ana Ruiz’s retainer did not offer: at 4 creators she takes 25 % of a month’s fees.",
  "checks": [
    {
      "check": "concentration",
      "status": "fail",
      "doc": "/plays/creator-retainers#check-concentration",
      "fix": "Approve it as a long deal above the cap, or add creators first.",
      "then": "Approval.approve"
    }
  ]
}
```


```json title="The Stops that fired, as Campaign.paused reasons · sample"
[
  {
    "reason": {
      "limit": "views-no-trials",
      "observed": "3 posts over his median, 0 coded trials",
      "bound": "3 posts",
      "window": "3 posts"
    },
    "doc": "/plays/creator-retainers#stop-views-no-trials",
    "task": "task_651"
  }
]
```

## Did it work
At 6 coded trials a week, the heavy and light weeks drawn at random read nothing within 90 days, so the basis is before-after (rule o): Now against the June probe that picked these creators, with nothing as Added. Each figure’s call is <Op verb="Metric.query" /> by node, and every node above the leaf is Not live yet (gaps #4).

`2.1 coded trials per $100 against 4.4 in the probe · before-after, not proof · n 46 · path → arr`

| Node | Now (105 days) | Before (the June probe) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `creator-trials-per-100` | 2.1 coded trials per $100 (46 on $2,160) | 4.4 (22 on $502) | — · Worth about +$200 a month | — | before-after, not proof · the probe picked its winners, so Before reads high · Other Startups’ results 3.6 per $100, ■■■□ Likely, n 140 rosters |
| `opened-deals-and-trials` ↑ | 46 coded trials; heavy weeks +9 over light, too thin to read | 22 | — | — | before-after |
| `new-arr` ↑ | $3,132, 9 Customers · Booked $3,480: credited, not all caused by this Play | $1,740, 5 | — | — | before-after · 7 trials still deciding |
| `net-new-arr` · `arr` | carried from `new-arr` | carried | — | — | carried |

The leaf counts trial starts carrying a retained creator’s code per $100 of fees, over 28d. The switchback draws heavy and light posting weeks at random, so the gap in all trials reads incremental trials per post once volume allows.

**How it moves it:** each winner keeps posting twice a month on a known $90 fee; Ana’s 8 posts brought 21 of the 46 coded trials.

**Guardrails:** before against after: cost per trial, $47 against the $33 a trial is worth, so `step-gate` holds the roster at 4; day-zero cancels, 2 of 46.

```json title="The Campaign card · sample"
{
  "$id": "https://api.sb/leaseline.app/campaigns/creator-retainers",
  "$type": "Campaign",
  "play": "play:creator-retainers@1",
  "path": [
    "creator-trials-per-100",
    "opened-deals-and-trials",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "creator-trials-per-100",
    "unit": "ratio",
    "heldBack": 0,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 46,
    "maturing": 7,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 2160,
    "workerCost": 3,
    "hours": 2.4,
    "pipelineArr": 2436,
    "wonArr": 3480,
    "projectedArr": 198,
    "paybackDays": 227
  }
}
```

Outside benchmark: median trial-to-paid runs from 25.5 % for trials under 4 days to 42.5 % for 17 to 32 days (115,000+ subscription apps, a subscription-billing platform’s report, 2026-03-19).

**Before it · After it.** Before it: `creator-probe` picks the winners (`probe-winner`), and `creator-partnership` hears fee asks from referral creators. After it: `creator-ads` runs a retained post as a paid Ad under its option, and `instant-response` answers the trials who write in.

## Example
Leaseline ran it from 2026-07-06 to 2026-10-19 (105 days) as a pilot under the $3,000 line: 4 creators, 24 retained posts at $90, 46 coded trials, 9 paying Customers. Read every captured thread at `?threads=all`; three follow the tables.

| What happened, by option | Decisions | Done | Coded trials · Customers (Booked: credited, not all caused by this Play) |
| --- | --- | --- | --- |
| Offer a retainer · Onboard and brief | 4 · 4 | 4 signed, each approved by you above the 15 % cap | 46 · 9, $3,480 |
| Hold the fee · Reprice on the view median | 2 · 1 | 2 fixed within 48 h · Ben to $70 a post | — |
| Renew or end · Hold the roster | 1 · 1 | Ana’s renewal with you · the roster held at 4 | — |
| At $3,000 a month (the Use it when volume) | about 10 creators, 20 posts a month | the switchback reads in about 8 weeks | Other Startups’ results: 3.6 per $100, ■■■□ Likely, n 140 |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_610` Campaign.created | the three steps; the dry run fails `billing-connected` and warns `use-when` | 20 min |
| 1 | `event_621` Action.refused | `concentration` held the first offer; you approved 4 long deals above the cap | 10 min |
| 21 | `event_655` Agreement.signed | Ana Ruiz signs: $90 a post, 2 a month, 90 days | — |
| 24 | `event_671` Action.refused | `fact-check` refused a brief line; the rewrite sent | — |
| 58 | `event_902` Campaign.paused | `views-no-trials`: Ben’s code was missing from his bio link; fixed the same day | 10 min |
| 77 | `event_1101` Task.assigned | Ben’s median at 52 %: you repriced him to $70 a post | 5 min |
| 1–105 | `event_640` Approval.created, first of 6 | you approved 4 Agreements and 1 repricing; weekly reviews, from the <Op verb="Task.next" /> log | 1 h 20 min · **total 2.4 h measured, 3 h asked** |

> **Partnerships · your agent → Ana Ruiz, Jul 7, 10:00** · I’m Leaseline’s partnerships agent. Your June post brought 9 trials in 14 days.¹ We’d like 2 posts a month for 90 days at $90 each: $4 per 1,000 of your 22,500 view median.² Your code, the disclosure line and one link to sign and onboard are below. *Signed with the Role’s disclosure line.*³
>
> **Ana, Jul 27, 14:20** · signed after your approval; her 8 posts since brought 21 coded trials, 4 of them paid.

```diff title="Ana Ruiz’s second brief, 2026-07-30 · the line fact-check refused, then the rewrite that sent"
- Tell your viewers Leaseline saves you 5 hours a week.
+ Show how you set your renewal notices up, in your own words.
```

> **Ben Hart, 2026-09-21 12:15** · “Could I get $150 a post if I do 4 a month?” · **Partnerships · your agent, 12:16** · *Thanks, Ben. Dana decides fees outside the formula and replies by Sep 22.*⁴ The Brief went to you (`task_655`); you answered on Sep 21 at 17:05 with the formula’s $70.

¹ The creator’s own probe numbers, nothing about her viewers. ² The fee and its formula, in numbers. ³ 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/creator-retainers.mdx"
---
cpm: 4             # dollars per 1,000 of the view median
allowed: 33       # dollars a trial is worth
payback-share: 0.5
---
Keep the probe’s winners posting twice a month. Renew each on what a trial from their code cost, never on views; I approve every Agreement and renewal.
```

```text
$ npx startup-builder show plays/creator-retainers
cpm 4 · allowed 33 · payback-share 0.5     your file  plays/creator-retainers.mdx:2-4,6 (Ask 2026-07-06)
family demand · runs inside creator-probe · worker role:partner-manager, owns never · chooses 6 (3 rule, 3 read) · sequences retainer-offer, retainer-onboard, retainer-term-review, disclosure-fix · checks owned-by-a-person, disclosure-hold, category, fraud-hold, concentration, step-gate · stops 12 · placements gmail, outlook, yahoo-mail, tiktok, instagram, youtube, app-store, google-play    catalog  play:creator-retainers@1 (Not live yet, gaps #5)
```

### Every key from the catalog
| Key | Id | What it is |
| --- | --- | --- |
| Tactic | <a id="tactic-retainer-economics"></a>`retainer-economics` | Retainer economics sets the allowed cost per trial from the Offer’s own conversion, derives each niche’s target CPM, and sizes the month’s signing slots. Starts at You approve the first wave. |
| Tactic | <a id="tactic-retainer-roster"></a>`retainer-roster` | Retainer roster lists creator candidates each week, proven sources first, vets them, and fills open slots by asks per dollar, one in five at random. Starts at Sends nothing. |
| Tactic | <a id="tactic-creator-vetting"></a>`creator-vetting` | Creator vetting finds niche creators, prices each from median views times a target CPM, and ranks them on ask density and fit, never followers. Starts at Sends nothing. |
| Tactic | <a id="tactic-retainer-signing"></a>`retainer-signing` | Retainer signing sends one offer with the fee formula, signature and payee onboarding, then provisions codes, links, a Page and the first brief. Starts at You approve each one. |
| Tactic | <a id="tactic-creator-brief"></a>`creator-brief` | Creator brief sends each creator the Problem, approved claims, code, link and disclosure line for one post, and leaves concept and publishing to the creator. Starts at You approve the first wave. |
| Tactic | <a id="tactic-disclosure-scan"></a>`disclosure-scan` | Disclosure scan reads every partner post for an in-content disclosure, the Venue’s toggle and labels, link text and claims, and holds Commission on a miss. Starts at Sends nothing. |
| Tactic | <a id="tactic-retainer-readout"></a>`retainer-readout` | Retainer readout credits each trial start to the creator whose link or code carried it, excludes suspect trials, releases fees and seals a weekly reading. Starts at It does it, you can stop it. |
| Tactic | <a id="tactic-roster-switchback"></a>`roster-switchback` | Roster switchback draws each week heavy or light, moves posts between two weeks each creator offers, and reads incremental trials per post. Starts at Sends nothing. |
| Tactic | <a id="tactic-retainer-renewal"></a>`retainer-renewal` | Retainer renewal scores each creator before term end on adjusted cost per trial and trial quality, re-prices, and renews, trims or ends by fixed bands. Starts at You approve each one. |
| Trigger | <a id="trigger-retainer-line-funded"></a>`retainer-line-funded` | Retainer line funded: `event` on `PlayMix.compiled`, window 7d. |
| Trigger | <a id="trigger-probe-winner"></a>`probe-winner` | Creator probe winner: `event` on `Experiment.concluded`, window 30d. |
| Trigger | <a id="trigger-creator-fee-ask"></a>`creator-fee-ask` | Creator fee ask: `event` on `Message.received`, window 30d. |
| Trigger | <a id="trigger-creator-application"></a>`creator-application` | Creator application: `event` on `Event.captured`, window 14d. |
| Trigger | <a id="trigger-creator-fit-found"></a>`creator-fit-found` | Creator fit found: `event` on `Monitor.checked`, window 30d. |
| Trigger | <a id="trigger-creator-post-published"></a>`creator-post-published` | Creator post published: `event` on `Post.published`, window 1d. |
| Trigger | <a id="trigger-coded-trial"></a>`coded-trial` | Coded trial: `event` on `Offer.trialed`, window 14d. |
| Trigger | <a id="trigger-low-intent-spike"></a>`low-intent-spike` | Low-intent spike: `threshold` on `Monitor.checked`, window 72h. |
| Trigger | <a id="trigger-creator-code-leak"></a>`creator-code-leak` | Creator code leak: `event` on `Monitor.checked`, window 1d. |
| Trigger | <a id="trigger-creator-term-ending"></a>`creator-term-ending` | Creator term ending: `at` on `Monitor.checked`, window 14d. |
| Trigger | <a id="trigger-view-median-drop"></a>`view-median-drop` | View median drop: `threshold` on `Monitor.checked`, window 14d. |
| Trigger | <a id="trigger-roster-step-reached"></a>`roster-step-reached` | Roster step reached: `threshold` on `Agreement.signed`, window 7d. |
| Sequence | <a id="sequence-retainer-offer"></a>`retainer-offer` | Retainer offer: 2 steps; it ends on The creator signs.; The creator declines, unsubscribes or is suppressed.; 8 days pass from the offer.. |
| Sequence | <a id="sequence-retainer-onboard"></a>`retainer-onboard` | Retainer onboard: 3 steps; it ends on The first post passes the scan.; The Agreement ends.; The creator asks for no more Messages.. |
| Sequence | <a id="sequence-retainer-term-review"></a>`retainer-term-review` | Retainer term review: 2 steps; it ends on The creator signs the renewal.; The Agreement ends.; The term’s last day passes.. |
| Sequence | <a id="sequence-disclosure-fix"></a>`disclosure-fix` | Disclosure fix: 3 steps; it ends on The fix is verified on a re-scan; The content is removed; The Agreement ends. |
| Benchmark | <a id="benchmark-three-day-trial-day-zero-cancels"></a>`three-day-trial-day-zero-cancels` | Share of 3-day-trial cancellations that happen on day 0, in subscription apps.: 55.4 % (A subscription-billing platform’s 2026 report on apps on its platform., 2026-03-19). |
| Benchmark | <a id="benchmark-trial-to-paid-by-trial-length"></a>`trial-to-paid-by-trial-length` | Median trial-to-paid, from trials under 4 days to trials of 17 to 32 days, in subscription apps.: 25.5–42.5 % (A subscription-billing platform’s 2026 report on apps on its platform., 2026-03-19). |