← Blog

Cost · · 7 min read · Updated

One API key cannot explain a marketing budget

A shared AI key can produce a correct invoice and an unusable marketing budget. Tie each request to a process, task, asset, owner, and approval outcome before reconciling spend.

Jonathan Haas

Finance sees $8,400 under marketing-prod.

Marketing sees four campaigns, two agencies, three AI tools, and a spreadsheet nobody trusts.

The invoice may be accurate. The budget is still unexplainable because the thing that paid for the request is not the thing that owns the work.

An API key can tell you who paid. It cannot tell you which campaign should stop. If the same key serves every team, the next budget decision is already missing its owner.

This is the attribution problem: provider billing is grouped by account, key, model, or workspace. Marketing decisions are grouped by brief, asset, campaign, audience, and approver. Until those shapes are joined at the request boundary, every cost report is partly reconstruction.

A billing principal is not a work owner#

The provider knows a few useful things:

  • which account made the request;
  • which model handled it;
  • how much input and output it used;
  • when the request happened;
  • whether the request succeeded.

The provider usually does not know:

  • which campaign budget paid for it;
  • whether the output became an accepted asset;
  • who reviewed the claim;
  • whether a retry came from a source failure or a broken tool;
  • what old cost the team expected to replace.

The missing fields are not a reporting inconvenience. They determine whether a marketing leader can stop low-value work, explain a variance, or prove a savings claim.

The attribution ladder#

Every request needs a path back to the business decision:

Level Example Question it answers
Request Model call 8,421 What happened at the provider boundary?
Task Claim check for email variant 7 What piece of work caused it?
Asset Spring launch email What output was being produced?
Process Campaign quality assurance Which repeatable process owns it?
Campaign Spring launch Which budget should carry it?
Owner Growth operations Who can explain or stop it?
Outcome Accepted, returned, rejected, abandoned What did the spend produce?

The lower levels help you reconcile. The upper levels help you decide. A report that stops at “model: Claude, key: marketing-prod” has usage detail and no management path.

If you cannot get from a charge to a named owner in one query, you do not have spend attribution. You have a bill with clues.

What pooled spend does to the month#

Consider an illustrative monthly export:

Export line Amount What the export knows
Campaign A $2,900 Tagged to a campaign and owner
Campaign B $1,700 Tagged to a campaign, missing asset IDs
Campaign C $1,150 Tagged to a shared process
Tool and retry pool $1,350 Provider and tool totals, mixed owners
Unattributed requests $1,300 Key and model only
Total $8,400 Correct total, incomplete explanation

The tempting fix is to spread the $1,300 evenly across the three campaigns. That makes the spreadsheet balance. It also hides which process created the missing evidence.

Allocation is sometimes necessary for shared research or a common subscription. It should be labeled as allocation, use a stated rule, and stay separate from direct attribution. An unknown request is not shared work until someone proves that it was shared work.

Tag work before the request leaves the system#

The reliable place to add context is the boundary that sends the model or tool request. Add the fields before the request leaves the process:

Required field Example
Process ID campaign-qa
Task ID spring-launch-email-07
Asset ID spring-launch-email
Campaign ID spring-launch-2026
Owner growth-ops
Approver product-marketing
Attempt number 2
Source set launch-brief-v4
Budget envelope campaign-qa-q3
Evidence state reconciled, partial, or missing

Provider, model, usage, tool, status, and timestamps belong beside those business fields. Do not make finance join a provider export to a ticket export by hand every month. That is a process that fails exactly when volume increases.

What to do with an untagged request#

Do not quietly assign it to the largest campaign. Put it into a small exception queue:

  1. Quarantine the amount. Keep it visible as unattributed spend.
  2. Name an owner. Someone must decide whether the request belongs to a campaign, a shared process, or an unauthorized path.
  3. Reconcile the evidence. Join the request to a task, asset, or source record if the trail exists.
  4. Fix the boundary. Add the missing fields where the next request is created.
  5. Report the gap. Track the amount and count of unresolved events beside the attributed total.

Unknown is a queue with an owner. Zero is a lie. A budget that turns missing cost proof into zero will look healthier as its measurement gets worse.

Attribution is also a control#

Spend attribution is not only for the month-end report. It gives the process a chance to stop bad work early.

Set a task-level condition when:

  • a request has no campaign or owner;
  • the same task retries more than twice;
  • a task is using a model outside the process envelope;
  • an asset has consumed review time without a source set;
  • the forecast crosses the campaign limit;
  • a request is being made after the asset was already accepted.

Each condition needs an action: pause, ask for approval, repair the source, or classify the spend. A red row that cannot change behavior is decoration.

Reconcile the invoice without rebuilding the month#

At the end of the period, compare three totals:

provider total
= attributed spend
+ approved shared allocation
+ unresolved spend

The equation should balance. The unresolved line should shrink over time. Never force it to zero to make a dashboard look complete.

Then compare accepted output, not request count:

attributed cost per accepted asset
= attributed AI and tool spend ÷ accepted assets

Use the full production cost from the cost-per-asset guide when review, rework, and shared campaign work matter. Direct provider spend is a useful layer. It is not the finished-asset number.

What a weekly attribution report should show#

The report can fit on one screen:

Field Why it belongs
Spend by campaign and process Shows where money moved.
Accepted, returned, and abandoned assets Shows what the money produced.
Cost with missing work IDs Shows the size of the evidence gap.
Highest retry count Shows unstable paths before they become normal.
Largest cost variance Gives the owner a decision queue.
Shared allocations Keeps estimates separate from direct evidence.
Forecast versus envelope Shows what may need to pause next.

The report should end with three names: the owner of the largest variance, the owner of the oldest attribution gap, and the person who can change the request boundary. Without names, the report becomes another export.

Where Deixic fits#

Deixic gives finance and marketing ops the operational join between spend and work: agent and tool activity, owners, approvals, source evidence, and a visible gap when cost proof is missing. It does not pretend a provider key is a campaign owner.

Use the product view to find the activity and evidence. Keep agency, contractor, and distribution costs in the finance ledger. Join them on the process or task ID. The resulting budget can say which work consumed the money and who can change the process.

Writer’s Marketing AI ROI Calculator is useful for a planning projection. Actual attribution begins after a request is made, when the team needs to explain the charge rather than estimate a future one.

A practical starting point#

Pick one process with a shared key and a steady stream of work. For two weeks, require a process ID, task ID, owner, asset outcome, and evidence state on every request. Put every missing join in the exception queue.

At the end, report the attributed total, unresolved total, accepted assets, and cost per accepted asset. Then fix the boundary that produced the most unknowns.

That is the point of attribution: the bill should lead to a decision, not another month of detective work.