URL: /capabilities/find-customers/verified-list · Id: `page:/capabilities/find-customers/verified-list`

# 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.

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

```text title="Run it · Ask"
Deliver 400 verified heads of operations at US property managers, 4¢ a contact, with the bounce warranty, and show me the plan first.
```

```ts title="Run it · SDK"
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' } })
```

```json title="Run it · 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"
  }
}
```

- **Kind:** Service
- **Price:** 4¢ per contact
- **Your time:** 8 minutes
- **Approval:** Runs on its own
- **Deepens:** [`process:outbound`](https://startupbuilder.dev/workflows/processes/outbound)

## 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. · [`noun:audience`](https://startupbuilder.dev/business/nouns/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](/code/integrations/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.

```ts
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`](/capabilities/find-customers/build-a-verified-list) | 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`](/code/data/people/verify-email) | 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`](/capabilities/find-customers/build-a-verified-list) | 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

| 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`](/capabilities/find-customers/verified-list) |
| Only companies hiring a leasing coordinator this month. | [`Organization.find`](/code/data/organizations/find) |
| Keep the list fresh every month and drop anyone who bounces. | [`Audience.refresh`](/capabilities/find-customers/list-refresh) |

```ts
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](/code/compose) from these steps.

## Works with
**Plays that order it:** [Account ads](/plays/account-ads), [Buying committee](/plays/buying-committee), [Cold email](/plays/cold-email), [Show up in person](/plays/field-presence).

| Built from | Kind | Its own price |
| --- | --- | --- |
| [Build a verified list](/capabilities/find-customers/build-a-verified-list) | Workflow | About $1.38 per 100 checked emails |

It serves [Find your first customers](/capabilities/find-customers). It deepens [`process:outbound`](https://startupbuilder.dev/workflows/processes/outbound).

## For agents

| 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 | Action class | Seat rule that would hold it |
| --- | --- | --- |
| 1. Build the list | None | None. |
| 2. Check each address again on the day of first send | None | None. |
| 3. Read bounces at first send | None | None. |
| 4. Replace each bounce over 2% | None | None. |

The amounts live once, on the hub ([approvals](https://startupbuilder.dev/agents/approvals)).

| 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, $0.titles, $0.size` |
| 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

| Kind | What it touches |
| --- | --- |
| Systems | None. |
| Nouns | [`noun:audience`](https://startupbuilder.dev/business/nouns/audience), `noun:contact-point`, [`noun:collection`](https://startupbuilder.dev/business/nouns/collection) |
| Events | `Collection.queried` |

## Reference

| 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`](/code/refusals#max-cost) before it spends, and with the Data calls and Accounts groups ([refusals](/code/refusals)).