For FinOps and finance
Know the gross margin of every customer, every hour.
Your provider invoice is one number. PALM SOUQ splits it by customer, plan tier and feature, prices cache reads and writes correctly, and puts revenue on the same row.
| Tenant | Tier | Revenue | Tokens in / cached / out (M) | LLM COGS | Gross margin |
|---|---|---|---|---|---|
| acct_1042 harbor-legal | Team | $99 | 61 / 22 / 6.4 | $140.20 | -41.6% |
| acct_1011 marlin-ops | Team | $99 | 27 / 4 / 2.9 | $71.20 | 28.1% |
| acct_0877 vela-clinic | Starter | $49 | 9.5 / 0.5 / 1.1 | $27.05 | 44.8% |
| acct_1187 quill-insure | Pro | $249 | 48 / 30 / 4.1 | $83.80 | 66.3% |
| acct_1220 tern-logistics | Team | $99 | 12 / 5 / 1.2 | $26.10 | 73.6% |
| acct_1305 orbit-realty | Pro | $249 | 22 / 14 / 2.2 | $40.60 | 83.7% |
| acct_0931 sable-hr | Starter | $49 | 3.2 / 1.1 / 0.4 | $7.95 | 83.8% |
all tiers: ($893 - $396.90) / $893 = 55.6% gross margin on LLM COGS
Why the invoice does not add up
Prompt caching makes naive token maths wrong in both directions.
On Claude Sonnet 4.5, an input token costs $3.00/M, a cached read costs $0.30/M and a cache write costs $3.75/M. A tenant with a stable prompt prefix can cost a fraction of what its raw token count suggests. A tenant whose prefix changes every call pays the write premium on top.
If your internal cost model multiplies tokens by one price, you overstate cost for well-cached tenants, understate it for the rest, and set overage prices on the wrong numbers.
- Input tokens this month
- 100M
- Naive cost
- 100M x $3.00 = $300
- Cache reads (70%)
- 70M x $0.30 = $21.00
- Cache writes
- 6M x $3.75 = $22.50
- Uncached input
- 24M x $3.00 = $72.00
- Actual input cost
- $115.50, 62% below naive
Reports finance actually uses
From one invoice to a margin model you can close the month on.
Margin by tier
See which plan is underwater before the board deck does.
The Team tier at 42% is the one to fix: either a lower included allowance, a fallback model, or overages on the heaviest tenants.
Anomaly alerts
Slack or webhook when a tenant's hourly cost runs above its 14-day pattern.
Feature COGS
Tag calls with X-PalmSouq-Feature and price each product surface separately.
Billing sync
Overages flow to Stripe, Metronome, Orb or Lago with the markup rule for each tier. How sync works
Exports
Hourly to S3, GCS or BigQuery, CSV from any report, and OpenTelemetry metrics for engineering.
Worked margin example
$9,125 a month, recovered from 25 tenants.
A B2B support agent SaaS has 500 customers at $99 a month. 25 power users each consume $400 of GPT-4o tokens.
MRR
$49,500
500 x $99
Margin per power user
-$301
$99 - $400
Per-tenant token cap
$35
PALM SOUQ hard cap with overage
Recovered per month
$9,125
25 x ($400 - $35)
“We finally know our exact gross margin per customer. We moved 12 power users to usage overages and took SaaS gross margin from 48% to 76%.”
Questions, answered
How accurate is the per-tenant cost?
PALM SOUQ prices each call from the usage the provider returns, including cached input, cache writes and reasoning tokens, against a maintained list-price table. If you have negotiated rates, enter them and every report uses them.
Can I export to our warehouse?
Yes. Hourly exports to S3, GCS or BigQuery, a CSV export from any report, and OpenTelemetry metrics for engineering dashboards.
How do you calculate gross margin per tenant?
Revenue per tenant comes from the plan price you set per tier or from your billing platform. COGS is the priced LLM usage, plus any fixed per-tenant cost you add. Margin is (revenue - COGS) / revenue.
Does this replace our billing platform?
No. PALM SOUQ meters and prices usage and sends it to Stripe, Metronome, Orb or Lago, which keep invoicing, tax and collections.
Close next month with margin per customer.
Connect PALM SOUQ, set plan prices per tier, and the first margin report is ready within an hour of traffic.
14-day free production trial · 100k requests included · no card required