Usage pricing simulator
@agentcosts/usage-pricing-simulator
Test pricing models for an AI product on your real usage before you change a price: per seat, per task, credits, and hybrid (platform fee plus included credits plus overage). Shows revenue, gross margin after LLM cost, and which customers' bills would jump or drop under each model.
- Activity
- New: be the first to try it
- Installs
- 0 installs
- Likes
- 0 likes
- Clones
- 0 clones
What it makes
Real output from this kit
- Sample file1 KB, download to openPricing simFrom the kit's tests
- Sample file4 KB, download to openPricing simFrom the kit's tests
- Sample file2 KB, download to openPricing simFrom the kit's tests
How this works
- It is a skill: written instructions Claude reads when your request matches what the skill is for. You do not call it by name; just ask for the task.
- While it works, it reads and changes files in the places it lists, nowhere else.
- It runs these commands on your computer: node scripts/simulate.mjs.
- Nothing runs until you choose to use it, and you can remove it any time.
SKILL.md
Usage pricing simulator
Pricing an AI product on gut feel is risky: per-seat pricing can lose money on heavy users, and pure usage pricing can scare off light ones. This kit replays last month's real usage under each pricing model you want to try, so you see revenue, margin, and the customers who would feel the change before anyone gets an email.
Inputs
- Usage in the shared schema (from app logs or
llm-usage-normalizer), ideally withrun_idandoutcomeso tasks and successes can be counted. One to three recent months. - Customers
data/customers.csv:customer,seats,mrr(what they pay per month today), optionalplan. Pricing models
data/pricing.json. Copyexamples/pricing.jsonand edit with the user:{ "target_margin": 0.7, "bill_on": "success", "credit_rates": { "research_agent": 100, "doc_summary": 8, "*": 5 }, "models": [ { "name": "Per seat $20", "type": "per_seat", "price_per_seat": 20 }, { "name": "Per task", "type": "per_task", "minimum": 29, "prices": { "research_agent": 4, "*": 0.2 } }, { "name": "Credits", "type": "credits", "credit_price": 0.04, "minimum": 29 }, { "name": "Hybrid", "type": "hybrid", "platform_fee": 79, "included_credits": 1000, "overage_credit_price": 0.04 } ] }bill_on:success(customers pay for results; you eat failed runs) orall.credit_rates: credits per task type, used bycreditsandhybrid.*covers any other task.- Each model can have a
minimum(monthly floor). Hybrid can also takeprice_per_seat.
Steps
- Look at usage per customer first: runs per task per month and LLM cost. Point out the heavy users and the near-zero users; they decide which models work.
- Set credit rates from cost, not guesses: a task's credits should be roughly proportional to its cost per successful run (the
agent-cost-dashboardshows it). Then pick a credit price that gives the target margin on the average customer. Run:
node scripts/simulate.mjs data/usage.csv --customers data/customers.csv --pricing data/pricing.json --prices data/llm-prices.csv --out out/pricing-sim- Read
out/pricing-sim.md. For each model report: revenue vs today, gross margin, customers under target or negative, and whose bill rises or falls more than 25%. - Iterate with the user: adjust one number at a time in
data/pricing.json(a minimum, the included credits, an overage rate) and rerun. Two or three rounds usually find a model that fixes margins without shocking many customers. - Write a short recommendation: the model, the numbers, who is affected, and a migration idea (grandfather current customers for a term, or apply at renewal).
How to read it
- Margins are after LLM cost only. Add hosting and other costs with
gross-margin-by-customerbefore final decisions. - A model that raises revenue but sends many small customers' bills up 3x is a churn risk; a model that cuts most bills is leaving money behind.
- Usage changes when pricing changes. Treat results as a first-order estimate, not a forecast.
Output template
**Recommendation: Hybrid ($79 platform fee, 1,000 credits included, $0.04 per extra credit).**
Revenue +3% vs today, margin 81%, no negative customers (cobalt-labs goes from -10% to 60%).
Bills up a lot: cobalt-labs ($60 to $166), foxglove-retail ($49 to $79). Bills down: bluepeak, elmstreet-health.
Migration: apply at renewal; offer foxglove-retail a starter tier.Guardrails
- Never change prices, plans, or invoices, and never contact customers. This is a planning tool.
- Cost numbers depend on the price table; say "based on the example prices" if the user has not checked them against each provider's current pricing.
- Customer revenue is sensitive. Keep per-customer tables in
out/.
README.md
Usage pricing simulator
Replays your real usage under different pricing models (per seat, per task, credits, and hybrid) and shows what each would do to revenue, gross margin, and every customer's bill. Find the model that fixes margins before anyone gets a price-change email.
Who it is for: founders and product or finance leads pricing an AI or agent product.
Example
Input: examples/usage.csv (October usage for 6 customers), examples/customers.csv (seats and current monthly price), examples/pricing.json (four models).
Output (out/pricing-sim.md):
| Model | Monthly revenue | vs today | Gross margin | Negative | Bills up a lot |
|---|---|---|---|---|---|
| Current | $746 | +0% | 80.3% | 1 | none |
| Per seat $20 | $760 | +2% | 80.7% | 1 | none |
| Per task | $489 | -34% | 69.9% | 0 | cobalt-labs |
| Hybrid | $768 | +3% | 80.9% | 0 | cobalt-labs, foxglove-retail |
Plus every customer's bill and margin under each model.
What it can access
- Runs
node scripts/simulate.mjs(Node built-ins only). - Reads
data/. Writesdata/pricing.json(your models) andout/pricing-sim*. - No network. It never changes prices or contacts customers.
Setup
None. Check the example LLM prices against each provider's current pricing before trusting the margins.
Files
- README.md
- SKILL.md
- examples/customers.csv
- examples/prices.csv
- examples/pricing.json
- examples/usage.csv
- kit.json
- scripts/lib.mjs
- scripts/simulate.mjs
- scripts/usage.mjs
Did it work?
0worked for them0did not work
Sign in to say whether it worked for you.
Nobody has said yet. Tried it? Tell the next person.
