Skip to content

Verified list with a bounce warranty

A list of checked work emails at the right companies, billed per contact; every bounce over 2% at first send is credited and replaced.

Kind
Service
Price
4¢ per contact
Your time
8 minutes
Approval
Runs on its own
Deepens
Outbound
Audience.deliver
You, to your agent

Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.

curl -X POST "https://api.sb/leaseline.app/audiences/deliver?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"goal":"Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.","budget":{"amount":16,"currency":"USD"}}'
npx startup-builder do Audience.deliver --try --data '{"goal":"Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.","budget":{"amount":16,"currency":"USD"}}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Audience.deliver({ goal: 'Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.', budget: { amount: 16, currency: 'USD' } })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Audience.deliver({ goal: 'Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.', budget: { amount: 16, currency: 'USD' } })
Response
{
  "mode": "try",
  "stored": false,
  "estimate": "About $6.30 per 400 contacts",
  "bills": "4¢ a contact",
  "sample": {
    "delivered": "400",
    "bounced at first send": "11 (2.75%)",
    "allowance": "8",
    "credited": "3, replaced",
    "billed": "397"
  }
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

What you get

  • 400 contacts · A list of checked work emails at the right companies, billed per contact; every bounce over 2% at first send is credited and replaced. · Audience
  • audience · The list, as an Audience you can enroll, sync to an ad account or refresh.
  • bounces · Bounces at first send, the 2% allowance, and each one credited and replaced past it.
  • bill · contacts delivered, less those credited, times the price.

Connect once: Gmail. How long: The list in about 20 minutes; the warranty reads bounces for 72 hours after each first send.

Trigger

It runs when you call it, or on any Trigger you set.

TypeScript
await $.Workflow.create({ verb: 'Audience.deliver', trigger: { schedule: 'weekly' } })

Steps

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

StepVerbReturnsPriceApproval
1. Build the listAudience.buildChecked work emails at accounts that fit, each at the right companyAbout $5.52Runs on its own
2. Check each address again on the day of first sendContactPoint.verifyEmailAny address that turned invalid since delivery swapped out before it can bounceAbout 71¢Runs on its own
3. Read bounces at first sendCollection.queryEach hard bounce at first send, against the 2% allowanceFreeRuns on its own
4. Replace each bounce over 2%Audience.buildA checked contact at a fitting account for each bounce past the allowance, at no chargeAbout 6.9¢Runs on its own

Calls: Audience.build, then ContactPoint.verifyEmail, then Collection.query, then Audience.build.

About $6.30 per 400 contacts, each time it runs, capped at $10.00.

Example: give it a goal

Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.

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

When something fails

Each failure, and what happens next
WhenThen
The first send waits more than 30 daysThe warranty lapses for the contacts not yet sent; a fresh re-check before sending costs 0.18¢ an address.
A bounce comes from a full mailbox, not a dead addressIt is a soft bounce: it counts toward nothing, and the address is tried again on the next touch.
You send from your main inbox insteadThe warranty still reads the bounces, and the agent warns you once that cold sends belong on the warmed second domain.

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-audience-deliver-1-<step>-<item>.

What it promises

TermThis Service
DoneA contact at an account that fits, at the right company, whose address checks valid and does not push the list past 2% bounces at first send.
Counted byAudience.delivered
Billed4¢ a contact, on acceptance
TargetThe size you order, such as 400 contacts.
Accepted whenEach contact is accepted 72 hours after its first send, unless it bounced past the allowance.
CreditedEvery bounce over 2% of the list at first send.
RemedyEach bounce over the 2% allowance is credited and replaced with a checked contact at no charge.
EvaluatorCode reads the Mailbox’s own bounce records 72 hours after each first send.
Window30 days from delivery for the first send, then 72 hours from it.
Assurancemeasured, the weakest check on the way to done
Oversightnone: agents do every step

A 400-contact order, first sent over 8 weekdays from two warmed inboxes.

CountWhat happened
400Ordered
400Delivered
389Delivered at first send.
8Bounced inside the 2% allowance, and billed.
3Bounced past the allowance: credited, and replaced with 3 checked contacts at no charge.
397Accepted, billed 397 × 4¢ = $15.88

Change it

AskCompiles to
Make it 1,000 contacts and two people per company.Audience.deliver
Only companies hiring a leasing coordinator this month.Organization.find
Keep the list fresh every month and drop anyone who bounces.Audience.refresh
TypeScript
import { $, Service } from 'startup-builder'

export default Service({
  name: 'audience-deliver',
  verb: 'Audience.deliver',
  input: { icp: 'string', titles: 'string[]', size: 'integer', firstSend: 'string[]' },
  maxCost: 10,
  builtFrom: ['Audience.build'],
  oversight: { posture: 'none' },
  contract: {
    done: 'Audience.delivered', accept: { by: 'metric:bounce-rate', at: 'first-send', within: '72h' }, assurance: 'measured',
    bills: { usd: 0.04, per: 'contact' }, credits: ['bounce-over-2-percent'], remedy: 'credit-and-replace',
  },
  execute: async (ctx, { icp, titles, size = 400 }) => {
    const list = await ctx.step('list', () => $.Audience.build({ icp, titles, size, maxCost: 8 }))
    const bounces = await ctx.waitFor('Message.bounced', { audience: list.$id, firstSend: true, within: '72h' })
    const over = Math.max(0, bounces.hard - Math.floor(size * 0.02))                   // the 2% allowance
    if (over) await ctx.step('replace', () => $.Audience.build({ icp, titles, size: over, into: list.$id, maxCost: 0.2 }))
    return { list, credited: over }
  },
})

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

Works with

Plays that order it: Account ads, Buying committee, Cold email, Show up in person.

Built fromKindIts own price
Build a verified listWorkflowAbout $1.38 per 100 checked emails

It serves Find your first customers. It deepens Outbound.

For agents

For agents: the guide, its approvals, retries and lookups
FactValue
GuideAudience.deliver
Guide approvallimits
GoalDeliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, 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.
RetryThree times with backoff, then the next route; the same idempotency key never charges, sends or posts twice
Idempotency keyleaseline-audience-deliver-1
LookupsA find: input asks unless exactly one record fits
Step
1. Build the list
2. Check each address again on the day of first send
3. Read bounces at first send
4. Replace each bounce over 2%

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

Who does each step, and how it is checked
StepFunctionDoerCheckerAssuranceInputs
1. Build the listcodeCodeCode reads each address’s check result and its domain against the account’s own before the row joinsmeasured$0.icp, $0.titles, $0.size
2. Check each address again on the day of first sendcodeCodeEach address’s check result, read again within 24 hours of its first sendmeasured$1.rows
3. Read bounces at first sendcodeCodeThe Mailbox’s own bounce records, read 72 hours after each first sendmeasured$0.firstSend
4. Replace each bounce over 2%codeCodeEach replacement passes the same check and domain match before it joinsmeasured$3.over

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
SystemsNone.
NounsAudience, Contact point, Collection
EventsCollection.queried

Reference

Inputs, outputs, its Event and its errors
NameTypeDefaultMeaning
icpstringRequiredYour customer sentence. Every contact is at an account that matches it.
titlesstring[]RequiredThe titles to reach at each account.
sizeinteger400Contacts wanted. The warranty covers each one for 30 days from delivery.
firstSendMailbox[]your two warmed inboxesWhere the first send goes out, so its bounces can be read: 2 inboxes on a warmed second domain, 25 a day each.

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

Contents