Cost per accepted result: how to count it, and what a ledger cannot say
The price of an AI run is not the price of its answer. Count every attempt, including retries and rejected work, and divide by the results someone accepted. Your billing ledger gives the top of that fraction. The bottom comes from your own acceptance records.
๐ฏ For A team lead who has to say what AI work really costs
- The formula for cost per accepted result and what goes into it
- What a provider ledger shows and what it cannot show
- How to start measuring with data you already have
๐งฎ The formula
Cost per accepted result is total spend on the task divided by the number of results that passed acceptance. Total spend includes every attempt: the first try, retries, a fallback to another model, work that was rejected, and the time of the person who reviewed it. If you leave out the rejected work, the number looks good and says nothing.
Two things sit on the bottom of the fraction that are easy to confuse. A model call that returned an answer is not an accepted result. A result that passed an automatic check is closer. A result that a person read and signed is the strongest. Say which one you count.
๐ What our ledger shows
Every paid model call in our metered transport writes one row, including retries and fallbacks. Since 2026-09-21 the ledger holds 10,150 rows with a total cost of $16.17. Of those rows, 9,860 have the outcome "ok", 220 were refused before the provider generated anything, and 70 ended in an error.
Dividing the total by the number of "ok" rows gives about $0.0016 per answered call. That figure is real arithmetic and it is not the cost per accepted result. "Ok" here means the provider answered. It says nothing about whether the answer was used.
๐งฉ What is missing, and where it lives
The bottom of the fraction comes from acceptance records: a check that passed, a judge's verdict, a reviewer's sign-off. In our setup those live beside the task, not in the billing ledger. Joining the two is the work. Until it is done, any figure from the ledger alone is a cost per call.
A second gap is people. A cheap run that needs twenty minutes of review can cost more than an expensive run that needs two. We do not have measured review time in the ledger, so we do not publish a total.
๐ ๏ธ Practice: start measuring in an afternoon
- Pick one repeating task, for example "summarise a ticket" or "draft a release note".
- For the last two weeks, count the attempts, including retries. Your provider dashboard or ledger has this.
- Define acceptance in one sentence, and make a script check what it can: format, length, required fields, links that resolve.
- Count how many results passed. Mark those a person also signed.
- Divide total spend by passed results. Write the date and the definition next to the number.
- Put review minutes on the top of the fraction using a flat hourly rate that you state. Show the result with and without review time.
- Re-measure after you change the model or the prompt, and compare like with like.
โ Check yourself
- You can state the definition of "accepted" in one sentence and show the script behind it.
- The number changes when you include retries. If it does not, you have probably not counted them.
- You can tell a reader how many results were rejected and what they cost.
- Two runs with different models are compared on the same tasks with the same acceptance check.
๐ง When this does NOT work
- Tiny samples. Ten tasks do not give a stable figure. Report the count next to the number.
- Acceptance that changes. If the check is loosened during the measurement, the result is meaningless. Freeze it first.
- Hidden costs. Subscription plans, shared pools and free tiers do not show a price per call. Mark such figures as unknown. Unknown is not zero.
- Quality you cannot check by script. Tone, judgement and taste need a person, and then the cost of the person dominates.
- Averages. A few expensive failures can hide behind a low average. Show the worst ten as well.
๐ Evidence
| What we measured | Rows, total cost and outcomes in our metered transport ledger |
| When | 3 November 2026, 22:06 UTC |
| Artifact | The transport ledger database in our private deployment: 10,150 rows since 2026-09-21, $16.17 in total, 9,860 ok, 220 refused, 70 errors |
| Limit | The ledger counts calls, not accepted results. It covers the metered lane only, not subscription work |
โก๏ธ Next
Set limits before you measure with Costs, budgets and limits, and compare unit costs in How much does an AI coding agent cost per task?.
Sources
- Costs, budgets and limits: setting a budget per task.
- How much does an AI coding agent cost per task?: tokens, limits and free starts.
- Agent task receipts: what they prove: evidence per run.
- AI judging: why โit says it is doneโ is not acceptance: how to decide that a result is accepted.
๐ Article connections
Open the full knowledge graph โPublished article links. Select a node to open its article at the heading.
Article links ยท keyboard / text view
Same topic
- A vector base is a map, not a source: what we learned from retrieval
- When you cannot tell what a model call cost: freeze, then reconcile
- Splitting a big task for a cheap model: the 24,000-byte lesson
- Skills, MCP tools and rules: three ways to give an agent capabilities
- Eight shell and git mistakes our agents made, and the rule for each
- Several agents, one repository: ownership rules from real incidents
Next steps
Related reading
A vector base is a map, not a source: what we learned from retrieval
A vector base finds passages that are close in meaning to your question. It does not know which are true or current. Treat every hit as a pointer: open the file it names, check the hash, and take numbers from the artifact, never from the retrieved paragraph.
AI agents and MCP explainedWhen you cannot tell what a model call cost: freeze, then reconcile
Sometimes a model call times out and you do not know whether the provider charged you. Never record that as zero. Mark it uncertain, stop new paid calls, and let a named person reconcile it with the provider's statement. Refusals before generation are the exception.
AI agents and MCP explainedSplitting a big task for a cheap model: the 24,000-byte lesson
A cheap model does well on one small, well-defined job and badly on a big pile. We cap a task at 24,000 bytes and refuse larger ones before any model is called. Split by unit, one file or one country per task, and check the size before you start.
AI agents and MCP explainedSkills, MCP tools and rules: three ways to give an agent capabilities
Agents get abilities in different ways. A rule constrains what they do, a skill tells them how to do a job, and an MCP tool lets them call a function. Each has its own risk, so declare all three in a register and test that nothing exists unlisted.
๐ฌ Comments