How to

How to build a marketing budget tracker

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.

The short answer

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.helix-app.ai

Marketing budget

2.4M

Planned this year

1.6M

Invoiced

410K

Committed, not invoiced

390K

Actually remaining

540K
420K
360K
240K
180K
EventsPaid searchAgencyContentBrand

Agency is highlighted because it is the only programme with nothing left: 360K planned, 90K committed, 270K invoiced, zero remaining.

A sketch of the year by programme, which is the unit marketers decide in. Cost centre is a finance structure and cannot answer the question a channel owner is actually asking.

What matters here

  • A marketing budget tracker is four parts: budget by programme, committed spend, reconciled actuals, and a remaining view per owner.
  • Record commitment at signature, not at invoice. That gap is the entire disagreement between marketing and finance.
  • Break the budget down by programme and channel, not just by cost centre. Cost centres do not map to the decisions marketers make.
  • Reconcile against finance rather than tracking in parallel. Two independent records diverge and then nobody trusts either.
  • Track spend against results per programme, or the tracker only answers what you spent and never whether to spend it again.
  • Multi-currency and cross-period commitments are where these trackers break. Handle both from the start.

Who this is for

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.

How it works in practice

What a channel owner does before they sign something, and what finance does at quarter end.

  1. 1

    Budget is structured by programme, not just cost centre

    Because programme is the unit marketers make decisions in, and cost centre is a finance structure.

  2. 2

    Spend is recorded at signature, not at invoice

    With the expected invoice schedule, which is where the disagreement with finance actually lives.

  3. 3

    Actuals arrive from finance on a schedule

    And match against open commitments, so nothing is counted twice.

  4. 4

    Two unmatched lists appear, and both are findings

    Spend with no commitment means the process was bypassed. A stale commitment usually means work quietly stopped.

  5. 5

    The pre-commitment check runs before you sign

    Enter a proposed amount against a programme and see what would remain. This is the screen that prevents overspend rather than reporting it.

  6. 6

    Quarter close freezes the figures

    So a correction next month cannot rewrite a number already in a board pack.

What a budget tracker is made of

A marketing budget tracker is not a spend report. It is four parts, and the second is the one that ends the argument.

Budget by programme

Planned spend by programme, channel, quarter and owner, with the original plan kept alongside any reforecast. Programme is the unit marketers actually decide in.

Committed spend

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.

Reconciled actuals

Invoiced and posted spend pulled from finance on a schedule, matched against commitments so nothing is counted twice.

Remaining by owner

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

The prompts

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.

  1. Structure it the way marketers decide

    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.

  2. Agree with finance instead of arguing with them

    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.
  3. The screen that prevents overspend

    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.

  4. Whether to spend it again

    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.
  5. Connect it to real systems

    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.

  6. Ship it

    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.

What it connects to

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.

Running it for real

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

Get it to a URL people can open

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

Put your identity provider in front of it

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

Connect the system of record with managed credentials

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

Put a name on it

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

Know what it costs to run

Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.

Questions people ask

Why do marketing and finance budget numbers disagree?

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.

How should a marketing budget be broken down?

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.

What is the most useful screen in a budget tracker?

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.

How do I handle a contract that spans quarters?

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.

Should I compare cost per lead across channels?

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.

Can I build this without an engineering team?

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.

Last reviewed September 2026.

Build it, then run it properly

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.