Approved plan and portfolio media
Plan line matched to campaigns, on the same tax basis
Pace, balance and required daily spend
Dashboard, alerts and AI agent
What it solves
- Planned and actual sit on the same basis, with or without tax, on every channel.
- Each plan line matches real campaigns and ad sets, and what does not match shows up.
- The team knows every day how much to spend per day to close the month at the cap.
Business questions it answers
Ask your agent these questions once the case is live.
What you need
- Each client's approved plan in a spreadsheet or document with line, channel, period and budget
- The portfolio's media table already unified
- Each client's tax or markup factor and which plan column is the comparable one
What you get
- A daily planned vs. actual table by plan line
- Pace, balance and required daily spend by channel and line
- Alerts for lines with no delivery, spend outside the plan and pace outside tolerance
- An AI agent that answers about budget using the current plan version
Where to activate
Planned, actual, pace and required daily spend by channel and line.
Line with no delivery, spend off plan or pace outside tolerance, with the text written by AI from the rule.
Answers whether the client is on pace using the current plan version.
The math is simple. The work is reading each client's spreadsheet the right way and matching each plan line to real campaigns. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.
The plan arrives as a spreadsheet, with several versions, numbers as text in Brazilian format and the with-tax column filled only for Meta, sometimes with the label swapped. The platform reports net spend, and the plan may be gross. Campaigns are renamed, paused and duplicated mid-month, and part of the plan is media that has no connector at all.
How it is usually done, and the rule
Each row is a mistake that already happened in practice.
Use the month's approved version, the tab or document marked as current. Old versions stay as history, flagged, for month-over-month comparison, and never enter the month's planned amount.
spend.The platform reports net spend. If the plan is gross and the client pays a markup on Meta spend (12.15% and 13.83% are real cases), convert planned to net (gross x 0.8785, or the factor in the client's spreadsheet) or actual to gross (net x 1.1215), and state which. Google and other channels usually have no factor.
In real spreadsheets, the column labeled with tax held the net value and the one without tax held the gross. Net is the smaller of the two and is what the platform reports. Check against a few days of actual spend before publishing the reading.
Values arrive as text in Brazilian format: remove the thousands dot and swap the comma for a dot before converting, or 1.456 becomes 1. Dates may come as text, a spelled-out month or a serial number; convert them and store each line's start and end.
Declare how each line matches media: ad set on Meta, ad group on Google, campaign on LinkedIn, or a pattern in the campaign name (region, product, funnel stage). Sum every campaign and ad set that matches the line, active, paused or renamed: that is what matches the This month column in Ads Manager. A published line with no matched campaign is an alert; a campaign spending with no line is off plan.
Planned to date = line budget x line days elapsed / line total days, in the client's time zone, with yesterday as the last full day. A line with a partial period (a fortnight, two weeks) has its own calendar. Required daily spend = (budget - actual) / line days remaining.
spend.Programmatic, Pinterest, offline media or any channel with no connector shows up in the plan with a no connector status and stays out of the comparable total. It never shows up as a stopped campaign.
When the team moves budget between networks mid-month, the plan gets a new version with a cutoff date. The pace alert reminds the team to update the spreadsheet when one network's actual rises and another's falls by the same proportion.
Pace within the client's tolerance is normal. Outside it, the alert states channel, line, pace, balance and required daily spend. Do not alert pace in a line's first days; a line that should have started and is not yet published gets a preparation alert.
Plan alerts
One row per alert per day, crossing the current plan with media.
Definitions
spend of the campaigns matched to the line, from the line's first day through yesterday, in the client's time zonePitfalls that already happened
In one client's spreadsheet, the net value sat in the column labeled with tax and the gross in the one without. Meta pacing came out wrong by the tax factor.
Use the value: net is the smaller and matches spend.
Budgets in text like 1.456 became 1 because the thousands dot was read as a decimal.
Remove the thousands dot and swap the comma before converting.
Summing only active campaigns left out the ones paused and renamed mid-month, and actual came in below the This month column.
Sum everything that matches the line's key.
Lines for media with no connector showed zero spend and fired a no delivery alert every day.
No connector status and a separate comparable total.
The date columns in the month's plan still carried the previous month's period, inherited from the copied version.
The document's reference period prevails; check dates before publishing.
Acceptance test
The case is done when every item passes.
- For each client and month, planned equals the sum of the current version's lines on the declared basis.
- Each line's actual matches the This month column in Ads Manager for the matched campaigns (difference below 1%).
- Every campaign with spend in the month is matched to a line or shows up as off plan.
- Lines for channels with no connector do not enter the comparable total.
- Actual + balance = budget, on every line.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
Media plan vs. actuals - Planned comes only from the current version of the month's plan. Old versions are history. - The platform reports spend net of tax. Compare on the same basis: say whether planned was converted to net or actual to gross, and with which factor. - In the spreadsheet, use the value, not the label: net is the smaller of the two values. - Line actual = sum of every campaign and ad set that matches the line's key, including paused and renamed ones. - Pace = actual / (budget x days elapsed / line total days). Required daily spend = balance / days remaining. - Reference day = yesterday, in the client's time zone. - Channels with no connector in Nekt show as no connector and stay out of the comparable total. Per-client exceptions: - <client>: Meta with a <x>% markup; planned converted to net with factor <f>. - <client>: regions separated by the term <term> in the campaign name, within the same account. - <client>: pace tolerance of <x>%; new budget starting <cutoff date>.
Build the "Media plan vs. actuals" case in my Nekt workspace following the rules at https://academy.nekt.com/en/industrias/agencias/plano-de-midia-realizado.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
Clients without a structured spreadsheet keep the approved plan in a monthly context document, with a current or history status.
Planned and actual by top, middle and bottom of funnel, with each line's KPI.
An account with several regions is split by campaign name, and each region has its own plan.