Archive repurposing
Turns each webinar, recording or consented call you have into a page, posts and clips for people who never saw it, in the speaker’s words.
- Channel
- Social
- Kind
- Social & video
Be our Content Lead for the archive: turn every webinar and every customer call that said yes into a page, LinkedIn posts in my words and short clips, for property managers who never saw them. Quote people exactly. I edit anything about tax or contracts, and every clip. Show me what’s missing; don’t publish.
# Not live yet (gaps #2)
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"archive-repurposing"}'import { $ } from 'startup-builder'
return await $.Campaign.create({ play: 'archive-repurposing' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2
npx startup-builder do Campaign.create --json '{"play":"archive-repurposing"}' --try # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "return await $.Campaign.create({ play: 'archive-repurposing' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2",
"mode": "try"
}
}application/json{
"type": "https: //startupbuilder.dev/ errors/ refused",
"title": "Refused",
"status": 422,
"detail": "archive-repurposing can’t start yet: 1 check fails and 1 warns.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "14 recordings: 6 webinars, 8 customer calls; 1 new webinar every 2 weeks",
"doc": "/plays/ archive-repurposing#check-use-when",
"then": "Metric.query"
},
{
…
Hand our latest recording to the Content Lead agent and show me what it chose and why. Don’t publish.
curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Source.added%22%2C%20%22Visit.recorded%22%2C%20%22Post.published%22%2C%20%22Change.merged%22%2C%20%22Consent.withdrawn%22%2C%20%22Message.received%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_1420"}'
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22source_31%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%22source_31%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
const { events: [last] } = await $.Event.list({ where: 'name in ("Source.added", "Visit.recorded", "Post.published", "Change.merged", "Consent.withdrawn", "Message.received")', 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 (\"Source.added\", \"Visit.recorded\", \"Post.published\", \"Change.merged\", \"Consent.withdrawn\", \"Message.received\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1420"}' --try # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"source_31\""}' # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"source_31\""}' # Not live yet (gaps #7){
"name": "do",
"arguments": {
"code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Source.added\", \"Visit.recorded\", \"Post.published\", \"Change.merged\", \"Consent.withdrawn\", \"Message.received\")', limit: 1 }) // { play } compiled to this Play’s Trigger Events\nconst { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7\nconst { decisions: [decision] } = await $.Decision.list({ where: `on = \"${subject}\"` }) // what it chose, and why · Not live yet, gaps #7\nconst { actions } = await $.Action.list({ where: `on = \"${subject}\"` }) // what it did, with its checks · Not live yet, gaps #7\nreturn { decision, actions }",
"mode": "try"
}
}application/json{
"decision": {
"$id": "https: //api.sb/ leaseline.app/ decisions/ decision_491",
"$type": "Decision",
"choice": "full-set",
"reason": "the Oct 16 webinar on 60-day notices runs 52 minutes with 13 usable cuts, and you are the only speaker",
"stakes": "low",
"options": [
"full-set",
"page-only",
"more-like-the-winner",
"dub-it",
"to-your-editor",
"not-now"
…
sample · 4 Not live yetPreviewOn POST /{namespace}/processes/{process}/enableOff POST /{namespace}/processes/{process}/pauseTake this one POST /{namespace}/tasks/{task}/claim
action_3 is the 5 clips, which wait for your edit (You approve each one); action_4 is the 6 quote posts on the company account, sent after a 1-day hold you can stop.
23 new contacts in 56 days against 4 before · before-after,
| Try another: the recording | Choice | Reason |
|---|---|---|
| Oct 16 webinar: 60-day renewal notices, 52 min, you speaking | full-set | 13 usable cuts, and every speaker’s Consent |
| Maple Court call, Sep 8: Ana on late fees and lease terms | to-your-editor | a contract topic, and a speaker other than you |
| Aug webinar: drawn into the page-only half | page-only | the draw holds it to a page |
| Harbor Row call: no Consent on file | not-now | source-consent: no piece until they say yes |
- 1 h week 1, then 90 min a week
- Your time
- Day 9: first contact from a clip’s link
- First signal
Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Archive Contacts → New Leads → New Customers ↑ → ARR added each week → ARR
Worth’s formula: about +2.4 new contacts per source (Other Startups’ results; no lift of your own yet) × 6 sources a month × 0.39 contacts to Leads × 0.20 Leads to paid × $347 first order ARR ≈ +$390. Under First signal: At 1 page-only source a month, one Startup needs about 6 months to fill a held-back half, so your file reads before-after and pools with Other Startups.
sample · api.sb/
Start it this week
npx startup-builder add play archive-repurposing # 1 · writes plays/archive-repurposing.mdx (Not live yet, gaps #5)
# 2 · dry run; below, its 422 on the day-0 Startup (clock at 2026-08-24)
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"archive-repurposing"}'
# 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":"archive-repurposing"}'
# on
curl -X POST https://api.sb/leaseline.app/processes/content-marketing/enable \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# off: no upload, post or dub; published pieces stay
curl -X POST https://api.sb/leaseline.app/processes/content-marketing/pause \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"| Check | Fix | Then |
|---|---|---|
use-when pass · Not live yet, gaps #8 | 14 recordings: 6 webinars, 8 customer calls; 1 new webinar every 2 weeks | POST /{namespace}/metrics/query |
baseline warn · Not live yet, gaps #8 | n 4: it reads before-after, not proof, beside Other Startups’ results. | POST /{namespace}/metrics/query |
source-consent fail | Ask the 8 customer speakers once for their yes; until then only your webinars run. | POST /{namespace}/consents |
role-unstaffed pass · Not live yet, gaps #8 | Content Lead is your agent; edits come to you | POST /{namespace}/roles/{role}/staff |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "archive-repurposing can’t start yet: 1 check fails and 1 warns.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "14 recordings: 6 webinars, 8 customer calls; 1 new webinar every 2 weeks",
"doc": "/plays/archive-repurposing#check-use-when",
"then": "Metric.query"
},
{
"check": "baseline",
"status": "warn",
"observed": "4 new contacts from the replay page in 90 days",
"doc": "/plays/archive-repurposing#check-baseline",
"fix": "n 4: it reads before-after, not proof, beside Other Startups’ results.",
"then": "Metric.query"
},
{
"check": "source-consent",
"status": "fail",
"doc": "/plays/archive-repurposing#check-source-consent",
"fix": "Ask the 8 customer speakers once for their yes; until then only your webinars run.",
"then": "Consent.create"
},
{
"check": "role-unstaffed",
"status": "pass",
"observed": "Content Lead is your agent; edits come to you",
"doc": "/plays/archive-repurposing#check-role-unstaffed",
"then": "Role.staff"
}
]
}It says no, says why, and names the fix.
| Check | Fix (one call) | Your time | Wait |
|---|---|---|---|
use-when · pass: 14 recordings (gaps #8) | POST /{namespace}/metrics/query on archive-contacts | 1 min | none |
baseline · warn: 4 in 90 days | POST /{namespace}/metrics/query; it fills Before in Your number | 0 min | none |
source-consent · fail: 8 customer speakers with no yes on file (Not live yet) | POST /{namespace}/consents from each speaker’s answer to one ask | 10 min | their answers; 3 said yes in 2 days |
role-unstaffed · pass (gaps #8) | — | 0 min | none |
Your number · Before 4 per 90 days · Now 23 new contacts in 56 days · Target 40 by Dec 31 · before-after,
Transcription and cutting cost about $0.80 per hour of recording, and each drafted piece $0.02 from your Domain (Worker cost); clips post from your own accounts at no charge. That comes to about $1.10 per source and $7 a month at 6 sources, held by a $40 Limit.
When it starts
| When | Trigger id | Starts on | Window | How it gets in |
|---|---|---|---|---|
| A recording or consented call lands in your library | source-added | event on Source.added where a recording, webinar, episode, consented Meeting or support Conversation | the slate within 1 h; ignored after 30 d | POST /{namespace}/files with the recording, or your webinar tool through POST /{namespace}/integrations/connect |
| An old source has 3+ unused cuts and no piece in 60 days | archive-backlog | state on Source.added where older than 30 days, 3 or more unused cuts, and no piece in 60 days | once a week | the library itself |
| A piece ranks in your top tenth for new contacts | derivative-outlier | threshold on Post.published where 7-day new contacts in your top tenth, 5 or more | 14 d | its coded link’s POST /{namespace}/leads |
+ 4 more for language demand, fact changes, Consent withdrawals and Venue notices (?lanes=) |
{
"$id": "https://api.sb/leaseline.app/events/event_1420" ,
"$type": "Event",
"name": "Source.added",
"at": "2026-10-19T10:15:22Z" ,
"seq": 1420,
"data": {
"source": {
"$id": "https://api.sb/leaseline.app/sources/source_31" ,
"kind": "webinar",
"title": "60-day renewal notices, per owner" ,
"minutes": 52,
"speakers": [
"Dana Okafor"
]
},
"cuts": 13
}
}# each delivery is signed with the Watch’s secret
curl -X POST https://api.sb/leaseline.app/watches \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"selector":"Source.added","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Source.added --like event_1420 # replays the upload
npx startup-builder clock advance --by 1d # runs the quote posts’ 1-day hold (action_4)Who runs it
Content Lead · your agent (role:, worker_7) holds the Key Result. It hands every clip, every cut tagged tax or contract, every speaker other than you and every dub to you (Dana Okafor, person, worker_1), the editor. Your number links to Did it work.
| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
|---|---|---|---|---|---|
| Make the full set: quote posts and the page | It does it, you can stop it | 34 of 34 quote posts approved unedited | met on day 30 (the first 30 quote posts) | a comment Stop → You approve each one | POST /{namespace}/actions/{action}/cancel inside the 1-day hold |
| Make the full set: clips and posts in your words | You approve each one, on every rung | 31 clips, 4 trimmed · 16 posts, 1 rewritten | never | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse |
| Page only · Make more like the winner · Not now | It does it | 3 of 3 · 2 of 2 · 3 held | — | — | POST /{namespace}/actions/{action}/redirect |
| Dub it · To your editor | You approve each one, on every rung | 0 dubs · 2 of 2 edited | never | — | POST /{namespace}/tasks/{task}/claim |
| Never: a changed quote, a voice but the speaker’s own, footage you don’t own | To a person, every time | 1 refused, 0 published | never | — | POST /{namespace}/processes/{process}/pause |
What it reads · What it may call. It reads the transcript, the cuts and your fact records; a quote, caption or post matches its transcript word for word, except at a marked ellipsis, and every claim reads from a fact or a timestamp. Its tools are POST /{namespace}/content/draft, POST /{namespace}/posts/{post}/schedule, POST /{namespace}/videos/draft, POST /{namespace}/pages, POST /{namespace}/sites/{site}/publish, POST /{namespace}/experiments/{experiment}/start, POST /{namespace}/tasks/{task}/assign, and any other call becomes an Approval under the Role’s Mandate.
You hold the Content Lead Key Result: 40 new contacts from the archive by 2026-12-31. ← worker, metric
On each new or backlogged source, choose one option and say why. ← triggers, chooses
Quote every speaker word for word; mark every cut with an ellipsis. ← provenance-hold
Every clip, and every cut about tax or contracts, waits for Dana’s edit. ← your file, line 4
Never post a piece where its source first aired. ← original-audienceThe slow loop, as a Change. decision_458 (2026-10-12, weekly) read clips under 40 seconds bringing 9 of the 14 clip contacts, so change_29 moved the clip length to 20 to 40 seconds and Dana merged it. Replayed on past clips, POST /{namespace}/changes/{change}/review put contacts per clip at 0.61; read back at +7d it is 0.55, n 11 clips, ■□□□ Too early to tell (Example, day 49).
Bring your own agent (folded) starts at You approve each one for every piece, and earns the quote-post rung when it matches the seated agent with 0 changed quotes.
npx startup-builder eval --scenario archive-repurposing-14 --agent "claude -p" --seat content-lead # seated: 1.6 contacts per source, 0 changed quotes, $1.10 a source · yours: 1.4, 1 changed quote → You approve each one What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
|---|---|---|---|---|---|
Make the full set full-set | 3+ usable cuts and every speaker’s Consent | Your rule (line 4) | POST /{namespace}/content/draft the page and posts → POST /{namespace}/videos/draft the clips → POST /{namespace}/posts/{post}/schedule | you edit the clips · Take this one | you |
Page only page-only | drawn page-only, or under 3 cuts | Your rule (the draw) | POST /{namespace}/pages → POST /{namespace}/sites/{site}/publish | nobody | the same |
Make more like the winner more-like-the-winner | a piece in your top tenth | Agent’s call, with its reason | POST /{namespace}/content/draft 2 more from the same cut → POST /{namespace}/experiments/{experiment}/start | nobody | the same |
Dub it in your own voice dub-it | a language with 200+ visits or 10 sign-ups a month | Agent’s call, with its reason | POST /{namespace}/videos/draft with your own cloned Voice | you, and a fluent reviewer for the first 10 · Take this one | you |
To your editor to-your-editor | tax or contract, or another speaker | Your rule (line 4) | POST /{namespace}/tasks/{task}/assign with the cut and its transcript | you, due 2 business days · Take this one | you |
Not now not-now | no Consent, or a Venue notice | Your rule (the consent hold) | nothing; names the holder: source-consent or strike | nobody | the same |
| When they write back | Fixture reply | What happens | Who answers | By when | Call |
|---|---|---|---|---|---|
| Interested | a comment on a clip: “Where do I set this up?” | replies with the source page’s coded link | Content Lead · your agent | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Send me pricing | “How much is it for 80 units?” | replies with the Pricing Page’s list Price and nothing it lacks | Content Lead · your agent | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Not now | a new subscriber: “Just reading for now.” | nothing else sends but the newsletter they asked for | nobody | at once | POST /{namespace}/leads/{lead}/nurture |
| Wrong person | “Sending this to our office manager.” | replies with the page they can forward; it never writes to a name from their text | Content Lead · your agent | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Out of office | an auto-reply to the welcome issue, until Oct 30 | the next issue waits for the return date | nobody | the return date | POST /{namespace}/messages/{message}/schedule |
| Question it can’t answer | “Does the 60-day rule apply to month-to-month leases?” | To you, the question in the Brief; it states nothing your records lack | you | 2 business days | POST /{namespace}/conversations/{conversation}/escalate |
| Stop | a speaker: “Please take my clip down.” | their Consent is withdrawn; their cuts hide and their posts come down within 1 h | nobody | 1 h | POST /{namespace}/consents/{consent}/withdraw |
When it hands to you
Every clip, every cut about tax or contracts, every other speaker and every dub comes to you, the editor. What lands in your queue, as captured: the Brief, then the Approval (brief, draft, route and checks are Not live yet, gaps #7).
[
{
"$id": "https://api.sb/leaseline.app/tasks/task_293" ,
"$type": "Task",
"assignee": "worker_1",
"due": "2026-09-15T17:00:00Z" ,
"on": "source_22",
"brief": {
"what": "the Maple Court call, Sep 8: Ana on late fees and lease terms" ,
"chose": "to-your-editor",
"why": "a contract topic, and a speaker other than you" ,
"consent": "Ana said yes on Sep 9 (consent_44)",
"cuts": 4
}
},
{
"$id": "https://api.sb/leaseline.app/approvals/approval_81" ,
"$type": "Approval",
"verdict": null,
"deadline": "2026-10-21T17:00:00Z" ,
"draft": "5 clips from “60-day renewal notices, per owner”, 22 to 38 seconds, captions from the transcript" ,
"route": "full-set",
"checks": [
{
"check": "provenance-hold",
"status": "pass"
},
{
"check": "distinctness",
"status": "pass"
}
]
}
]You answer with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, POST /{namespace}/approvals/{approval}/approve or POST /{namespace}/approvals/{approval}/refuse, each a one-call window, and an Approval unanswered by its deadline expires and the clips never post. A week with no edit holds every clip and issue (editor).
On time: you, 19 of 20 edits by their deadline, median 1 day, ■■□□ Early sign, n 20 (the 20th expired, and those clips never posted). Your queue: counted by kind: in week 1, 1 consent ask and 1 slate; since, about 1 slate of 5 clips and 2 posts a week, and 1 editor cut a fortnight.
The fixed line: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.
When it won’t send
| Check (refuses one send) | Refuses | Fix | Then |
|---|---|---|---|
source-consent | any piece from a source with a speaker other than you and no Consent on file | Ask the speaker once for their yes; nothing of theirs runs until then. | POST /{namespace}/consents |
provenance-hold | a quote, caption or post that differs from its transcript, except at a marked ellipsis | Cut the line, or cite its timestamp in the transcript. | POST /{namespace}/content/draft |
fact-check | a piece with a claim that reads from no fact record and no timestamp | Cut the claim, or name the record that backs it. | POST /{namespace}/content/draft |
advice-review | a cut tagged tax or contract without your edit | Edit it, or leave it unpublished. | POST /{namespace}/tasks/{task}/claim |
distinctness | a piece too close to one on the same account in 90 days, or to one of your other Startups’ on that Venue | Pick another cut, or reframe it. | POST /{namespace}/content/draft |
ownership | footage or audio you don’t own, with no written grant on file | Record the owner’s grant, or leave it out. | PATCH /{namespace}/files/{id} |
original-audience | a piece in the same format, in the feed or list where its source first aired | Post it elsewhere; a dub on the original video is fine. | POST /{namespace}/posts/{post}/schedule |
| Stop (pauses the Play) | Pauses when | Then |
|---|---|---|
consent-withdrawn | a speaker withdraws their Consent | their cuts hide, posts come down and dubs go, within 1 h |
strike | a Venue sends a strike, label, removal or reach limit | that account pauses and the piece type quarantines across your Startups within 1 h |
new-audience-floor | under 50 % of new contacts are new to you, over 30 days, at 30 contacts | the lowest piece type pauses and re-slates |
contact-floor | a piece type with 20 published and no contact in 60 days | it stops until a Variant tests |
comment | comments calling a piece fake or mistranslated over 5 %, on 2 pieces in a week | it returns to You approve each one |
editor | no edit for 7 days | every clip and issue holds, one rung down on every account |
spend-limit | transcription, dub and model spend reach the $40 Limit | the queue holds; POST /{namespace}/limits/{limit}/raise with your OK |
kill-switch | you press it | every upload, post and dub pauses; POST /{namespace}/processes/{process}/enable after review |
+ 2 more for dubs, none made yet: voice-consent and dub-floor (?lanes=) |
The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the quote that posted instead is the second thread in Example.
| Check | Fix | Then |
|---|---|---|
provenance-hold fail · Not live yet, gaps #1 | Cut the line, or cite its timestamp in the transcript. | POST /{namespace}/content/draft |
fact-check pass · Not live yet, gaps #1 | — | POST /{namespace}/content/draft |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "The quote post from the Sep 18 webinar did not schedule: it differs from the transcript.",
"checks": [
{
"check": "provenance-hold",
"status": "fail",
"observed": "at 31:12 Dana said “most”, the draft says “every”",
"doc": "/plays/archive-repurposing#check-provenance-hold",
"fix": "Cut the line, or cite its timestamp in the transcript.",
"then": "Content.draft"
},
{
"check": "fact-check",
"status": "pass"
}
]
}It says no, says why, and names the fix.
[
{
"reason": {
"limit": "editor",
"observed": "7 days with no edit, Sep 28 to Oct 5" ,
"bound": "7 days",
"window": "7d"
},
"doc": "/plays/archive-repurposing#stop-editor" ,
"note": "clips and issues held; quote posts ran on"
}
]Did it work
At 1 page-only source a month, no held-back half reads within 90 days, so the basis is before-after (rule o): the columns read Now and Before, and nothing prints as Added. Each figure’s call is POST /{namespace}/metrics/query by node; every node above the leaf is Not live yet (gaps #4).
23 new contacts in 56 days against 4 before · before-after,
- Chose
- full-set
- Why
- the Oct 16 webinar on 60-day notices runs 52 minutes with 13 usable cuts, and you are the only speaker
- From
- full-set · page-only · more-like-the-winner · dub-it · to-your-editor · not-now
- Expects
- 6 or more new contacts from its pieces within 30d
- Reopens when
- under 2 new contacts from source_31 by day 14
- By
- worker_7
JSON
{
"$id": "decisions/decision_491",
"$type": "Decision",
"choice": "full-set",
"reason": "the Oct 16 webinar on 60-day notices runs 52 minutes with 13 usable cuts, and you are the only speaker",
"stakes": "low",
"options": [
"full-set",
"page-only",
"more-like-the-winner",
"dub-it",
"to-your-editor",
"not-now"
],
"by": "worker_7",
"on": "source_31",
"expected": "6 or more new contacts from its pieces within 30d",
"reopensWhen": "under 2 new contacts from source_31 by day 14"
}| Node | Now (56 days) | Before (the 90 days, per 56) | Added | Confidence | Basis |
|---|---|---|---|---|---|
archive-contacts | 23 new contacts through coded links (17 matured) · 71 % new to you | 2.5 from the replay page | — · Worth about +$390 a month | — | before-after, not proof · Other Startups’ results +2.4 per source, ■■□□ Early sign, n 312 sources |
new-leads | 9 Leads from those contacts | 1 per 56 days | — | — | before-after |
new-arr ↑ | $347, 1 Customer on Pro · Booked: credited, not all caused by this Play | $0 | — | — | before-after · 2 trials still deciding |
net-new-arr · arr | carried from new-arr | carried | — | — | carried |
The leaf counts consented contacts whose first Consent came through a piece’s coded link or Form, within 30 days of the click; before against after reads one window against the 90 days before it, scaled to 56 days. It is not proof, and Other Startups’ results print beside it.
How it moves it: 11 recordings reached LinkedIn, YouTube and the newsletter as 11 pages, 50 posts and 31 clips with coded links, where before they sat on one replay page.
Guardrails: before against after: organic-share of visits, 33 % against 30 %, and unsubscribes from the newsletter issues that carried a cut, 0.4 % against 0.5 %.
{
"$id": "https://api.sb/leaseline.app/campaigns/archive-repurposing" ,
"$type": "Campaign",
"play": "play:archive-repurposing@1" ,
"path": [
"archive-contacts",
"new-leads",
"new-arr",
"net-new-arr",
"arr"
],
"experiment": {
"metric": "archive-contacts",
"unit": "count",
"heldBack": 3,
"decision": null
},
"readout": {
"value": null,
"n": 17,
"maturing": 6,
"interval": null,
"readability": "inadmissible",
"basis": "before-after",
"pooled": true
},
"ledger": {
"spend": 13,
"workerCost": 2,
"hours": 11.6,
"wonArr": 347,
"projectedArr": 390,
"paybackDays": 14
}
}Outside benchmark: 61 % of viewers in one 2026 survey said a dub should say it was made with AI (a localization firm’s survey of 1,000 viewers).
Before it · After it. Before it: events-and-webinars and founder-voice make the recordings. After it: owned-newsletter sends each week’s issue built on one cut, and instant-response answers anyone the pieces send.
Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days). The library held 14 sources: 6 webinars and 8 customer calls; 3 customers said yes in 2 days and 2 more later, so 11 sources cleared. 3 were drawn page-only. No language passed 200 visits a month, so nothing was dubbed. Read every captured piece at ?threads=; three follow the tables.
| What happened, by option | Sources | Pieces | New contacts (what happened) |
|---|---|---|---|
| Make the full set | 8 | 8 pages, 16 posts in your words, 34 quote posts, 31 clips | 19 |
| Page only · Make more like the winner | 3 · 2 | 3 pages · 4 more clips | 1 · 3 |
| Dub it · To your editor · Not now | 0 · 2 · 3 | — · 2 edited · — | — |
| All, against before | 11 sources | 96 pieces | 23 · before: 4 in 90 days · $347 won (credited, not all caused by this Play) |
| At 5 recordings (the Use it when volume) | about 4 a month | before-after, not proof | Other Startups’ results: +2.4 per source, ■■□□ Early sign, n 312 sources |
| Day | Event | What happened | Your time |
|---|---|---|---|
| 0 | event_1116 Campaign.created | the three steps; the dry run fails source-consent | 30 min |
| 2 | event_1129 Consent.created, first of 5 | 3 customer speakers said yes | 10 min |
| 3 | event_1137 Approval.created, first of 20 | the first slate: 1 page, 5 clips, 2 posts in your words, 6 quote posts | 50 min |
| 9 | event_1170 Lead.created | the first new contact, from a clip’s coded link | — |
| 30 | event_1282 Role.updated | promoted: quote posts send after a 1-day hold | — |
| 35 | event_1311 Campaign.paused | editor: 7 days with no edit; clips held, resumed when you edited | — |
| 49 | event_1366 Change.merged | clips 20 to 40 seconds: replayed at 0.61 contacts a clip, read back at +7d at 0.55 | 5 min |
| 1–56 | event_1138 Task.created, first of 22 | slates and editor cuts from the POST /{namespace}/tasks/next log | 9.8 h · total 11.6 h measured, 12 h asked |
A 28-second clip, Sep 3, from the Aug 21 webinar at 14:05 · Dana: “When one owner’s renewals run late, it’s usually the hand-off between leasing and accounting, not the lease.”¹ Posted on YouTube with the source page’s coded link.²
Sep 4 · 2 new contacts through the link; one, Wrenfield’s office manager, started a trial on Sep 11 and took Pro on Sep 25 (+$347 ARR).
- “Every renewal you send 60 days out saves you a vacancy.” Dana Okafor
+ “Most renewals you send 60 days out save you a vacant month.” Dana Okafor, at 31:12 The Maple Court call, 2026-09-09 10:00 · Ana on late fees and lease terms: a contract topic, and a speaker other than Dana, so To your editor sent Dana the 4 cuts (
task_293, due Sep 15). Dana cut 1 and approved 3 on Sep 14 at 16:20, and the posts quote Ana by name.³
¹ The words match the transcript at 14:05. ² Each piece carries its own coded link. ³ A speaker other than you, and every contract topic, waits for your edit.
Your settings
---
holdout: 0.2 # 1 back-catalog source in 5 gets a page only, for the pool
---
Every clip, and every cut about tax or contracts, waits for my edit.
Clips run 20 to 40 seconds.$ npx startup-builder show plays/archive-repurposing
holdout 0.2 · the edit rule · clip length your file plays/archive-repurposing.mdx:2,4,5 (Ask 2026-08-24; line 5 by change_29, 2026-10-12)
family demand · process content-marketing · worker role:content-lead, owns never · chooses 6 (4 rule, 2 read) · approval every-send · checks source-consent, provenance-hold, fact-check, advice-review, distinctness, ownership, original-audience · stops 8 + 2 for dubs catalog play:archive-repurposing@1 (Not live yet, gaps #5) Every key from the catalog
Compiled, not written: edit the Play record archive-repurposing 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.