Methodology
How a stack becomes a monthly bill
Drivers
A stack starts from drivers: product numbers you already know. These are the Seed-stage SaaS preset's values; the curves sweep monthly active users from 1k to 1M and hold the rest per user.
| Driver | Unit | Preset value |
|---|---|---|
| Monthly active users | users | 5,000 |
| Requests per user | per month | 400 |
| Database data per user | MB | 2 |
| Stored files per user | MB | 10 |
| Emails per user | per month | 4 |
| Revenue per user | per month | 3 |
| Background jobs per user | per month | 10 |
Derived values
Shared intermediate values, evaluated in order. The formula shown is the formula that runs: the engine and this page read the same tree.
| Value | Formula | At the preset |
|---|---|---|
| Requests per month | Monthly active users × Requests per user | 2,000,000 |
| Peak requests per second | (Requests per month ÷ 2,592,000) × Peak traffic ÷ average | 2.3148 |
| App vCPU | max(0.25, (Peak requests per second ÷ Requests per second per app vCPU)) | 0.25 |
| Database size (GB) | Monthly active users × Database data per user ÷ 1,024 | 9.7656 |
| Database vCPU | max(1, (Peak requests per second ÷ Requests per second per database vCPU)) | 1 |
| Database memory (GB) | max(1, Database size (GB) × Share of data Postgres keeps in memory) | 2.4414 |
| Cache memory (GB) | max(0.25, (Monthly active users × Cache memory per active user ÷ 1,048,576)) | 0.25 |
| Cache commands | Requests per month × Cache commands per request | 4,000,000 |
| File downloads | Monthly active users × File downloads per user | 100,000 |
| Payment volume | Monthly active users × Revenue per user | 15,000 |
| Job runs | Monthly active users × Background jobs per user | 50,000 |
| Logs per month (GB) | Requests per month × Log data per request ÷ 1,048,576 | 1.9073 |
Workloads
A workload is a service kind plus requirements. Each requirement is a formula of the drivers and can be overridden per stack in the Assumptions panel.
| Service | Requirement | Formula | At the preset |
|---|---|---|---|
| Managed Postgres | Storage | Database size (GB) | 9.7656 |
| Managed Postgres | Backup storage | Database size (GB) | 9.7656 |
| Managed Postgres | Egress | Requests per month × Database data sent per request ÷ 1,048,576 | 9.5367 |
| Managed Postgres | vCPU | Database vCPU | 1 |
| Managed Postgres | Memory (GB) | Database memory (GB) | 2.4414 |
| Managed Postgres | vCPU hours | Database vCPU × Hours per month | 730 |
| Managed Postgres | Memory hours | Database memory (GB) × Hours per month | 1,782 |
| Managed Redis | Requests | Cache commands | 4,000,000 |
| Managed Redis | Egress | Cache commands × Average cache value size ÷ 1,048,576 | 3.8147 |
| Managed Redis | Memory (GB) | Cache memory (GB) | 0.25 |
| Managed Redis | Memory hours | Cache memory (GB) × Hours per month | 183 |
| Object storage | Storage | Monthly active users × Stored files per user ÷ 1,024 | 48.8281 |
| Object storage | Read requests | File downloads | 100,000 |
| Object storage | Write requests | Monthly active users × File uploads per user | 10,000 |
| Object storage | Egress | File downloads × Average file download ÷ 1,048,576 | 19.0735 |
| App compute | Requests | Requests per month | 2,000,000 |
| App compute | Egress | Requests per month × Average response size ÷ 1,048,576 | 95.3674 |
| App compute | vCPU | App vCPU | 0.25 |
| App compute | Memory (GB) | App vCPU × App memory per vCPU | 0.5 |
| App compute | vCPU hours | App vCPU × Hours per month | 183 |
| App compute | Memory hours | App vCPU × App memory per vCPU × Hours per month | 365 |
| Transactional email | Emails sent | Monthly active users × Emails per user | 20,000 |
| Auth | Monthly active users | Monthly active users | 5,000 |
| Error tracking | Error events | Requests per month × Errors per request | 2,000 |
| Logging | Logs ingested | Logs per month (GB) | 1.9073 |
| Logging | Storage | Logs per month (GB) × Log retention ÷ 30 | 0.445 |
| Logging | Retention (days) | Log retention | 7 |
| Payments | Payment volume | Payment volume | 15,000 |
| Payments | Transactions | Payment volume ÷ Average payment | 600 |
| Jobs and queues | Job runs | Job runs | 50,000 |
| Jobs and queues | Queue messages | Job runs | 50,000 |
Assumptions
The constants inside the formulas. Each is a default you can change.
| Assumption | Unit | Default |
|---|---|---|
| Peak traffic ÷ average | × | 3 |
| Requests per second per app vCPU | req/s | 100 |
| App memory per vCPU | GB | 2 |
| Requests per second per database vCPU | req/s | 500 |
| Share of data Postgres keeps in memory | ratio | 0.25 |
| Average response size | KB | 50 |
| Database data sent per request | KB | 5 |
| Cache memory per active user | KB | 2 |
| Cache commands per request | commands | 2 |
| Average cache value size | KB | 1 |
| File downloads per user | per month | 20 |
| File uploads per user | per month | 2 |
| Average file download | KB | 200 |
| Errors per request | ratio | 0.001 |
| Log data per request | KB | 1 |
| Log retention | days | 7 |
| Average payment | per payment | 25 |
| Hours per month | hours | 730 |
Choosing an offering
For each offering the engine evaluates every plan and every combination of configurations, and keeps the cheapest that meets the required features, capacities and limits. A meter the plan neither prices nor includes counts as unpriced, never as free. Offerings that fail stay in the list with the unmet requirement named.
How prices are collected
- 1Fetch and hash. Each pricing page is fetched and stored as raw text. An unchanged hash stops here: no model call, no new snapshot.
- 2Change gate. A decision model reads the change and decides whether it can affect prices. Only those pages go on.
- 3Extraction with exact quotes. A language model writes the price model, and every figure carries the exact text it came from.
- 4Verifier. Plain code checks that each quote appears verbatim in the stored page, each number appears in its quote, each meter and unit exists, and brackets increase. A failure blocks publishing and names the field.
- 5Feature mapping. A decision model maps the page's feature names onto the canonical features of the service kind; its probabilities set the review order.
- 6Human review. A person reviews every change before it goes live. Publishing is one transaction; a failed publish leaves the previous version live.
A value without a citation cannot be published. A citation is a stored page plus the exact quote, or an official SKU id. Monthly and annual prices are stored as separate cited figures.
Hyperscalers
AWS, Azure, Google Cloud and Oracle prices load from their official price APIs, not from marketing pages. 0 hyperscaler offerings are published. A curated equivalence map adds the line items a list price hides: egress, NAT, backups and cross-zone traffic. Each line cites its SKU.
Currency
Prices keep their native currency and region. The stack picks a region and a display currency, and the engine converts at the European Central Bank reference rate. Today's rates are dated 2026-10-27: 1 EUR = 1.115 USD = 0.83658 GBP. Converted figures say so.
Out of scope
- Sales tax and VAT. Every price is before tax.
- Negotiated, enterprise or committed-use contract prices.
- The cost of your time. Self-hosted offerings list what you operate and price the servers only.
See how we make money for why rankings do not depend on who pays.