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
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' } })
{
"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"
}
}
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.
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.
| Step | Verb | Returns | Price | Approval |
|---|---|---|---|---|
| 1. Build the list | Audience.build | Checked work emails at accounts that fit, each at the right company | About $5.52 | Runs on its own |
| 2. Check each address again on the day of first send | ContactPoint.verifyEmail | Any address that turned invalid since delivery swapped out before it can bounce | About 71¢ | Runs on its own |
| 3. Read bounces at first send | Collection.query | Each hard bounce at first send, against the 2% allowance | Free | Runs on its own |
| 4. Replace each bounce over 2% | Audience.build | A checked contact at a fitting account for each bounce past the allowance, at no charge | About 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
| When | Then |
|---|---|
| The first send waits more than 30 days | The 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 address | It is a soft bounce: it counts toward nothing, and the address is tried again on the next touch. |
| You send from your main inbox instead | The 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
| Term | This Service |
|---|---|
| Done | A 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 by | Audience.delivered |
| Billed | 4¢ a contact, on acceptance |
| Target | The size you order, such as 400 contacts. |
| Accepted when | Each contact is accepted 72 hours after its first send, unless it bounced past the allowance. |
| Credited | Every bounce over 2% of the list at first send. |
| Remedy | Each bounce over the 2% allowance is credited and replaced with a checked contact at no charge. |
| Evaluator | Code reads the Mailbox’s own bounce records 72 hours after each first send. |
| Window | 30 days from delivery for the first send, then 72 hours from it. |
| Assurance | measured, the weakest check on the way to done |
| Oversight | none: agents do every step |
A 400-contact order, first sent over 8 weekdays from two warmed inboxes.
| Count | What happened |
|---|---|
| 400 | Ordered |
| 400 | Delivered |
| 389 | Delivered at first send. |
| 8 | Bounced inside the 2% allowance, and billed. |
| 3 | Bounced past the allowance: credited, and replaced with 3 checked contacts at no charge. |
| 397 | Accepted, billed 397 × 4¢ = $15.88 |
Change it
| Ask | Compiles 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 |
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: 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 from | Kind | Its own price |
|---|---|---|
| Build a verified list | Workflow | About $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
| Fact | Value |
|---|---|
| Guide | Audience.deliver |
| Guide approval | limits |
| Goal | Deliver 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. |
| Retry | Three times with backoff, then the next route; the same idempotency key never charges, sends or posts twice |
| Idempotency key | leaseline-audience-deliver-1 |
| Lookups | A 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
| Step | Function | Doer | Checker | Assurance | Inputs |
|---|---|---|---|---|---|
| 1. Build the list | code | Code | Code reads each address’s check result and its domain against the account’s own before the row joins | measured | $0.icp, |
| 2. Check each address again on the day of first send | code | Code | Each address’s check result, read again within 24 hours of its first send | measured | $1.rows |
| 3. Read bounces at first send | code | Code | The Mailbox’s own bounce records, read 72 hours after each first send | measured | $0.firstSend |
| 4. Replace each bounce over 2% | code | Code | Each replacement passes the same check and domain match before it joins | measured | $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
| Kind | What it touches |
|---|---|
| Systems | None. |
| Nouns | Audience, Contact point, Collection |
| Events | Collection.queried |
Reference
Inputs, outputs, its Event and its errors
| Name | Type | Default | Meaning |
|---|---|---|---|
icp | string | Required | Your customer sentence. Every contact is at an account that matches it. |
titles | string[] | Required | The titles to reach at each account. |
size | integer | 400 | Contacts wanted. The warranty covers each one for 30 days from delivery. |
firstSend | Mailbox[] | your two warmed inboxes | Where 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).