Skip to content

Methodology

How a stack becomes a monthly bill

Drivers you know become workload requirements through formulas you can read. The engine prices those requirements on every plan of every offering. Every price it uses links to its source.

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.

Drivers
DriverUnitPreset value
Monthly active usersusers5,000
Requests per userper month400
Database data per userMB2
Stored files per userMB10
Emails per userper month4
Revenue per userper month3
Background jobs per userper month10

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.

Derived values
ValueFormulaAt the preset
Requests per monthMonthly active users × Requests per user2,000,000
Peak requests per second(Requests per month ÷ 2,592,000) × Peak traffic ÷ average2.3148
App vCPUmax(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,0249.7656
Database vCPUmax(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 commandsRequests per month × Cache commands per request4,000,000
File downloadsMonthly active users × File downloads per user100,000
Payment volumeMonthly active users × Revenue per user15,000
Job runsMonthly active users × Background jobs per user50,000
Logs per month (GB)Requests per month × Log data per request ÷ 1,048,5761.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.

Workload requirements by service kind
ServiceRequirementFormulaAt the preset
Managed PostgresStorageDatabase size (GB)9.7656
Managed PostgresBackup storageDatabase size (GB)9.7656
Managed PostgresEgressRequests per month × Database data sent per request ÷ 1,048,5769.5367
Managed PostgresvCPUDatabase vCPU1
Managed PostgresMemory (GB)Database memory (GB)2.4414
Managed PostgresvCPU hoursDatabase vCPU × Hours per month730
Managed PostgresMemory hoursDatabase memory (GB) × Hours per month1,782
Managed RedisRequestsCache commands4,000,000
Managed RedisEgressCache commands × Average cache value size ÷ 1,048,5763.8147
Managed RedisMemory (GB)Cache memory (GB)0.25
Managed RedisMemory hoursCache memory (GB) × Hours per month183
Object storageStorageMonthly active users × Stored files per user ÷ 1,02448.8281
Object storageRead requestsFile downloads100,000
Object storageWrite requestsMonthly active users × File uploads per user10,000
Object storageEgressFile downloads × Average file download ÷ 1,048,57619.0735
App computeRequestsRequests per month2,000,000
App computeEgressRequests per month × Average response size ÷ 1,048,57695.3674
App computevCPUApp vCPU0.25
App computeMemory (GB)App vCPU × App memory per vCPU0.5
App computevCPU hoursApp vCPU × Hours per month183
App computeMemory hoursApp vCPU × App memory per vCPU × Hours per month365
Transactional emailEmails sentMonthly active users × Emails per user20,000
AuthMonthly active usersMonthly active users5,000
Error trackingError eventsRequests per month × Errors per request2,000
LoggingLogs ingestedLogs per month (GB)1.9073
LoggingStorageLogs per month (GB) × Log retention ÷ 300.445
LoggingRetention (days)Log retention7
PaymentsPayment volumePayment volume15,000
PaymentsTransactionsPayment volume ÷ Average payment600
Jobs and queuesJob runsJob runs50,000
Jobs and queuesQueue messagesJob runs50,000

Assumptions

The constants inside the formulas. Each is a default you can change.

Assumptions
AssumptionUnitDefault
Peak traffic ÷ average×3
Requests per second per app vCPUreq/s100
App memory per vCPUGB2
Requests per second per database vCPUreq/s500
Share of data Postgres keeps in memoryratio0.25
Average response sizeKB50
Database data sent per requestKB5
Cache memory per active userKB2
Cache commands per requestcommands2
Average cache value sizeKB1
File downloads per userper month20
File uploads per userper month2
Average file downloadKB200
Errors per requestratio0.001
Log data per requestKB1
Log retentiondays7
Average paymentper payment25
Hours per monthhours730

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

  1. 1Fetch and hash. Each pricing page is fetched and stored as raw text. An unchanged hash stops here: no model call, no new snapshot.
  2. 2Change gate. A decision model reads the change and decides whether it can affect prices. Only those pages go on.
  3. 3Extraction with exact quotes. A language model writes the price model, and every figure carries the exact text it came from.
  4. 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.
  5. 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.
  6. 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.