Give it a goal
Name the result and your budget: your agent shows the plan and its price, works inside it, and brings back a receipt for every call.
- Dry run
- Free: the plan and its estimate, nothing spent
- Reference
- Goal mode
- First call
Goal.pursue
Book 5 calls with property managers this month from cold email, sending only from my warmed domain. Spend up to $40, and show me the plan first.
curl -X POST "https: //api.sb/ leaseline.app/ goals/ pursue? mode= try" \
-H "Authorization: Bearer $SB_TOKEN" \
-H "Content-Type: application/ json" \
-d '{"objective": "Book 5 calls with property managers this month from cold email. Send only from the warmed domain.", "by": "2026-11-26", "budget": {"amount": 40, "currency": "USD"}}'
npx startup-builder do Goal.pursue --try --data '{"objective": "Book 5 calls with property managers this month from cold email. Send only from the warmed domain.", "by": "2026-11-26", "budget": {"amount": 40, "currency": "USD"}}'
{
"name": "do",
"arguments": {
"mode": "try",
"code": "return await $.Goal.pursue({ objective: 'Book 5 calls with property managers this month from cold email. Send only from the warmed domain.', by: '2026-11-26', budget: { amount: 40, currency: 'USD' } })"
}
}
import { $ } from 'startup-builder'
const result = await $.try.Goal.pursue({ objective: 'Book 5 calls with property managers this month from cold email. Send only from the warmed domain.', by: '2026-11-26', budget: { amount: 40, currency: 'USD' } })
- The Key Result:
Meeting.booked, 5, by 2026-11-26. - Read “property managers” from the Offer’s ICP: 20 to 400 units, owners and operations leads. “Cold email” is email only. “Warmed domain” is the 2 warmed Mailboxes at 25 a day each: 50 a day, a hard limit.
- Lead with Renewals, from the message test’s readout: a Decision with its source.
- Build 400 checked Prospects: Build a verified list, about $5.20.
- Reach them in 3 touches: Personal first touch, about $5.44, first touches paced over 8 sending days, follow-ups on days 3 and 8.
- Answer about 20 replies and book: Answer every inbound, about 32¢;
Meeting.book, free. - Brief each call: Account brief × 5, about 55¢.
- Keep 150 more Prospects in reserve, about $4.00, if replies run under 3% by day 6. Expected: $11.61, at most $16.00, over 3 to 4 weeks.
Planning is free. You see the plan and its price before anything runs.
Decisions
- D1, the planlead with Renewals.The message test’s readout found renewals beat rent tracking 7 trials to 3.
- D2, day 6stop the 100 to 400 band and build 150 more at 20 to 100 units.0 of 110 replied at 100 to 400 units against 4 of 140 at 20 to 100; staying the course projected 2 calls.
- D3, day 19stop.Five calls booked: the goal is met, so the 64 pending follow-ups are canceled at $0.
By call
| Call | Calls | Cost | Outcomes |
|---|---|---|---|
Audience.build | 2 | $7.28 | Done |
Prospect.reach | 3 | $5.68 | Done |
Action.cancel | 2 | $0 | Done |
Lead.respond | 1 | $0.336 | Done |
Meeting.book | 1 | $0 | Done |
Deal.brief | 1 | $0.55 | Done |
| Spent | 1,245 | $13.97 | of $40.00, $26.03 left; the agent's own planning $0.12 |
Agent time 95 minutes, over 19 days.
Every call, 10 rows
Loading the rows.
The reference for every call on this page is Goal mode.
Two goals, spent well under budget
A founder with no customers has two questions first: who do I write to, and what do I write about. These two goals answer them.
The first asked Build a verified list for 50 verified heads of operations, with a $4 budget. The second asked the Keyword opportunity map for 20 keywords a new site can win, with $1.
Each stopped the moment it had what was asked. A budget is a ceiling, never a target: the agent spends nothing to use it up. Each cent below has a row on its receipt.
50 verified heads of operations (or COO / VP Operations / Director of Property Operations) at US residential property management companies managing roughly 100–1,000 units.
- Achieved
- 50 of 50 verified
- Spent
- $0.29 of $4.00
- Calls
- 136
- Agent time
- 21 minutes
- Took
- One sitting
Find 20 winnable keywords for salesbuilder.dev (AI agents that get a founder their first customers).
- Achieved
- 20 of 20 keywords
- Spent
- $0.12 of $1.00
- Calls
- 78
- Agent time
- 6 minutes
- Took
- One sitting
It plans before it spends
A goal is a hub Goal with one Key Result, due within 31 days. The agent works through the call’s agentic Function, whose budget is the most it may spend.
It starts from the call’s default program, the one a Workflow runs with every input set. Free counts size each step before anything is bought.
Each phrase of yours is a hard rule it never relaxes. A filter it adds to get there, such as a headcount range standing in for unit count, is soft, and the plan says so.
In try mode the plan comes back with its estimate, and nothing is spent. To run that exact plan, pass it back as plan.
- Read your words: each phrase becomes a hard rule, and any filter the agent adds is marked soft.
- Plan from the default program of the Workflow, agent task or Service the sentence matches, sized by free counts.
- Price each step at its unit price, and add one priced contingency step for the likeliest shortfall.
- Ask at most one question, and only when a reading would change the price by more than twice or the result by more than half.
- Return the plan and its estimate for $0. Nothing runs until you call it again with
sendordo.
It runs inside the budget and changes course on the record
The budget is a limit on the goal’s Action, checked before every call. When the goal is met, it stops. When the next call fits what is left, it makes it.
When the next call does not fit, it stops and opens an approval with its projection: “43 of 50 found. About 61¢ more finds the last 7. Your budget has 18¢ left.” A person answers it; the agent never does.
Every change of course is a Decision that supersedes the plan, with the options it weighed and its reason. A fallback between routes is the platform’s job and records no Decision.
| It may change on its own | It never |
|---|---|
| How many rows, pages or candidates it reads | Relaxes a phrase of yours |
| The order of the work, such as checking emails in fit order to stop at the target | Raises its own budget, or answers its own approval |
| A soft filter it added, widened when too few results come back | Calls a Play, or acts outside your standing approval |
| The route, when one fails: an API to the browser agent, one call to its parts | Spends ad money past spend, or carries on past by |
| When it stops: early, when the goal is met or no supply is left at any price | Passes by on a step: whether a step reads or follows a rule is fixed in the composition |
The receipt shows every call and why
The receipt is a view over one Action. It opens on the Decisions, then gives one line per call: how many ran, what they cost, and what came back. Every row sits in a fold beneath, and the totals equal the sum of the rows.
Agent minutes and wall-clock days are two figures. A goal that waits on replies runs for weeks on a few minutes of agent time. Ad spend sits beside the budget, never inside it: the site bills it to your own account.
The agent’s own model cost sits on its own line as agentUsd, so you can see what the planning cost apart from the work. It is usually 2¢ to 10¢ a goal.
| Column | What it holds |
|---|---|
| # | The row, numbered from 1 within the goal; a Decision cites rows by this number |
| Call | The Verb it ran, with any option that changes its price, such as ContactPoint.verifyEmail({ depth: |
| Subject | What the call was about: a person, a term, a domain |
| Cost | What that call cost, in dollars at the precision it needs, such as $0.000495; a miss or a catch-all check is $0 |
| Running | The total so far, which the next call is checked against |
| Outcome | What came back, typed: counted, listed, found, none found, deliverable, risky, catch-all, invalid, no reading |
| Domain | On a find: whether the address sits at the person’s company domain, and the Decision that handled it when it does not |
| Why | Why it made the call; a change of course cites its Decision |
Five goals, worked
The two goals above each ran one call. Three more ran several. One wrote and indexed answer pages until AI answers named Leaseline. One ran a message test on $100 of ad spend, paused two losers early, and asked for $50 more. You said no.
The third is this page’s Run it: Goal.pursue booked five calls with property managers in 19 days and 95 agent minutes. It built the list, wrote the first touches, answered the replies and briefed each call. On day 6 it changed segment, as a Decision, because the larger companies had not replied.
Each call’s own page carries its goal’s plan, its Decisions and its full receipt. Directory submissions carries one more, where the agent switches routes when an API refuses.
Get Leaseline named in AI answers for the 10 questions small landlords ask most about tracking rent.
- Achieved
- 10 of 10 questions answered by an indexed page
- Spent
- $1.94 of $15.00
- Calls
- 107
- Agent time
- 60 minutes
- Took
- 21 days
Find out which message gets small landlords to start a trial. Put up to $100 into ads.
- Achieved
- 1 of 1 winning message, likely
- Spent
- $0.28 of $5.00
- Ad spend
- $100.00 on your account
- Calls
- 41
- Agent time
- 14 minutes
- Took
- 5 days
The 50-lead goal, call by call
The 50-lead goal, call by call
The receipt of Build a verified list in goal mode. Run for real, it found 50 of 50 verified, and six Decisions explain every change of course.
Decisions
- D1, rows 1 to 5size four queries for free, then buy 150 rows from the closest one.All real estate matched 5,150 people. Adding the keyword “property management” brought it to 882, the nearest fit to your sentence, so row 5 bought from that query.
- D2, rows 54 to 57find 4 addresses again, by name and the current company’s domain only.The first find for these 4 people returned an address at another company, such as gwinnettcounty.com for a partner at tmg-atl.com. An address at a past employer bounces or reaches the wrong person.
- D3, rows 105 to 112 and 136send 9 catch-all and risky results to
ContactPoint.verifyEmail({ depth: 'deep' }), at $0.004 each.A catch-all domain accepts every address, so the standard check cannot confirm the mailbox. All 9 came back deliverable. - D4, rows 113 to 116find 4 addresses again, leaving out the route that produced each one.The check called them invalid. One came back new and valid; the other 3 stay off the list, each with its reason below.
- D5, rows 118 to 123re-size four narrower queries for free, then buy the 51 rows of “Leasing Residential Real Estate”.The second page of the first query came back empty. That industry was the most precise match, and small enough to read whole.
- D6keep 10 addresses at a domain other than the company’s, such as choicenewyork.com for choice-ny.com.Each checked deliverable, and none sat at a past employer on the person’s profile, which is what D2 tests for.
By call
| Call | Calls | Cost | Outcomes |
|---|---|---|---|
Prospect.count | 8 | $0 | 8 counted |
Prospect.find | 3 | $0.05738 | 3 listed |
ContactPoint.findEmail | 62 | $0.172 | 60 found · 2 none found |
ContactPoint.verifyEmail | 54 | $0.026 | 4 invalid · 41 deliverable · 7 risky · 2 catch-all |
ContactPoint.verifyEmail({ depth: 'deep' }) | 9 | $0.036 | 9 deliverable |
| Spent | 136 | $0.29 | of $4.00, $3.71 left |
Agent time 21 minutes, in one sitting.
Every call, 136 rows
Loading the rows.
The 20-keyword goal, call by call
The 20-keyword goal, call by call
The receipt of the Keyword opportunity map in goal mode, including the switch to search-box suggestions when related terms had nothing for founder phrasing.
Decisions
- D1, rows 8 to 16switch from related terms to phrase match and search-box suggestions.Related terms had no reading for founder phrasing such as “how to get first customers”. Phrase match and suggestions returned 205 rows and 52 suggestions for the same words.
- D2, row 17measure the 63-term shortlist in one batch.Difficulty is priced by the batch of up to 1,000 terms, so 63 terms cost one batch. The 19 terms with no reading cost nothing.
- D3, row 78read salesbuilder.dev’s own authority as the baseline.At an authority of 1, a term is winnable only where page one already holds weak or user-written pages, which is what the soft slots column counts.
By call
| Call | Calls | Cost | Outcomes |
|---|---|---|---|
Keyword.find | 10 | $0.004 | 8 listed · 2 no reading |
Keyword.find({ mode: 'suggestions' }) | 6 | $0.0051 | 6 listed |
Keyword.measure | 1 | $0.022 | 1 measured |
Keyword.search | 28 | $0.0042 | 28 read |
Domain.benchmark | 33 | $0.08861 | 33 read |
| Spent | 78 | $0.12 | of $1.00, $0.88 left |
Agent time 6 minutes, in one sitting.
Every call, 78 rows
Loading the rows.
A goal that works becomes a Workflow, then a Play
When every change of course on a receipt can be written as a rule, the receipt offers “Make this a Workflow”. Each Decision becomes a declared rule, such as “if fewer than 50 are valid, read 200 more companies, at most twice”.
The draft deploys as your own call, priced before it runs (Compose your own). “Keep doing this every week” is a Play’s job, not a goal’s, so the receipt offers the Play instead.
| From the receipt | What it offers | The call |
|---|---|---|
| Every Decision can be a rule | A Workflow of your own, with the Decisions as rules | MCP do with { define:, then deploy |
| You want it every week | The Play whose Tactic the plan matches | Play.apply |
| A segment rule worked | The rule saved to your customer sentence | ICP.update |
Four types carry a goal from sentence to receipt
Every field, the two ways in, streaming and failure are on the reference page.
| Type | What it is |
|---|---|
GoalModeInput | goal, budget, and optional spend, by, ask and plan, beside the call’s own inputs |
GoalPlan | What try returns: how it read each phrase, the priced steps, the estimate, at most one question |
GoalResult | The call’s own output, whether the goal was met and why it stopped, and the receipt |
Receipt | Every call, every Decision, every approval, and the budget spent and left |