Tempio

How to write a media plan

Tempio11 min read

A media plan is the cheapest place in advertising to be wrong. Nothing in it reaches an ad account, so a line you halve, move or delete costs a keystroke rather than a day of spend. This guide writes one end to end: the window, the currency, the brief, the items, the arithmetic underneath the budgets, and the single action that turns the whole document into drafts waiting at the gate.

What you need before you start

Three things, and a spreadsheet is not one of them.

A workspace with at least one connection that has finished a sync. A plan does not strictly need one — an unconnected workspace can still plan a quarter — but planning without the account's own history in front of you is guessing with extra steps, and materialising the plan later does need somewhere to put the campaigns.

A number for the window. Not a per-campaign number and not a daily one: the total you are prepared to spend across the whole stretch of calendar you are planning. Everything below is that number being divided up.

A sentence about what counts as working. Not a target, not yet — a sentence. "Cost per signup under forty and volume at least last quarter's" is a sentence. A plan without one is a plan nobody can grade afterwards, including you.

Read the account before you plan against it

Ten minutes here saves an argument later. With a connected workspace you can ask, in one exchange, what the last ninety days actually looked like:

Which campaigns carried the spend over the last ninety days, and how concentrated was it?

Give me the brief for that ad account.

The account brief is the long answer: what the window covered, the totals, a comparison against the previous twenty-eight days, the mix of objectives, how concentrated the spend was, the rankings by return and by cost per acquisition, and the rhythm across weekdays. It is computed rather than live, so it carries its own age and is flagged once it is more than a week old. Say when it was computed before you quote it into a plan.

Two conventions in what comes back are worth knowing before you build a budget on it. Money is an integer in minor units with its currency beside it, never a formatted string. Ratios are computed when they are read and come back as null when the denominator is zero — read a null as "there is nothing to divide by", never as a zero, because that substitution is the most common way a plan gets built on a lie.

If you want to work the return arithmetic by hand before committing to a split, the ROAS calculator and the CPA calculator do it without an account attached, and the CPM calculator is the one to reach for when the question is how much reach a line actually buys.

Set the window, and set it once

A plan carries a start day and an end day, as calendar days, and every item's flight has to sit inside them. The check runs in both directions, which means narrowing a plan's window under an item that no longer fits is refused — with the item named — rather than silently stranding it outside.

Pick the window the money is committed over rather than the window the campaigns run in. A quarter with a launch in the middle is one plan with a window of a quarter, not three plans of a month each, because the whole point of the document is that the total at the top is the number you are actually spending.

Pick one currency and mean it

A plan carries a single currency and every budget inside it is a whole number of that currency's minor units. The picker offers the currencies your connected accounts actually bill in, and it is a restriction rather than a hint: a plan can only be budgeted in one of them. What matters after that is that each item resolves to an account billing in the plan's currency.

An item pointed at an account that bills in something else is refused at materialisation, by name, with what that account bills in. It is not converted. No rate is applied anywhere on the writing side, because a plan whose total was a sum across two currencies at a rate nobody recorded is not a total at all.

Running two currencies genuinely? Two plans. The document stays honest and the arithmetic stays checkable.

Write a brief the next person can read

The brief is prose and nothing parses it. It is there so the plan still makes sense to the person who did not write it, and so an agent has the intent in front of it when you ask for help shaping the items.

Four sentences is usually enough: what the flight is for, who it is aimed at, what counts as working, and what you will not do. The last one earns its place more often than the first three, because it is the sentence that stops a well-meaning reallocation in week six.

If you want the longer form — objectives, audiences, constraints, the handover fields — the campaign brief template is the document this field is the short version of, and the media plan template is the same structure as a spreadsheet for the parts of the organisation that will not read a web page.

One item per campaign you intend to run

An item is one campaign. It carries the platform it lands on, the campaign's name, an optional objective, a whole-flight budget, a flight inside the plan's window, an optional ad account, and its place in the board order — which is the order its draft gets written in.

Name the items the way you will want to read them in a report six weeks from now, because the name is carried straight onto the draft and then onto the campaign. Leaving the ad account empty is fine when the workspace has exactly one account on that platform; it resolves on its own. Set it explicitly when there are several, or you will meet the refusal later.

The objective field is optional here on purpose. If you know the platform's own objective value, put it in and it travels onto the draft. If you do not, leave it out — an absent objective is absent rather than null, and the draft carries what you knew rather than a guess.

The budget arithmetic, worked

An item's budget is the whole-flight total, not a daily rate. The daily figure a platform wants is derived from it at materialisation, over the inclusive length of the flight:

daily budget = whole-flight budget ÷ inclusive flight days

