← Files Realize PluginARCHIVED FILE
knowledge/reach-estimation.md
6.71 KB · Nov 12, 2026 · 12:09 UTC
# Reach Estimation
## Overview
Reach estimation answers two related questions: **what reach can a planned (not-yet-created) campaign expect?** and **is an existing campaign too narrowly targeted to deliver?** The Realize MCP exposes this directly via `mcp__realize-mcp__get_campaign_reach_estimate`.
---
## Realize's Constraint — Campaign-Level Only
Reach in Realize is computed per **campaign configuration**, not per **publisher**. There is no reliable path to "how many impressions can publisher X deliver at $Y CPC for audience Z." Even when a number exists in some internal report, it is a model output with strong assumptions, not a guarantee.
Always pitch reach at the campaign level. When the user asks for per-publisher reach, decline and explain why — see "Phrasing When the Request Asks for Per-Publisher Reach" below.
---
## Tool Contract — `mcp__realize-mcp__get_campaign_reach_estimate`
Description (verbatim from the MCP): *"Estimate the potential reach — audience size, how many users or impressions — of a hypothetical campaign before launch on a Realize account."*
### Inputs
| Field | Required | Description |
|---|---|---|
| `account_id` | Required | The account's string `account_id` (from `mcp__realize-mcp__search_accounts`). NOT the numeric `id`. |
| `campaign` | Required | Object mirroring the hypothetical campaign's targeting + bidding. See "Campaign block" below. |
| `estimation_types` | Required | Array. Supported values include `"IMPRESSIONS"` and `"MONTHLY_USERS"`. Minimum `["IMPRESSIONS"]`. |
### Campaign block — fields the estimator reads
Send the same targeting / bidding fields you would send to `create_campaign`. The estimator does NOT create anything; it only evaluates the hypothesis.
| Field | Notes |
|---|---|
| `country_targeting` | `{type: INCLUDE\|EXCLUDE\|ALL, value: [ISO-2 codes]}`. Resolve codes via `search_geos(dimension=countries)`. |
| `region_country_targeting` / `dma_country_targeting` / `city_targeting` / `postal_code_targeting` | Same shape as on `create_campaign`. Sub-dimension mutex applies (at most one). |
| `platform_targeting` | `{type: INCLUDE\|EXCLUDE\|ALL, value: [DESK\|PHON\|TBLT\|TV\|OTHR\|NA]}`. |
| `audiences_targeting` | `{state, value: [{type, value: [int]}]}`. IDs from `search_audiences`. |
| `contextual_segments_targeting` | `{state, value: [{type, value: [int]}]}`. IDs from `search_contextual_segments`. |
| `lookalike_audience_targeting` | `{state, value: [{type: INCLUDE, value: [{rule_id, similarity_level}]}]}`. IDs from `search_lookalike_audiences`. |
| `pricing_model` | `"CPC"` or `"VCPM"`. CPC is the standard path; VCPM is the alternate pricing model used for Display campaigns priced on viewable-impression cost. |
| `bid_strategy` | `"FIXED"` is required when `pricing_model="VCPM"`. |
| `cpc` | The bid. With `VCPM` this is the per-1000-viewable-impression rate, NOT a click bid. |
### Outputs
The estimator returns one object per requested `estimation_type`:
| Field | Description |
|---|---|
| `lower_bound` | Conservative estimate. |
| `upper_bound` | Optimistic estimate. |
Empirical observations from session probes:
- **IMPRESSIONS cap ≈ 1,000,000,001.** Broad targeting (e.g. US-only, DESK-only, VCPM @ $5, no audience) returns `lower_bound: 1,000,000,000` and `upper_bound: 1,000,000,001`. Treat any upper at or near this value as a CAP, not a true ceiling.
- **MONTHLY_USERS** is unbounded by that cap (e.g. ~570M – ~592M on the same probe).
---
## Using the Estimator in a Pre-Launch Flow
For any planned campaign where the user needs an estimated reach (impressions, monthly users, or both):
1. **Resolve the targeting** via `search_audiences` / `search_contextual_segments` / `search_lookalike_audiences` → resolved IDs.
2. **Build the campaign block** mirroring the targeting + bidding the user intends to ship.
3. **Call `mcp__realize-mcp__get_campaign_reach_estimate`** with `estimation_types: ["IMPRESSIONS"]` (add `"MONTHLY_USERS"` if the user needs both).
4. **Report the result as a range:** `<lower_bound> – <upper_bound>` (e.g. `1,200,000 – 1,800,000`).
5. **Cap handling:** if `upper_bound ≈ 1,000,000,001`, render as `<lower> – 1,000,000,000+` and tell the user the upper is a system cap, not a true ceiling.
6. **Aggregating across multiple planned campaigns:** sum `lower_bound` values for the floor, sum `upper_bound` values for the ceiling. Report both endpoints; do not collapse to a single number.
### Narrow-targeting flag
When `lower_bound < 1,000` users (matches the Realize UI banner threshold), flag the targeting as too narrow and route diagnosis through the **6-dimension priority order** in `targeting.md` — geo → audience → publisher → bidding → language / quality → platform / OS. Produce a concrete broadening recommendation per identified dimension.
---
## When to Skip the Estimator
1. **User explicitly waives it** — "just budget÷CPM is fine here", "don't bother calling the estimator on this one".
2. **Estimator errors and one retry fails** — report `n/a (estimator unavailable)` and surface the failure to the user. **Do NOT silently fall back to Budget ÷ CPM × 1000** — that is the exact failure mode the estimator is there to prevent.
There is no third skip condition. Even broad demo / geo-only plans get an estimator call (and will hit the ~1B IMPRESSIONS cap, which is informative on its own).
---
## What Not to Promise
- **Per-publisher reach numbers** — structurally not how Realize is queried. Decline cleanly.
- **Reach guarantees on a flight** — model output, not a contract. Use "is expected to," "typically delivers," "is designed to."
- **Reach figures at audience-segment level** — overlap with other segments and impression caps make this unstable. Stick to campaign-level.
---
## Phrasing When the Request Asks for Per-Publisher Reach
> "Realize estimates reach at the campaign level, not per-publisher. I can model the campaign's expected reach for the proposed targeting via the Realize reach estimator, identify the top publishers expected to deliver against it, and revisit with delivery-side actuals after launch — typically week 2."
This is honest about the constraint, gives the user what they actually need (campaign-level reach + named top supply), and avoids inventing per-publisher numbers that won't hold up.
---
## Guardrails
- Never claim a per-publisher reach figure.
- Never present a reach number without saying its source (Realize MCP estimator, delivered actuals, UI estimator).
- Never use reach to justify recommendations on accounts in active onboarding (< 30 days) — there is no meaningful baseline.
- Always pair narrow-targeting alerts with the 6-dimension diagnostic and a concrete broadening recommendation.
- Never fall back to Budget ÷ CPM × 1000 when the estimator call fails silently.
SHA-256: 4444f451ec124ac34fb9a6be2639f0f0ab8eda874f03225df727af9807c0a849