What goes in a programmatic media plan, section by section?
Part of Programmatic media planning
The short answer
A programmatic media plan template records what a campaign will buy and why: objective and markets, approved sites with a reason for each, exclusions, lines with flight dates and budget split, formats, the reports that check delivery, and a version log of who approved each change. The client signs it before anything is built.
Key takeaways
- The site section is a table, one row per site, with the reason, the evidence and the selling path, not a bare list of domains.
- Exclusions belong in the plan with their level and source, because buying platforms apply them at different levels and limits.
- Budgets are stated per line, in one named currency, with the pacing rule each platform will apply.
- Every approved version keeps a number, a date, a change summary and an approver, so the built campaign can be traced back to it.
What should a programmatic media plan document contain?
A plan answers a different question from the brief. The programmatic media brief says what the client wants; the plan says what will be bought, line by line, so a buyer can build it and a client can sign it. The insertion order then turns money and dates into a contract. Each document should name the version of the one before it.
| Section | Answers | Typical contents |
|---|---|---|
| 1. Header and objective | What is this plan for, and which brief version does it serve? | Client, campaign name, brief version, objective, markets, languages, plan version |
| 2. Lines | What will be bought? | One row per line: platform, buying route, format, site list, targeting summary |
| 3. Sites with reasons | Where will the ads run, and why each site? | Site table with reason, evidence, selling path and audience in market |
| 4. Exclusions | What must never run? | Exclusion lists, their level, source and owner |
| 5. Flights and budget | When, and how much per line? | Dates, budget per line, currency, pacing rule, reserve |
| 6. Reporting | How will delivery be checked? | KPIs per line, reports, dates and who reads them |
| 7. Approvals and versions | Who agreed to this, and what changed? | Version log, approver per version, links to exports |
Write the header so it reads alone: the brief version, the objective in one sentence, the markets by country and province or state, and the languages. A Canadian plan that does not say English, French or both leaves the site list and the creative open to argument later.
How should sites and reasons be laid out in the plan?
A list of domains says where the money goes but not why. Lay the approved sites out as a table, one row per site, with columns a reviewer can check without asking the planner: a one sentence reason naming the matching content, and evidence a person can open.
| Column | What to record | Where the fact comes from |
|---|---|---|
| Site | The domain exactly as it will be uploaded | The approved target list |
| Line | Which plan line or lines use the site | Section 2 of the plan |
| Reason | One sentence naming the content that fits the brief | The planner's review of sample articles |
| Evidence | Two or three article URLs that support the reason | Pages opened during review, with the date |
| Selling path | Direct or reseller on each exchange the line uses | The site's ads.txt and each exchange's sellers.json |
| Audience in market | Whether the site has a visible audience in the plan's countries, or that data was missing | Chrome UX Report country data or another stated source |
| Language | The language of the sampled articles | The review notes |
| Watch point | The site's weakest point, if any | The review notes |
The selling path column needs the spec's own terms. The ads.txt specification (opens in a new tab) says DIRECT indicates that the Publisher (content owner) directly controls the account, while RESELLER means the publisher has authorized another entity to control the account and resell their ad space. The sellers.json specification (opens in a new tab) adds the seller_type on the exchange's side. Record both, with the date checked, since files change.
For the audience column, name the source. The Chrome UX Report (opens in a new tab) infers country from users' IP addresses, and country dimensions are not available in the CrUX APIs, only in BigQuery. A site with no record is a site without data, not without readers, so write not available rather than zero.
How do you show exclusions in a plan?
Exclusions are part of the deliverable, not a setting added later. List each exclusion list by name with its purpose, the level where it applies, the source of its entries and its owner. The level matters because platforms apply and cap exclusions differently.
In Google Ads, for example, the account level exclusion page (opens in a new tab) allows a maximum of 20,000 placement exclusions at a time and a total of 65,000 placement exclusions per account, says new exclusions typically take effect within 12 hours, and notes that different country domains need separate exclusions, so excluding example.com does not exclude example.co.uk. Its exclusion list page (opens in a new tab) says a manager account can have a maximum of 3 exclusion lists and each client account up to 20. A plan for a US and Canadian campaign should list both the .com and .ca versions of any excluded domain that has both.
Exclusions section of a media plan
- Each exclusion list has a name, a purpose and an owner.
- The plan states the level each list applies at: account, campaign or line.
- Country versions of an excluded domain are listed separately.
- Topic or category exclusions are written in the platform's own category names.
- Any site removed during review is recorded with its reason, so it is not re-added by accident.
- Sites that could not be checked are listed apart from excluded sites, with what was missing.
What belongs in the flight and budget section?
State budgets per line, in one named currency, with dates and the pacing rule. Currency is easy to lose: OpenRTB's bidfloorcur defaults to USD when not set, so a Canadian plan should write CAD next to every figure and confirm each buying account's currency.
Write down how each platform paces the money. In Display & Video 360 (opens in a new tab), line items in an insertion order share the same budget and serve based on the insertion order's start and end dates. In Google Ads, the average daily budget page (opens in a new tab) says a campaign will never pay more than two times the average daily budget on a day for most campaigns, or 30.4 times it in a month. Work out daily figures for short flights with that rule in mind.
Build the flight and budget section in five steps
- List the flights. Give each flight a start date, an end date and the lines it contains.
- Split the budget by line. Show each line's amount and its share of the total, in one currency.
- Name the pacing rule. Even, front loaded or as fast as possible, and where it is set in each platform.
- Hold a reserve. Keep a stated share unallocated, with the rule for releasing it and who decides.
- Set the review dates. Name the dates when spend will be compared with the plan and lines may be rebalanced.
Formats sit next to the budget, since a line cannot spend in sizes the creative lacks. List sizes and video placements per line; see IAB ad sizes and outstream video ads.
How should the plan record approvals and versions?
A plan changes after it is first shared: a site comes off, a budget moves, a flight is extended. Each approved state needs a version number, and the campaign that gets built should name the version it was built from. The insertion order should do the same, since the 4A's and IAB Standard Terms 3.0 (opens in a new tab) expect each IO to specify the deliverables, prices, the maximum amount of money to be spent and the start and end dates.
| Field | What to record | Why it matters |
|---|---|---|
| Version | A number that only goes up, such as v1, v2, v3 | The build and the IO can name it |
| Date | The day the version was approved | Matches the dates in delivery reports |
| Changes | What changed from the last version, in a sentence per change | A reviewer sees the difference without comparing files |
| Approved by | The named person, not a team | Someone can answer for the decision |
| Exports | The files produced from this version and where they are stored | The uploaded list matches the approved list |
Reporting closes the loop. For each line, name the KPI, the report that shows it and the date it will be read, plus one report comparing where ads served with the approved site list. The media plan QA checklist covers launch checks after approval.
How does PlacementGraph produce the sites and exports for a plan?
What does a filled plan look like?
Fictional example
A live music theater in Branson, Missouri
A fictional live music theater in Branson, Missouri, plans a spring ticket campaign in English for Missouri, Arkansas and neighboring states. The plan's header names brief version 2 and one objective: drive ticket sales for May to September shows.
Section 2 has two lines: display through a curated deal on music, family travel, local events and regional news sites, and outstream video on a smaller set of travel sites. Each site row gives a reason, such as most sampled articles are show reviews and trip guides for the region, with three article links, the selling path on the deal's exchange and the audience check date.
The exclusions section lists the agency's standing list at the account level and a campaign list of four sites removed in review, each with its reason. The budget is stated in USD per line with a reserve held for the second flight. Version 3 adds two regional news sites; the log records the change, the date and the client's marketing director as approver, and only the version 3 files are uploaded.
Frequently asked questions
Should a media plan be a spreadsheet or a document?
Both, for different parts. The objective, rationale and approvals read better as a short document, while lines, sites and budget belong in tables that can be sorted and exported. Keep them as one versioned package so a client never approves a document whose tables changed since.
How much detail should the plan give about targeting?
Enough that a second buyer could build the same campaign: markets, languages, site list, exclusions, formats and any audience or contextual layers per line. Settings the platform fills by default can be named once in the header.
Should the plan show a price for each site?
Price belongs on the line, not the site. Prices are set per line, deal or insertion order, and one curated deal or open exchange line covers many sites at once. Give each line its pricing basis, such as a deal floor or a target CPM, and keep per site rows for reasons and evidence. A directly sold site with its own rate is the exception.
What happens to the plan after the campaign ends?
Keep the final approved version with the delivery reports and the served placement report. Comparing where ads ran with the approved list shows which sites delivered and which reasons held up, and the next plan starts from that record.
Sources
- ads.txt Specification Version 1.1 (opens in a new tab)IAB Tech Lab on GitHub
- sellers.json specification (opens in a new tab)IAB Tech Lab on GitHub
- CrUX dimensions (opens in a new tab)Google Chrome for Developers
- Exclude placements at the account level (opens in a new tab)Google Ads Help
- Use placement exclusion lists across your accounts (opens in a new tab)Google Ads Help
- Create an insertion order (opens in a new tab)Display & Video 360 Help
- About average daily budgets (opens in a new tab)Google Ads Help
- OpenRTB 2.6 specification (opens in a new tab)IAB Tech Lab on GitHub
- Standard Terms and Conditions for Internet Advertising for Media Buys One Year or Less, Version 3.0 (opens in a new tab)4A's and IAB
Researched and written by PlacementGraph Research. Read how we research, source and update these pages. Corrections: diana@placementgraph.com.