Finance says the budget is spent and the team says half of it has not been invoiced. Here is the model behind a tracker that settles that, the prompts to build it, and what it takes to run it.
Your private status link is on its way to your inbox.
A marketing budget tracker needs four things: a budget broken down by programme and channel rather than by cost centre alone, committed spend recorded at the moment of commitment, actuals reconciled from finance, and a per-programme view of what remains. The disagreement between marketing and finance is almost always about commitments. Marketing knows it has signed a contract, finance sees no invoice, and both are looking at correct data that disagrees.
Marketing budget
2.4M
Planned this year
1.6M
Invoiced
410K
Committed, not invoiced
390K
Actually remaining
Agency is highlighted because it is the only programme with nothing left: 360K planned, 90K committed, 270K invoiced, zero remaining.
You run marketing operations or own a marketing budget. You already get a monthly report from finance. What you want is to know what is left before you sign the next contract, without a reconciliation exercise.
What a channel owner does before they sign something, and what finance does at quarter end.
Because programme is the unit marketers make decisions in, and cost centre is a finance structure.
With the expected invoice schedule, which is where the disagreement with finance actually lives.
And match against open commitments, so nothing is counted twice.
Spend with no commitment means the process was bypassed. A stale commitment usually means work quietly stopped.
Enter a proposed amount against a programme and see what would remain. This is the screen that prevents overspend rather than reporting it.
So a correction next month cannot rewrite a number already in a board pack.
A marketing budget tracker is not a spend report. It is four parts, and the second is the one that ends the argument.
Planned spend by programme, channel, quarter and owner, with the original plan kept alongside any reforecast. Programme is the unit marketers actually decide in.
Recorded when a contract, insertion order or purchase order is signed, with the expected invoice schedule. This is the number marketing has and finance does not.
Invoiced and posted spend pulled from finance on a schedule, matched against commitments so nothing is counted twice.
Budget minus actuals minus open commitments, per programme and per owner, with the four numbers always shown together rather than a single remainder.
These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix
Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.
Programmes, and the money already spoken for.
In this Helix project, build me a marketing budget tracker.
Structure the budget by programme rather than only by cost centre:
programme name, channel, type, owner, quarter, planned spend, currency and
objective. Cost centres are a finance structure, and marketers make
decisions at the programme level, so a tracker organised the other way
cannot answer the questions they ask.
Channels to seed: paid search, paid social, events, content, sponsorship,
agency and freelance, tools, brand.
Keep budget versions so a reforecast never overwrites the original plan.
The gap between them is its own report.
Then commitments, recorded at signature rather than at invoice: programme,
vendor, description, amount, currency, signed date, contract reference,
and the expected invoice schedule as one or more dated lines. That gap
between signing and invoicing is the entire disagreement between marketing
and finance.
Two things to build in now rather than retrofit: commitments that span
quarters, split across the periods their invoices land in, and
multi-currency, storing the original amount and a converted amount at a
rate I set per period.
I sign in through Helix, so do not build a login page. Read the signed-in
user from the runtime. And do not put any key or connection string in the
code: if this needs to reach another system, tell me and I will create the
connection in my workspace. Worth knowing. Cross-period commitments and multi-currency are what break these trackers in month three, and both are far cheaper to build in than to add later.
Reconciliation, and the two lists that fall out of it.
Import actuals from finance on a schedule: programme, vendor, amount,
currency, invoice reference and dates, cost centre, description. Record
the last successful import and show it on every page, and say so on screen
when one fails rather than serving stale numbers quietly.
Match each actual to an open commitment by vendor, amount and expected
date, within a tolerance I configure. A matched actual reduces the open
commitment rather than adding to the total.
Then surface two unmatched views, both directions. Actuals with no
commitment, which is spend that bypassed the process. And commitments long
past their expected invoice date, which are either late invoices or work
that stopped without anyone telling finance.
And show planned, committed, actual and remaining together everywhere.
Never a single remaining figure on its own. Rather than the one that reports it.
Build the owner view: their programmes, with planned, committed, actual,
remaining, and the percentage consumed. Then roll up by channel, by
quarter, and for the year.
Alert an owner when a programme crosses thresholds I set, and again when
committed plus actual exceeds the plan.
Then build the pre-commitment check, and make it easy to find. Enter a
proposed amount against a programme and see what would remain if it were
signed. This is the screen people will use most, and it is the only one
here that stops an overspend rather than describing one afterwards.
Highlight programmes with a lot of unspent budget late in a quarter, which
is a planning signal as much as a spending one.
And let me transfer budget between programmes, with an approver, a reason,
and a full history. Worth knowing. Every other view in a budget tracker reports the past. This one changes a decision that has not been made yet.
Results, and the comparison that is easy to get wrong.
Record results per programme: the metric, the target, the actual, when it
was measured and where it came from.
Derive cost per outcome, and restrict comparisons to within a channel.
Comparing an event to paid search on cost per lead reliably produces the
wrong decision, because the two produce different kinds of pipeline that
convert differently.
Add a quarter-close snapshot that freezes the figures, so a later
correction does not change a number already reported to a board.
Then report spend by channel against plan, committed versus invoiced over
time, cost per outcome trend per programme, and the budget transfer history
with reasons. Plus one summary line I can paste into a monthly update:
planned, committed, invoiced, remaining, and the largest variance with its
owner. The step that turns a working prototype into something with your data in it.
Now connect it to the systems we actually run, so it works on real data
rather than the rows you seeded.
Anything in angle brackets is a placeholder. Swap it for whatever we use
instead, and have the app name the connection it wants rather than assume
a vendor, so changing my mind later is a config change and not a rewrite.
<NetSuite>. Import posted actuals on a schedule and reconcile them against
open commitments.
<Coupa>. Read signed orders, so a commitment is recorded at signature
rather than at invoice.
<Google Analytics>. Pull results per programme, so cost per outcome is
derived rather than estimated.
<Slack>. Warn an owner when committed plus invoiced crosses the plan.
<Okta>. Read the manager relationship, so a programme owner's line rolls
up to whoever owns the budget above them.
<Marketo>. Read spend and performance per campaign, so cost per outcome is
derived rather than typed.
<Google Sheets>. Take the plan in the shape it was built, a tab per
programme and all, rather than asking anybody to retype it.
Only write where I have said to write. Everything else is read only.
Do not write a key, a token or a connection string anywhere in the code,
and do not ask me to paste one. Tell me which connections you need and I
will create each as an authentication in my Helix workspace. Reference
them by alias. Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.
The last step of every build: a URL, and the right people on it.
Deploy my app. Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. These numbers get quoted in budget conversations, so set Access Control before sharing: owners see their programmes, leadership sees the roll-up.
Marketing knows what it committed. Finance knows what was invoiced. This app is the join.
NetSuite
Import posted actuals on a schedule and reconcile them against open commitments.
Coupa
Read signed orders, so a commitment is recorded at signature rather than at invoice.
Google Analytics
Pull results per programme, so cost per outcome is derived rather than estimated.
Slack
Warn an owner when committed plus invoiced crosses the plan.
Okta
Read the manager relationship, so a programme owner's line rolls up to whoever owns the budget above them.
Marketo
Read spend and performance per campaign, so cost per outcome is derived rather than typed.
Google Sheets
Take the plan in the shape it was built, a tab per programme and all, rather than asking anybody to retype it.
Each line says whether the app reads, writes or both. Anything not described as writing should be read only.
Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.
Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.
The build gets you a working tracker. It reads from a finance system and its numbers will be quoted in budget conversations, so how it is run matters.
AI Deployment
One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.
App Security
Budget figures and variance by owner are sensitive. SSO means people sign in with their existing account, and access is scoped so an owner sees their programmes while leadership sees the roll-up.
App Security
Importing posted actuals from finance on a schedule needs real access. Granting it to the app rather than pasting a key into it means it can be rotated or revoked without a redeploy.
App Registry
Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.
Cost Management
Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.
Almost always because of commitments. Marketing knows it has signed a contract and finance sees no invoice yet, so both are looking at correct data that disagrees. Recording commitment at signature, with an expected invoice schedule, reconciles the two.
By programme and channel, with an owner, not only by cost centre. Cost centres are a finance structure, and marketers make decisions at the programme level, so a tracker organised by cost centre cannot answer the questions they ask.
The pre-commitment check: enter a proposed amount against a programme and see what would remain. It prevents overspend, where every other view reports it after the fact.
Split the expected invoice schedule into dated lines and attribute each to the period it lands in, while keeping the total commitment against the programme. Retrofitting this later is much more expensive than building it in.
Only within a channel. Comparing an event to paid search on cost per lead reliably produces the wrong decision, because the two produce different kinds of pipeline with different conversion behaviour.
Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement calls are your programme structure and your matching tolerance for reconciling invoices to commitments.
Finance
Show budget owners where they stand before the month closes: committed versus actual, variance by owner, and a forecast they can act on. Prompts to build it, and what it takes to run it.
Marketing
Capture enough in a brief to start work without a meeting, prioritise against capacity rather than volume, and show requesters where their work sits. Prompts to build it, and what it takes to run it.
Finance
Route purchase requests by amount and category, hold an approval trail finance can audit, and stop chasing sign-off in email. Prompts to build it, and what it takes to run it.
Last reviewed September 2026.
Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.
Your private status link is on its way to your inbox.