Skip to content

Monthly search content

On the first of each month, eight new pages for the terms you can win and two refreshed pages that slipped, each published and indexed.

Kind
Agent task
Price
$2.46 per 10 pages
Your time
25 minutes
Approval
Goes out on its own
Site.grow
You, to your agent

Grow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first.

curl -X POST "https://api.sb/leaseline.app/sites/grow?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"goal":"Grow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first.","budget":{"amount":10,"currency":"USD"}}'
npx startup-builder do Site.grow --try --data '{"goal":"Grow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first.","budget":{"amount":10,"currency":"USD"}}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Site.grow({ goal: 'Grow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first.', budget: { amount: 10, currency: 'USD' } })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Site.grow({ goal: 'Grow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first.', budget: { amount: 10, currency: 'USD' } })
Response
{
  "mode": "try",
  "stored": false,
  "estimate": "About $2.46 per 10 pages",
  "sample": {
    "month": "2026-11",
    "published": "8 of 8",
    "refreshed": "/rent-ledger-template",
    "skipped": "“property management software” (winnability 18)",
    "indexed": "7 of 8 by day 14"
  }
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

What you get

  • 10 pages · On the first of each month, eight new pages for the terms you can win and two refreshed pages that slipped, each published and indexed. · Site
  • published[] · Each new page: URL, title, the term it targets and its index state.
  • refreshed[] · Each revised page and why: “position 14 to page two for 6 weeks; added a filled example”.
  • notDone[] · Each target not written this month, with the reason, such as winnability 18 or two failed Reviews.
  • decisions[] · Every choice it made, with its reason: which terms, which refreshes, and what it skipped.

Connect once: Google Search Console. How long: About an hour of agent time across the month; each page then waits days on the index.

Trigger

It runs on the first of each month at 09:00, and sooner when organic visits sit flat for 8 weeks.

TypeScript
every('1st at 09:00', ($) => $.Site.grow({ site: 'leaseline.app', pages: 8, refresh: 2 }))

Steps

Your agent does these steps, one row per step; each step’s check is part of its row and its price.

StepVerbReturnsPriceApproval
1. Refresh the term list from your seedsKeyword.find300 ideas, the month’s Keyword opportunity mapAbout 15¢Runs on its own
2. Measure volume and cost per clickKeyword.measureSearches and CPC for each ideaAbout 15¢Runs on its own
3. Measure difficulty in one batchKeyword.measureA difficulty for each idea, in one callAbout 1.2¢Runs on its own
4. Read the top 40 results pagesKeyword.searchWho ranks, and the soft slotsAbout 1.2¢Runs on its own
5. Measure who ranks, and your siteDomain.benchmarkAuthority for each ranking siteAbout 54¢Runs on its own
6. Choose this month’s targets and refreshesContent.draftEight terms by winnability and intent, not already covered, and the two pages most worth revising, each with its reason as a DecisionAbout 2¢Runs on its own
7. Research each targetKeyword.askThe results page, four engines’ answers and the five pages they cite, per targetAbout 16¢Runs on its own
8. Read the pages the answers citePage.auditWhat each cited page saysAbout 1¢Runs on its own
9. Draft and revise each pageContent.draftTen pages, each a draft and a revision against the Review’s findingsAbout $1.40Runs on its own
10. Publish and link the pages to each otherContent.publishTen pages live, with internal links between new and old, pinged as an effect of the publishFreeGoes out on its own

Calls: Keyword.find, then Keyword.measure, then Keyword.search, then Domain.benchmark, then Content.draft, then Keyword.ask, then Page.audit, then Content.draft, then Content.publish.

About $2.46 per 10 pages, each time it runs, capped at $4.00.

Example: give it a goal

Grow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first.

The plan it shows runs 10 steps, priced before it spends anything; Run it above shows the result it returns.

When something fails

Each failure, and what happens next
WhenThen
A target’s page fails Review twiceIt moves to notDone with the findings, the next term by winnability takes its slot, and the remedy applies.
Fewer than 8 terms clear minWinnabilityIt writes fewer pages and says why; it never pads to 8 with terms a new site cannot win.
A page goes live and is not indexed in 14 daysIndex the site reads it daily and reports the engine’s reason; the contract counts it done with that reason.
You call it twice in one monthThe second call returns the month’s record: it is idempotent per site and month.

Each step retries three times, then falls through to the next route; one item's failure lands in skipped with its reason, never failing the call. Before a step would cross maxCost it stops and returns what it has, with a resume link. Each step's idempotency key is the call's key plus the step and the item: leaseline-site-grow-1-<step>-<item>.

How it is graded

A second model reviews each page twice, once for claims and once for what would make it better; Index the site reads each one’s index state for 28 days. It passes when the month’s pages pass both reviews and go live, and each is indexed or carries the engine’s reason. A miss is redone at no charge.

Change it

AskCompiles to
Refresh four old pages before writing any new one.Site.grow
Only write for terms with difficulty under 20.Site.grow
Write comparison pages against my two nearest rivals this month.Page.answer
TypeScript
import { $, workflow } from 'startup-builder'

export default workflow({
  name: 'site-grow',
  verb: 'Site.grow',
  input: { site: 'string', pages: 'integer', refresh: 'integer', minWinnability: 'integer' },
  trigger: { schedule: '1st at 09:00' },
  maxCost: 4,
  review: [
    { pattern: 'affirmative', rubric: 'targets beat what is already published' },
    { pattern: 'adversarial', rubric: 'every claim resolves to a record or a cited page' },
  ],
  grade: { evaluator: 'claims, then quality, on each page; index state read back', passWhen: 'every page reviewed, live, and indexed or a reason', remedy: 'redo' },
  execute: async (ctx, { site, pages = 8, refresh = 2, minWinnability = 60 }) => {
    const map = await ctx.step('map', () => $.Keyword.map({ seeds: 'saved', site, maxCost: 1 }))
    const plan = await ctx.step('choose', () => $.Content.draft({ kind: 'content-plan', from: map, pages, refresh, minWinnability, maxCost: 0.03 }))
    const written = []
    for (const t of [...plan.targets, ...plan.refreshes]) written.push(await ctx.step(`page:${t.term}`, () => $.Page.answer({ question: t.term, site, update: t.url, maxCost: 0.3 })))
    return { published: written.filter((w) => !w.update), refreshed: written.filter((w) => w.update), decisions: plan.decisions }
  },
})

Extend it with extends: 'Site.grow' and base(), or compose your own from these steps.

Works with

Plays that order it: Category hubs, Editorial SEO.

It serves Make content, and runs in Launch and search, Paid. It deepens Publish content.

For agents

For agents: the guide, its approvals, retries and lookups
FactValue
GuideSite.grow
Guide approvallimits
GoalGrow organic visits to leaseline.app with 8 new pages this month, spend up to $10, and show me the plan first. It may change counts, the order of steps, soft filters and the route a read takes, and it stops early when the goal is met. It never relaxes your words, raises its own budget, answers its own approval, calls a Play or acts outside your standing approval.
Triggerevery('1st at 09:00', ($) => $.Site.grow({ site: 'leaseline.app', pages: 8, refresh: 2 }))
RetryThree times with backoff, then the next route; the same idempotency key never charges, sends or posts twice
Idempotency keyleaseline-site-grow-1
LookupsA find: input asks unless exactly one record fits
Step
1. Refresh the term list from your seeds
2. Measure volume and cost per click
3. Measure difficulty in one batch
4. Read the top 40 results pages
5. Measure who ranks, and your site
6. Choose this month’s targets and refreshes
7. Research each target
8. Read the pages the answers cite
9. Draft and revise each page
10. Publish and link the pages to each other Action class publish

The amounts live once, on the hub (approvals).

Who does each step, and how it is checked
StepFunctionDoerCheckerAssuranceInputs
1. Refresh the term list from your seedscodeCodeCode checks each result against its declared typemeasured$0.site
2. Measure volume and cost per clickcodeCodeCode checks each result against its declared typemeasured$1.terms
3. Measure difficulty in one batchcodeCodeCode checks each result against its declared typemeasured$1.terms
4. Read the top 40 results pagescodeCodeCode checks each result against its declared typemeasured$2.top
5. Measure who ranks, and your sitecodeCodeCode checks each result against its declared typemeasured$4.hostnames
6. Choose this month’s targets and refreshesagenticThe Content lead agentA second model grades the outputgraded$1..$5, $0.minWinnability
7. Research each targetcodeCodeCode checks each result against its declared typemeasured$6.targets
8. Read the pages the answers citecodeCodeCode checks each result against its declared typemeasured$7.cited
9. Draft and revise each pageagenticThe Content lead agentAffirmative review by a second model: Pass, with the 60-word answer, FAQ and schema in placegraded$7, $8, offer
10. Publish and link the pages to each othercodeCodeCode reads the result back from where it landedmeasured$9.drafts, $0.site

The doer is never the checker, and the weakest assurance on the path is the whole call’s.

Under the hood

Under the hood: the Systems, Nouns and Events it touches
KindWhat it touches
SystemsSites and content
NounsKeyword, Domain, Content, Page, Action
EventsKeyword.measured, Domain.benchmarked, Content.drafted, Action.evaluated, Content.published

Reference

Inputs, outputs, its Event and its errors
NameTypeDefaultMeaning
siteHostnameRequiredYour site.
pagesinteger8New pages a month. Eight is the planning number a new site sustains with one review pass each.
refreshinteger2Old pages revised a month: those that slipped five or more places, or sat on page two for six weeks.
minWinnabilityinteger60The score a term needs before it gets a page.
maxCostnumber4.00The most this call spends each time it runs, in USD. It stops before a step would cross it and returns what it has, with a resume link.

Emits Site.grown. Refuses with max-cost before it spends, and with the Data calls and Accounts groups (refusals).

Contents