URL: /capabilities/agents/paid-media · Id: `page:/capabilities/agents/paid-media`

# Paid media

> Prices clicks before any spend, runs ads on your own ad accounts within your spend limit, and stops what does not pay back.

[Prices](https://startupbuilder.dev/business/nouns/price) clicks before any spend, runs ads on your own ad accounts within your spend limit, and stops what does not pay back.

- **File convention:** `agents/marketing/paid-media-manager.mdx`
- **Noun:** [`noun:role`](https://startupbuilder.dev/business/nouns/role)
- **Role:** [`role:paid-media-manager`](https://startupbuilder.dev/agents/marketing/paid-media-manager)

```text title="Run it · Ask"
Show me return on ad spend by Campaign for the last 4 weeks.
```

```ts title="Run it · SDK"
import { $ } from 'startup-builder'

const result = await $.try.Metric.query({ metric: 'metric:return-on-ad-spend', shape: 'trend', breakdown: 'campaign', window: '28d' })
```

```json title="Run it · Response"
{
  "metric": "metric:return-on-ad-spend",
  "window": "28d",
  "rows": [
    {
      "campaign": "rent-ledger-search",
      "value": 2.4
    },
    {
      "campaign": "meta-lookalike-test",
      "value": 0.8
    }
  ]
}
```

## Responsibilities
- Forecasts clicks and cost on each term before any spend.
- Builds each Campaign on your own ad account, with its stop rule set before launch.
- Rotates creative, and pauses an Ad whose cost per click runs above break-even for 3 days at 100 or more clicks, or whose cost per signup runs above twice its target at 20 or more signups.
- Sends conversions back to every ad site, so each one optimizes for buyers.

## Verbs
| Verb | Object | Event |
| --- | --- | --- |
| [`Keyword.forecast`](/code/data/keywords/forecast) | `Keyword` | None: a read |
| [`Audience.create`](/code/apps/ads/create-audience) | [`noun:audience`](https://startupbuilder.dev/business/nouns/audience) | `Audience.created` |
| [`Campaign.create`](/code/apps/ads/create-campaign) | [`noun:campaign`](https://startupbuilder.dev/business/nouns/campaign) | `Campaign.created` |
| [`Campaign.update`](/code/apps/ads/update-campaign) | [`noun:campaign`](https://startupbuilder.dev/business/nouns/campaign) | `Campaign.updated` |
| [`Ad.create`](/code/apps/ads/create-ad) | [`noun:ad`](https://startupbuilder.dev/business/nouns/ad) | `Ad.created` |
| [`Ad.find`](/code/data/ads/find) | `Ad` | None: a read |
| [`Metric.query`](/code/apps/analytics-and-experiments/query) | [`noun:metric`](https://startupbuilder.dev/business/nouns/metric) | `Metric.queried` |

## Role contract
| Part | This seat |
| --- | --- |
| Purpose | Make every paid dollar buy customers the startup can afford. |
| Results | Return on ad spend; Payback on acquisition cost |
| Target | Cost per click at or under your break-even, $4.29 at $149 a month, read at 100 clicks, and at least 1 signup per 150 clicks ([Planning estimate](/strategy/numbers#assumptions)). |
| Standards | Pauses an Ad on leading indicators with their samples: cost per click above break-even for 3 days at 100 or more clicks, or cost per signup above twice its target at 20 or more signups. Spends only within the Demand Budget, on spend you authorized. |
| Limits | `Mandate.spend` up to $500 a week ([the hub Paid Media Manager’s limit](https://startupbuilder.dev/agents/marketing/paid-media-manager)), and only on spend you authorized |
| Schedule | Daily |
| Channels | `social` |
| Also called | Performance Marketer, Media Buyer |
| Filled by | A role agent, from the start; the spend is yours, on your own account. |

## Hands off to
- [Marketing lead](/capabilities/agents/marketing-lead): A Campaign’s stop rule fires: the readout and the next test go to the weekly review.
- [Content lead](/capabilities/agents/content-lead): An ad angle wins: it briefs a page on the same promise.

## Processes owned
[`process:launches`](https://startupbuilder.dev/workflows/processes/launches) · [`workflow:compile-demand-kit`](https://startupbuilder.dev/workflows/processes/launches/compile-demand-kit) · [`workflow:run-experiment`](https://startupbuilder.dev/workflows/processes/experimentation/run-experiment)

## Metrics
[`metric:return-on-ad-spend`](https://startupbuilder.dev/agents/marketing#return-on-ad-spend) · [`metric:cac-payback`](https://startupbuilder.dev/agents/finance#cac-payback)

## Approvals
You see the plan and its price before anything runs. Sends and posts go out within the limits you set; one approval rule on a class such as `send` makes every action in it wait for you, and going over a limit always asks.

| It asks you | When | Answered by |
| --- | --- | --- |
| Spend past the week’s limit | Past the seat’s weekly `Mandate.spend` limit, or on spend you have not authorized | You |

Each class and its default amount: the hub’s [approvals](https://startupbuilder.dev/agents/approvals) page.

## Works with
- [Ad kit](/capabilities/make-content/ad-kit) (agent task): One angle in, five headlines and texts, five images at each site’s sizes and a 6-second clip out, every claim checked, saved as Variants.
- [Ad test setup](/capabilities/run-ads/ad-test-setup) (Workflow): Your ad Variants in, one campaign out on your own ad account, split evenly, with the conversion checked and the stop rule set first.
- [Message test](/capabilities/run-ads/message-test) (agent task): Four angles in your buyers’ words run as ads on $100 of your spend, and the winner named by a rule set before any spend.

It trades hand-offs with [Marketing lead](/capabilities/agents/marketing-lead) and [Content lead](/capabilities/agents/content-lead).

## Example
Before any spend, the agent forecasts three rent-ledger terms at about $2.40 a click, under the $4.29 break-even at $149 a month, and launches on Google Search at $70 a day, inside the $500-a-week limit. By day 16 one term has 104 clicks at $5.10 each, above break-even for 3 days running, so the agent pauses it and moves its budget to the two terms still under the line.