FinOps for AI & COGS Attribution
Deep dive: the domain round's core
Unit economics of an AI editor
After this you can build the cost stack from a single token up to gross margin and name the number leadership actually watches.
Inference is the dominant COGS line at Cursor. The whole job reduces to one sentence: own the unit economics of running an AI product at 1M+ DAU.
The domain round opens here because everything else hangs off it. Capacity plans, chargeback models and R&D-prioritization debates all assume you can build the cost stack from the bottom. A weak candidate quotes a monthly cloud bill. A strong one starts at the token and rolls up.
- Cost per token
- the atomic unit - GPU-seconds and memory per token generated, set by model size and serving efficiency
- Cost per inference
- tokens in + tokens out for one model call, times cost per token
- Cost per request
- one user-visible action can fan out to several inferences (retrieval, routing, the generation itself)
- Cost per active user
- requests per user per period times cost per request - the number that scales with growth
- COGS / gross margin
- cost per active user times the user base, set against revenue per user
Each row multiplies into the next. Know which one a question is really asking about.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Each layer rests on the one below and multiplies up to margin. Build it from the token, never from the bill.
The trap is collapsing these levels. "Cost per request" and "cost per inference" diverge the moment a request triggers retrieval plus a routing call plus generation. If you can't keep the fan-out straight, every downstream number inherits the error.
Production COGS is not R&D spendgoverned differently, reported differently
Serving a user is COGS, it scales with usage and lands on gross margin. Training a model or running an experiment is R&D, it's an investment bet governed on a different cadence with different owners. Conflating them is the fastest way to lose credibility with Finance.
- Dimension
- What it buys
- Production COGS
- Serving inference to live users
- R&D spend
- Training, fine-tuning, experiments, evals
- Dimension
- Scales with
- Production COGS
- DAU and usage intensity
- R&D spend
- Research roadmap and bet count
- Dimension
- Margin impact
- Production COGS
- Direct hit to gross margin
- R&D spend
- Operating expense / investment line
- Dimension
- Decision owner
- Production COGS
- Infra + Finance, monthly
- R&D spend
- Research leadership, per-bet
- Dimension
- The right question
- Production COGS
- Is this feature margin-accretive?
- R&D spend
- Is this bet worth the spend?
| Dimension | Production COGS | R&D spend |
|---|---|---|
| What it buys | Serving inference to live users | Training, fine-tuning, experiments, evals |
| Scales with | DAU and usage intensity | Research roadmap and bet count |
| Margin impact | Direct hit to gross margin | Operating expense / investment line |
| Decision owner | Infra + Finance, monthly | Research leadership, per-bet |
| The right question | Is this feature margin-accretive? | Is this bet worth the spend? |
Same GPUs can serve both. The accounting and the governance are not the same.
Where Cursor's cost actually livesmap the product to the bill
Fires constantly as the user types.
Needs tens-of-ms latency, so it runs a small fast model.
Low cost per call, enormous call volume - the long tail of COGS.
Fewer calls, far larger context and output.
High cost per request, multi-step agent runs multiply it.
Where a single power user can dominate spend.
Small model for simple queries, large for complex.
The routing decision is a direct COGS lever.
Misroute a simple query to a big model and margin leaks.
The revenue-vs-cost-per-user view is what turns this into a business answer. A flat-priced seat that costs $4/month to serve a casual user and $40 to serve a power user has wildly different margins under the same price. That spread is the single most useful chart you can bring to a margin conversation.
Gross margin is the top-line number, but the one that drives action is cost per active user against revenue per active user, segmented by usage tier. It tells you whether each cohort is accretive and it's the bridge between an engineering knob (routing, batching) and a board narrative (margin trajectory).
When asked "how would you think about Cursor's costs," don't list cloud services. Build the stack out loud from token to margin, then immediately separate production COGS from R&D, then point at tab-prediction volume vs. agent-call size as the two cost shapes. That sequence proves you've modeled an AI product, not just managed a budget.
Takeaway. Build cost from the token up - per token → per inference → per request → per active user → margin - and keep production COGS separate from R&D spend.
Self-check
QA request in Cursor's agent mode triggers a retrieval call, a routing call and a generation. Why does conflating "cost per request" with "cost per inference" break your model?
Why traditional FinOps breaks on AI
After this you can explain what makes AI cost attribution uniquely hard and what metric survives it.
Cloud FinOps was built for workloads that sit still. AI workloads don't. That mismatch is the heart of this round.
Classic FinOps assumes spend maps cleanly to durable cost centers, that month-over-month comparisons are meaningful and that the monthly bill is timely enough to steer by. Each of those assumptions cracks under an experimental, GPU-heavy AI product. Naming exactly how they crack is what separates a FinOps-for-AI answer from a generic one.
Research spins workloads up and down on the same pool.
Spend won't sit in a static cost center because the workload itself isn't static.
A static tag map goes stale within a sprint.
Many teams and features draw from one fleet.
Cost lands with no owner unless you instrument attribution at request time.
The bill says "GPUs," not "which feature."
One prompt or model change can swing token volume overnight.
Month-over-month comparisons stop being apples-to-apples.
Cost can move with zero change in user behavior.
A month-end cloud bill is a post-mortem, not a steering wheel.
By the time it lands, the misroute has run for 30 days.
You need near-real-time signal to act.
Cost-per-resource vs. cost-per-outcomethe metric that survives a changing product
Cost-per-resource - dollars per GPU-hour - is stable but says nothing about whether the spend is productive. Cost-per-outcome - dollars per accepted edit, per completed agent task, per retained user - survives a model swap because it's anchored to value, not to the resource that happened to produce it.
- Anchored to
- Cost per resource
- GPU-hours, tokens
- Cost per outcome
- Accepted edits, completed tasks
- Survives a model swap?
- Cost per resource
- No - denominator shifts
- Cost per outcome
- Yes - value is the denominator
- Answers
- Cost per resource
- How much did we spend?
- Cost per outcome
- Was the spend worth it?
- Good for
- Cost per resource
- Capacity & billing reconciliation
- Cost per outcome
- Margin & prioritization decisions
| Cost per resource | Cost per outcome | |
|---|---|---|
| Anchored to | GPU-hours, tokens | Accepted edits, completed tasks |
| Survives a model swap? | No - denominator shifts | Yes - value is the denominator |
| Answers | How much did we spend? | Was the spend worth it? |
| Good for | Capacity & billing reconciliation | Margin & prioritization decisions |
Track both. Report cost-per-resource for finance; reason in cost-per-outcome for decisions.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Report resource for finance; reason in outcome for decisions.
A concrete example sells this. If a routing change cuts cost per token by 20% but tanks acceptance rate, cost-per-resource looks like a win and cost-per-outcome reveals the loss. The outcome metric is the one that catches the false economy.
Don't propose "just tag everything and run the standard cloud FinOps playbook." The interviewer is testing whether you know why that playbook breaks here. Lead with the specific failure modes - shared pools with no owner, volume that swings on a prompt change - before you propose tagging as part of the fix.
Traditional FinOps assumes spend sits in stable cost centers you can compare month to month. On a shared GPU fleet where a single prompt change can double token volume overnight, that assumption fails. So I anchor on cost per outcome - dollars per accepted edit - and measure it near-real-time, not from a month-end bill.
Takeaway. Traditional FinOps assumes stable cost centers and timely bills; AI breaks both, so anchor on cost per outcome measured near-real-time.
Self-check
QA routing change lowers cost per token by 20% but quietly reduces edit-acceptance rate. Which metric catches the problem and why?
Showback vs. chargeback design
After this you can choose between visibility and accountability models and defend a phased rollout.
Showback shows a team what it spends. Chargeback makes that spend its budget. Knowing which to ship first is the whole design question.
- Showback
- Visibility only - teams see their attributed cost, no budget consequence
- Chargeback
- Accountability - attributed cost hits the team's budget, they own the number
- Shared foundation
- Both need tag-based allocation by team, feature and environment
Same plumbing. Chargeback adds a financial consequence on top.
The instinct to jump straight to chargeback is the rookie move. Chargeback on bad data starts a fight over the data instead of the spend and you lose the room. Showback first builds trust in the numbers and surfaces the attribution bugs before money is on the line.
The phased rolloutearn the right to charge back
- 1Instrument tagging. Attribute every inference at request time to team, feature and environment. No tag, no attribution - make untagged spend visible as its own line so it can't hide.
- 2Ship showback. Give teams a dashboard of their own cost. Let them challenge it. Fix the attribution bugs they find - this is where data quality actually gets built.
- 3Reconcile and trust. Tie attributed totals back to the real bill. When the sum of showback matches the invoice within a tight tolerance, the numbers are defensible.
- 4Graduate to chargeback where ownership is clear. Apply budget accountability only to features with a single clear owner. Leave genuinely shared costs in showback or a fair-split pool.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Earn the right to charge back - reconciliation is the gate you can't skip.
Allocating shared and contested costwhere the fights happen
- Cost type
- Single-feature inference
- Fair allocation rule
- Direct, by request tag
- Why it holds up
- Clear cause, clear owner
- Cost type
- Shared base model serving
- Fair allocation rule
- By usage share (token or request volume)
- Why it holds up
- Proportional to draw on the pool
- Cost type
- Idle / reserved baseline
- Fair allocation rule
- Spread by committed capacity, not actual use
- Why it holds up
- You bought the floor for everyone
- Cost type
- Platform overhead
- Fair allocation rule
- Flat or by headcount, stated openly
- Why it holds up
- Cheap to compute, hard to game
| Cost type | Fair allocation rule | Why it holds up |
|---|---|---|
| Single-feature inference | Direct, by request tag | Clear cause, clear owner |
| Shared base model serving | By usage share (token or request volume) | Proportional to draw on the pool |
| Idle / reserved baseline | Spread by committed capacity, not actual use | You bought the floor for everyone |
| Platform overhead | Flat or by headcount, stated openly | Cheap to compute, hard to game |
Every rule must be explainable in one sentence to the team being charged.
Anticipate gaming. If you allocate shared cost by request count, a team will batch requests to look cheaper. If by tokens, they'll trim outputs in ways that hurt users. The defense isn't a perfect rule, it's a rule that's transparent and a forum where disputes get resolved out loud.
Your job is the model and the operating forum, not policing every dollar. You design the allocation rules, stand up the review where ML, Infra and Finance look at the numbers together and keep the rules fair and explainable. You are not the spend cop chasing individual line items - that doesn't scale and it burns the trust you need to influence without authority.
If asked "showback or chargeback," never pick one outright. Say: showback first to earn trust in the data, chargeback later only where ownership is clean and shared costs stay in a fair-split pool with an explainable rule. Then name a specific shared-cost case - base model serving - and how you'd allocate it. The phased answer shows judgment; the worked example shows you've done it.
Takeaway. Ship showback first to build trusted data, graduate to chargeback only where ownership is clear and allocate shared cost with rules you can explain in one sentence.
Self-check
QWhy is launching chargeback before showback a mistake, even when leadership wants budget accountability immediately?
Building the cost model live
After this you can structure a defensible cost model under interview conditions and land one recommendation.
The take-home or whiteboard cost model is where this loop is won or lost. Cursor wants the artifact, not the ceremony - build the model, write the recommendation.
Under time pressure the failure mode is a sprawling spreadsheet with hidden assumptions and no conclusion. The winning move is a model that's legible: it starts at the unit, labels every input and ends with one recommendation and the tradeoff named. Structure beats polish here.
- 1Start from the unit. Anchor on cost per inference or cost per active user. Everything else is a multiplier on or a rollup from that unit.
- 2Label every input known vs. estimated. GPU hourly rate is known; requests per user per day is estimated. The interviewer trusts a labeled estimate far more than a confident guess.
- 3Run sensitivity on the 2-3 dominant variables. Utilization, model mix and request volume swamp everything else. Show how the answer moves across a plausible range of each.
- 4Show the bridge. Walk how a routing or batching change flows through the model to COGS, so the recommendation is traceable, not asserted.
- 5Cross-check with back-of-envelope. Before trusting the sheet, sanity-check one cell against a napkin number. If they disagree by 10x, the sheet has a bug.
- 6Land one recommendation, tradeoff named. Not a menu - a call, with the cost of being wrong stated.
A worked skeletonthe shape of a defensible model
# --- INPUTS (known | estimated) --- gpu_hourly_cost = 2.50 # known: reserved instance rate gpu_throughput_tok_s = 3000 # known: from serving benchmarks util_target = 0.55 # estimated: sustained, post-batching active_users = 1_000_000 # known reqs_per_user_day = 40 # estimated: blended tab + chat tokens_per_req = 350 # estimated: blended in+out days = 30 # --- DERIVE cost per token --- eff_tok_per_hour = gpu_throughput_tok_s * 3600 * util_target cost_per_token = gpu_hourly_cost / eff_tok_per_hour # ~ $4.2e-7 # --- ROLL UP to monthly COGS --- tokens_month = active_users * reqs_per_user_day * tokens_per_req * days monthly_cogs = tokens_month * cost_per_token # the headline # --- SENSITIVITY: the 2-3 that dominate --- # util_target 0.45 -> 0.65 : COGS swings ~30% # model_mix (share routed to large model) : each +10pt ~ +X% COGS # reqs_per_user_day +/- 20% : linear pass-through to COGS
Notice utilization sits inside cost per token, so it's the most impactful input in the whole model. A model running at 55% vs. 35% utilization changes the headline by more than most feature decisions ever will. That's the variable to sensitize first and to interrogate hardest.
Take the headline COGS and divide by active users - does cost per active user land in a sane range for a flat-priced seat? If the model says $200/user/month against a $20 price, you have a bug or a business that doesn't exist. The back-of-envelope cross-check is a 30-second habit that catches the embarrassing 10x errors.
Narrate the structure as you build: "I'll anchor on cost per token, label inputs as known or estimated, sensitize on utilization and model mix, then land one recommendation." Saying the skeleton first signals you've shipped models before. Then end with a decision - "reserve 60% of baseline, burst the rest" - and state what would change your mind. Interviewers remember the candidate who concluded.
Takeaway. Anchor on the unit, label every input, sensitize the 2-3 that dominate (utilization first), cross-check on a napkin and land one recommendation with the tradeoff named.
Self-check
QIn the bottom-up model, why is utilization the most impactful input to sensitize first?
Partnering with Finance
After this you can translate between engineering reality and financial framing so your numbers earn a seat in the room.
Half this role is interpreter. Engineers talk utilization and batching; Finance talks COGS and capex. You're the one who makes each side legible to the other.
The JD calls this translating between technical and financial domains and it's not a soft skill - it's the mechanism by which your analysis becomes a decision. A perfect cost model that Finance can't reconcile to their reporting is a model that never leaves your laptop.
- Engineering concept
- GPU utilization
- Financial framing
- Asset efficiency / cost per unit served
- What the translation unlocks
- Justifies reserve commitments and headroom
- Engineering concept
- Batching & throughput
- Financial framing
- Lower COGS per inference
- What the translation unlocks
- Connects an infra tuning win to margin
- Engineering concept
- Model routing
- Financial framing
- Cost mix shift across the request base
- What the translation unlocks
- Frames a quality-vs-cost tradeoff in dollars
- Engineering concept
- Reserved vs. on-demand GPUs
- Financial framing
- Capex/commitment vs. opex flexibility
- What the translation unlocks
- Makes the capacity bet a finance decision
- Engineering concept
- Build vs. buy a model
- Financial framing
- R&D investment vs. recurring COGS
- What the translation unlocks
- Surfaces the breakeven Finance will ask for
| Engineering concept | Financial framing | What the translation unlocks |
|---|---|---|
| GPU utilization | Asset efficiency / cost per unit served | Justifies reserve commitments and headroom |
| Batching & throughput | Lower COGS per inference | Connects an infra tuning win to margin |
| Model routing | Cost mix shift across the request base | Frames a quality-vs-cost tradeoff in dollars |
| Reserved vs. on-demand GPUs | Capex/commitment vs. opex flexibility | Makes the capacity bet a finance decision |
| Build vs. buy a model | R&D investment vs. recurring COGS | Surfaces the breakeven Finance will ask for |
Lead with the financial framing when you're in a Finance room; lead with the engineering one in an Infra room.
Agree the dictionary up frontkill the re-litigation
Most cost disputes are definition disputes wearing a costume. Does "cost per user" mean per active user or per paid seat? Does COGS include the idle reserved baseline or only used capacity? Nail these once in a shared metric dictionary and you stop re-arguing them every month.
- Active user
- Pick one: DAU, MAU or paid seat - and use it everywhere
- COGS boundary
- Does it include reserved-but-idle capacity? State it once.
- Cost period
- Match Finance's close cadence, not your dashboard's refresh
- Attribution grain
- Team, feature or environment - at the granularity Finance reports
A shared dictionary is the cheapest insurance against endless re-litigation.
Make the tradeoffs legiblethe recurring decisions Finance must own with you
- Latency vs. cost: a faster small model is cheaper but may lower acceptance; price the quality delta, don't just quote the savings.
- Reserve vs. on-demand: reserved cuts unit cost but bets on sustained demand; show the breakeven utilization where the commitment pays off.
- Build vs. buy: an in-house model trades upfront R&D for lower recurring COGS; give Finance the payback period, not a vibe.
You earn a seat in the resource-tradeoff room by being right repeatedly. The first time your attributed total reconciles to the actual bill, Finance starts trusting the next number before they check it. That trust is what lets you influence without authority - your credibility is the only lever you have when there's no thick management layer to escalate through.
Don't present an engineering tradeoff as if the answer is obvious from the engineering side. "We should obviously batch more" ignores the latency cost a product owner cares about. Frame it as a decision with owners - Infra, Finance, Product - and bring the dollar figure that lets them actually decide.
Takeaway. Translate engineering knobs into financial framing, pin the metric definitions once and let reconciled numbers earn the trust that buys you influence without authority.
Self-check
QFinance and Infra keep re-arguing the cost-per-user number every month. What's the structural fix and why does it work?