5,600,000 minor units ÷ 28 days = 200,000 minor units a day
5,600,000 minor units ÷ 20 days = 280,000 minor units a day

Those two lines are the same money and a forty per cent difference in daily rate. Shortening a flight without touching the budget field raises the daily figure, and it is the single most common way a plan gets refused by a guardrail it looked nothing like at the time it was written.

So check the derived figure, not the total, against the limits. A draft may not set a daily budget above the account's own ceiling, which is derived from what that account has actually done and floored at a default stated in the account's own money — a thousand in most currencies, with the two whose major unit is nowhere near a dollar stating their own. An entity with no budget yet is held to a first-budget cap instead, half the daily floor by default. And applied increases on one connection are summed over a rolling twenty-four hours, so ten individually legal raises are still refused as the doubling they add up to.

None of that fires while you are typing. All of it fires at materialisation, and the refusal is cheaper to read if you have already done the division yourself. For a split across several lines at once, the budget allocator template does the arithmetic in a sheet, and the flight plan template is where overlapping flights stop being a thing you hold in your head.

Turn the plan into drafts

One action, and it is the only one in this guide with consequences. Materialising the plan turns every item into a create-campaign draft at the approval gate.

It validates everything before it writes anything, in order: it re-reads the plan and its items rather than trusting the rows it was shown a minute ago, checks each flight and budget, resolves an ad account for every item, checks each account's currency against the plan's, then runs the connection's kill switch and the account's budget guardrails using the same functions the gate itself runs. A failure at any step drafts nothing at all. A plan half-turned-into-drafts — three items queued and the fourth refused — is exactly what this refuses to produce.

What comes out is one batch per connection, items keeping their board order inside each batch, and each item's whole-flight budget expressed as the derived daily figure. The flight days become instants in the ad account's own timezone, with the stop exclusive. The plan's currency is stated on the payload and the gate re-stamps it from the account regardless.

Then the plan freezes. Name, brief, window, currency and items stop being editable, because the plan is now the record of what was drafted, and a record you can edit behind is not a record. Archive is the only thing still allowed, and it is how a plan is retired.

What happens at the gate

A create is one of the operations no approval rule may ever clear on its own, so a materialised plan always waits for a person. That is not a general promise about every change — a rule you wrote can clear other things on the way in, and the record says which authority cleared each row — it is a property of creating something that did not exist.

Every create also lands paused on the platform. Approving the batch builds the structure and spends nothing; starting delivery is a second change through the same gate. Two acts, two records, rather than one act with a side effect.

The shape holds across the whole product and it is worth stating once here in plain words. Your connections read your accounts. A change an agent or a person asks for is written as a draft on the record, with the state it would change from and the checks it passed. Applying it is gated on approval — by you, or by a rule you wrote — and no platform write reaches a customer account until that platform has granted write access. Applying a cleared change to a platform is in private beta.

What a finished plan does not do

It does not watch the accounts. The plan states what you intended and the reporting side states what happened, and holding the two against each other is work you do on a rhythm you set. Nothing here flags drift, and a document that implied it did would be describing a different product.

It does not reserve money. A plan is not a budget hold on an account, and two plans covering the same window will happily add up to more than you have.

It does not survive contact unchanged, which is the argument for archiving and re-planning rather than editing a frozen plan into something it never was. The frozen document plus the drafts it produced is a readable account of what you decided and when. That is worth more than a plan that always agrees with the present.

When it refuses

Four refusals cover almost everything, and each one names the thing to fix.

An item flying outside the plan's window names the item and both windows. Move the item, or set a plan window that covers it.

An unresolved ad account names every unresolved item at once. Set an account on each, or connect a channel with exactly one account on that platform so it resolves on its own.

A currency mismatch names the account and what it bills in. Point the item at an account in the plan's currency, or plan that window in the account's.

A guardrail refusal names the number. Almost always the derived daily figure is above the account's ceiling, which means the flight is shorter than the budget assumed or the budget is larger than the account's own history supports. Lengthen the flight, lower the total, or split the line.

If you are driving any of this from your own client rather than the pages, the eight plan routes sit on the same programmatic surface as everything else — reading a plan takes a read key, and creating, editing and materialising one take a draft key, because materialising produces change requests rather than changes. Connect Claude Code to your ad accounts is the setup, and Why every change is a draft is the reasoning behind the gate this plan eventually meets.

The argument for why the document is worth writing at all — that it is the only place in advertising where being wrong is free — is What a media plan is for.

Read next

Questions

Put frontier AI to work on every ad account you run.

Tempio connects your ad accounts into one workspace and hands your own AI the numbers and the tools. Every change it writes is a draft until you approve it, or until a rule you wrote does.

Request early access
  • Read and draft by default. Approve is a separate permission you grant.