Skip to content

Run ads

What would 500 clicks on my terms cost? Your agent prices them before you spend, runs the test on your own ad account, and stops spend that does not pay.

Run ads
You, to your agent

What would 500 clicks on rent collection software cost?

Run the test on my Google account, and stop it if it does not pay.

curl -X POST https://api.sb/leaseline.app/keywords/rent%20collection%20software/measure \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"locale":"en-US","venue":"google-search"}'

curl -X POST https://api.sb/leaseline.app/integrations/connect \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"system":"ads","scope":"startup","grants":["campaigns","budgets","reports"],"venue":"google-search"}'

curl -X POST https://api.sb/leaseline.app/mandates/authorize \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent":"agents/agent_7","verb":"Campaign.update","limit":{"spend":2050,"currency":"USD"},"for":"parties/party_1"}'

# Not live yet (gaps #2)
curl -X POST https://api.sb/leaseline.app/campaigns/paid-search/start \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"budget":{"amount":2050,"currency":"USD","per":"test"}}'
import { $ } from 'startup-builder'

await $.Keyword.measure({ keyword: 'rent collection software', locale: 'en-US', venue: 'google-search' })   // volume and cost per click, the price of the test
await $.Integration.connect({ system: 'ads', scope: 'startup', grants: ['campaigns', 'budgets', 'reports'], venue: 'google-search' })   // your ad account, once
await $.Mandate.authorize({ agent: 'agents/agent_7', verb: 'Campaign.update', limit: { spend: 2050, currency: 'USD' }, for: 'parties/party_1' })   // the stop rule: spend to zero when a paid customer costs more than first-year margin
return await $.Campaign.start({ campaign: 'paid-search', budget: { amount: 2050, currency: 'USD', per: 'test' } })   // the 500-click test on your account · Not live yet, gaps #2
npx startup-builder do Keyword.measure --json '{"keyword":"rent collection software","locale":"en-US","venue":"google-search"}'
npx startup-builder do Integration.connect --json '{"system":"ads","scope":"startup","grants":["campaigns","budgets","reports"],"venue":"google-search"}'
npx startup-builder do Mandate.authorize --json '{"agent":"agents/agent_7","verb":"Campaign.update","limit":{"spend":2050,"currency":"USD"},"for":"parties/party_1"}'
npx startup-builder do Campaign.start --json '{"campaign":"paid-search","budget":{"amount":2050,"currency":"USD","per":"test"}}'   # Not live yet (gaps #2)
{
  "name": "do",
  "arguments": {
    "code": "await $.Keyword.measure({ keyword: 'rent collection software', locale: 'en-US', venue: 'google-search' })   // volume and cost per click, the price of the test\nawait $.Integration.connect({ system: 'ads', scope: 'startup', grants: ['campaigns', 'budgets', 'reports'], venue: 'google-search' })   // your ad account, once\nawait $.Mandate.authorize({ agent: 'agents/agent_7', verb: 'Campaign.update', limit: { spend: 2050, currency: 'USD' }, for: 'parties/party_1' })   // the stop rule: spend to zero when a paid customer costs more than first-year margin\nreturn await $.Campaign.start({ campaign: 'paid-search', budget: { amount: 2050, currency: 'USD', per: 'test' } })   // the 500-click test on your account · Not live yet, gaps #2"
  }
}
Response200application/json
{
  "$type": "Campaign",
  "play": "paid-search",
  "venue": "google-search",
  "forecast": {
    "terms": 6,
    "match": "exact",
    "averageCpc": 4.1,
    "clicks": 500,
    "cost": 2050
  },
  "alreadyPaying": {
    "terms": 4,
    "longestRunningAd": "since 2026-03-02"
  …
sample · 1 Not live yet
Forecast: $0.09; the spend is yours
First run
Coming
Status
Your Google and Meta ad accounts, once. LinkedIn, Reddit and X sign in for the browser agent.
Connect once

What you get

FieldWhat it says
TermThe exact term the campaign bids on, with its match type.
ForecastClicks, cost per click and spend for a month at your bid, read before any spend.
Test budget500 clicks times the terms’ cost per click: the fewest clicks that read a signup rate.
SpendWhat the campaign spent, by day and by ad, read from your ad account.
SignupsSignups your site recorded from each ad’s clicks.
Cost per signupSpend divided by signups: the first number to read, in week 1.
Projected cost per paid customerCost per signup divided by your signup-to-paid rate. A blank reads unknown until the first customer pays.
Stop ruleThe line you set once. When the test is spent and the projected cost per paid customer passes it, spend goes to zero and the report says why.

How it runs

WhenWhat happensRuns byYour partTakes
Day 0Read who already pays for your terms and the ads they keep running, from Size up competitorsAPInothingminutes
Day 0Forecast clicks and cost for the exact terms nobody pays for yet, and for the rest (Ad cost forecast)APInothingminutes
Day 0Connect your ad account and set the first-year margin the stop rule reads (Stop rule)APIconnect once and approve the budget, about 15 minminutes
Day 0Turn your saved list into an audience and a lookalike (Audience from your list)APInothingup to a day for the audience to fill
Day 1Launch the campaign with the ad kit you approved, on Meta by API (Run on your account)APInothingfirst clicks within a day
Day 1Build the Google, LinkedIn, Reddit or X campaign in its ad manager, signed in as you (Run where there is no API)browser agentnothingfirst clicks within a day of the ad’s review
DailyRead spend, clicks and signups for each ad (Spend and results)APInothingthe same day
DailyMove budget to the ad that wins and pause the rest (Pause or rebudget)API · browser agentnothingthe same day
At 500 clicksProject the cost per paid customer, then keep the winner running or set spend to zero (Stop rule)API · browser agentread the verdict, about 5 minthe day the test is spent

Jobs inside it

JobWhat it returnsPriceStatusRuns by
Ad cost forecastClicks, cost per click and spend for your exact terms at your bid, before any spend$0.09 a forecastComingAPI
Audience from your listYour saved list of first customers as an ad audience, and a lookalike built from itfreeComingAPI
Run on your accountThe campaign, ad sets and ads live on your Meta or Google accountfree; the spend is yoursComingAPI
Run where there is no APIGoogle campaign setup and LinkedIn, Reddit and X campaigns built in each ad manager, signed in as youabout 2¢ a step; the spend is yoursComingbrowser agent
Spend and resultsWhat each campaign and ad spent and what it brought, dailyfreeComingAPI
Pause or rebudgetDaily budget moved to the ad that wins, and losing ads pausedfreeComingAPI
Stop ruleSpend set to zero when the projected cost per paid customer passes your first-year marginfreeComingAPI

Where and how it runs

Where it worksHow it runsConnect once
Google Search, Bing, Facebook, Instagram, LinkedIn, Reddit, XAPI · browser agentYour Google and Meta ad accounts, once. LinkedIn, Reddit and X sign in for the browser agent.

Your agent acts as you on every Venue you authorize. Where a Venue has no API, a browser agent signs in as you and does the steps.

Plays that use it

Reference

Compiled, not written: edit the records it reads (catalog/run-ads), 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.

Contents