RTB Architecture

    Bidder Capacity Planner: QPS, Instances, Cost Calculator

    Published · Last updated
    Next scheduled review:

    Bidder Capacity Planner: QPS, Instances, Cost Calculator

    Try the model

    Model version: 2026-10-17. Defaults are editable assumptions unless a dated source is shown.

    These are illustrative inputs. Replace assumptions with your own measured values or contracted prices. Results recalculate in your browser.

    Edit inputs and view sources

    CPU cost is unmeasured. Capacity and cost results depend on this editable assumption.

    ResultValue
    Average QPS50,000
    Peak QPS per region100,000
    Busy vCPUs at peak200
    Provisioned vCPUs333.33
    Cores per active instance4
    Instances per region85
    Instances total170
    QPS capacity per region170,000
    CPU utilization at peak58.82%
    Headroom to saturation70%
    Compute budget, ms95 ms
    Margin above p99 target, ms45 ms
    In-flight requests per instance58.82
    Monthly internet egress, GB61,437.17 GB
    Monthly ingress, GB538,627.28 GB
    AWS egress cost$5,094
    Egress in GiB for GCP57,217.83 GiB
    GCP egress cost$5,130
    Selected egress cost$5,094
    Monthly compute cost$17,995
    Monthly ingress cost$0
    Total monthly cost$23,088
    CPU constraint ratio0.98
    Time constraint ratio0.53
    Connection constraint ratio0.23
    Explore sensitivity to input assumptions
    Download editable XLSX model

    The XLSX starts with the published defaults. It includes editable inputs and formulas, and can be imported into Google Sheets.

    A bidder is sized by three constraints: CPU time per request against peak queries per second, in-flight requests against the exchange timeout, and bytes out against egress pricing. This planner takes peak QPS, request and response sizes, timeout, p99 target and CPU cost per request, and returns instances per region, headroom, monthly compute and egress cost, with every price dated.

    It is vendor-neutral. The instance and egress prices are list prices for one AWS instance family and the Google Cloud Premium Tier; swap them for your own quotes or for bare metal.

    Key facts

    • The timeout is set by the exchange, not the spec. OpenRTB 2.6 defines tmax as the "Maximum time in milliseconds the exchange allows for bids to be received including Internet latency to avoid timeout" and its video example uses 120 ms (IAB Tech Lab, OpenRTB 2.6). Google's guide says tmax is "Typically between 80ms and 1500ms" (Google Authorized Buyers, accessed 17 October 2026).
    • Intermediaries subtract their own overhead before you see it. Prebid Server Go computes the bidder's budget as tmax − request_processing_time − bidder_network_latency_buffer_ms − bidder_response_duration_min_ms, and Prebid Server Java recommends a floor of "at least 150 ms" for bidders (Prebid.org, accessed 17 October 2026).
    • Throughput per node is a measured curve, not a constant. In AWS's Prebid Server load test, 25 Fargate tasks sustained 11,074.86 transactions per second at 0.696 s average response, 400 tasks sustained 128,793.61 at 0.0745 s, and the recommended auto-scaling configuration reached 190,881.19 at 0.0553 s with 100% success (AWS, Prebid Server guidance, accessed 17 October 2026).
    • Compute is cheap; the instance price is public. An EC2 c7g.xlarge (4 vCPU, 8 GiB, up to 12.5 Gbps) lists at $0.145 per hour on demand (Vantage, updated 17 October 2026).
    • Egress is tiered and differs by cloud. AWS charges $0.09 per GB for the first 10 TB out to the internet, falling to $0.05 above 150 TB, with 100 GB free a month (CloudZero, updated 1 May 2026; AWS, accessed 17 October 2026). Google Cloud Premium Tier lists $0.12 per GiB for the first TiB, $0.11 to 10 TiB and $0.085 beyond, effective 1 February 2024 (Google Cloud).
    • Bare metal removes the egress line. Hetzner's AX102 (16-core Ryzen 9 7950X3D, 128 GB ECC) ships with a 1 Gbit/s port and "unlimited" traffic (Hetzner, accessed 17 October 2026); the monthly price is entered by the user.

    Definition

    Bidder capacity planning: choosing the number, size and location of the servers that answer OpenRTB bid requests so that peak request rate is served inside the exchange timeout at a target tail latency, with enough headroom for failover and growth, at a known monthly cost for compute and network egress.

    The architecture the planner assumes is the one in RTB architecture explained and the bidstream flow diagram: exchanges fan out to your bidder endpoints, each request is parsed, enriched, scored and answered or declined with a 204. For why QPS and latency are the two numbers that decide bid performance, see QPS, latency and bid performance.

    How the planner works

    Constraint 1: CPU. Every request costs CPU time, from parsing JSON to running the model to serializing a response. Peak QPS times CPU milliseconds per request gives CPU-seconds per second, which is the number of fully busy vCPUs you need. You never run them fully busy, because tail latency rises steeply as utilization approaches 100%, so the planner divides by a target utilization (60% by default) to get vCPUs to provision, then by vCPUs per instance, then adds redundancy. The CPU cost per request is the one input only you can supply; it comes from a load test of your own bidder. If you have not measured it, the planner labels the result "unmeasured" and the AWS Prebid Server table gives an order of magnitude.

    Constraint 2: time. The exchange's tmax includes network latency. Subtract the round trip to the exchange, the time the exchange's own stack takes (if you sit behind a Prebid Server or an SSP, their formula is visible in the key facts) and serialization, and what is left is your compute budget. Your p99 target must fit inside it with margin. Little's law then gives in-flight requests: QPS times average service time. Divided by instances, that is the concurrency each instance holds, which must be below its worker or connection limit. The seven architecture mistakes that slow ad tech are mostly violations of this constraint.

    Constraint 3: bytes. Inbound bid requests are large and, on the two big clouds, free. Outbound bid responses are small, and no-bids are near zero if you answer with an empty 204, which the spec calls "the most bandwidth friendly form of this signal" (IAB Tech Lab, OpenRTB 2.6). Average QPS times the blended response size gives gigabytes per month, priced through the provider's tiers. Logging to in-region object storage is not internet egress and is excluded; replication between regions is priced at the inter-region rate if you enable it.

    Regions. Exchanges route by geography and tmax is unforgiving across oceans, so most bidders run in at least two regions. The planner sizes each region either for its share of traffic or for the full peak (failover mode). The example below uses failover mode, which is the conservative choice and the one the self-hosted DSP infrastructure requirements article recommends for a first deployment.

    Inputs

    23 of 23 rows

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    1

    Peak QPS (all exchanges, all regions)

    Q_peak

    100,000

    Editable assumption (illustrative)

    2

    Peak-to-average ratio

    k

    2.0

    Editable assumption

    3

    Bid request size (inbound)

    R_in

    4 KB

    Editable assumption; the AWS Prebid test averaged 123 KB per client-to-Prebid-Server request, which bundles several impressions, so exchange-to-bidder requests are smaller (AWS, accessed 17 Oct 2026)

    4

    Bid response size

    R_out

    1.5 KB

    Editable assumption

    5

    Bid rate (share of requests answered with a bid)

    b

    20%

    Editable assumption

    6

    No-bid response size

    R_nb

    200 B

    Editable assumption (HTTP 204 with headers)

    7

    Exchange timeout

    tmax

    120 ms

    OpenRTB 2.6 example value (IAB Tech Lab); Google: "Typically between 80ms and 1500ms" (Google, accessed 17 Oct 2026)

    8

    Network round trip to exchange

    rtt

    20 ms

    Editable assumption (measure per exchange and region)

    9

    Serialization and framework overhead

    ovh

    5 ms

    Editable assumption

    10

    p99 latency target (compute only)

    p99

    50 ms

    Editable assumption

    11

    CPU time per request

    cpu_ms

    2.0 ms

    Editable assumption; must be measured on your bidder

    12

    Target utilization at peak

    u

    60%

    Editable assumption (heuristic; see FAQ)

    13

    vCPUs per instance

    vcpu

    4

    c7g.xlarge (Vantage, 17 Oct 2026)

    14

    Instance price per hour

    P_h

    $0.145

    c7g.xlarge on demand (Vantage, 17 Oct 2026); region not stated on the page, us-east-1 assumed

    15

    Hours per month

    H

    730

    Convention

    16

    Regions

    n_reg

    2

    Editable assumption

    17

    Region sizing mode

    mode

    failover

    Editable: failover sizes each region for Q_peak; share sizes each for Q_peak / n_reg

    18

    Redundancy per region

    N+

    1

    Editable assumption (N+1)

    19

    Worker or connection limit per instance

    W

    256

    Editable assumption

    20

    Egress price table

    tiers

    AWS

    AWS: $0.09 / $0.085 / $0.07 / $0.05 per GB at 10 / 40 / 100 / 150+ TB, 100 GB free (CloudZero, 1 May 2026; AWS, 17 Oct 2026). GCP Premium: $0.12 / $0.11 / $0.085 per GiB at 1 / 10 / 10+ TiB (Google, effective 1 Feb 2024). Bare metal: $0 (unlimited traffic on Hetzner AX102, Hetzner, 17 Oct 2026)

    21

    Ingress price per GB

    P_in

    $0

    Editable assumption; verify on the provider's data transfer page

    22

    Inter-region replication share of logs

    rep

    0%

    Editable; priced at $0.02 per GB on AWS (CloudZero, 1 May 2026)

    23

    Bare-metal server price per month and cores

    P_bm, c_bm

    user-entered

    Editable (Hetzner page shows specs but the price did not render on fetch)

    Formulas

    # Load
    Q_avg        = Q_peak / k
    Q_region     = Q_peak                      (mode = failover)
                 = Q_peak / n_reg              (mode = share)
    
    # Constraint 1: CPU
    CPU_SEC      = Q_region × cpu_ms / 1000    # busy vCPUs needed at peak
    VCPU_PROV    = CPU_SEC / u
    INST_REGION  = ceil(VCPU_PROV / vcpu) + N+
    INST_TOTAL   = INST_REGION × n_reg
    CAPACITY     = INST_REGION × vcpu × 1000 / cpu_ms     # QPS per region at 100% utilisation
    UTIL_PEAK    = Q_region / CAPACITY
    HEADROOM     = (CAPACITY − Q_region) / Q_region
    
    # Constraint 2: time
    BUDGET       = tmax − rtt − ovh            # compute budget in ms
    MARGIN       = BUDGET − p99                # must be > 0
    INFLIGHT     = Q_region × (p99 / 1000)     # Little's law, conservative (uses p99 as service time)
    INFLIGHT_INST = INFLIGHT / INST_REGION     # must be < W
    
    # Constraint 3: bytes (per month, all regions)
    SEC_MONTH    = 2,630,016                   # 30.44 days
    BYTES_OUT    = Q_avg × (b × R_out + (1 − b) × R_nb) × SEC_MONTH
    GB_OUT       = BYTES_OUT / 1e9
    BYTES_IN     = Q_avg × R_in × SEC_MONTH
    EGRESS_COST  = tiered(GB_OUT − free_GB, tiers) + rep × GB_LOGS × P_interregion
    INGRESS_COST = GB_IN × P_in
    
    # Cost
    COMPUTE_COST = INST_TOTAL × P_h × H
    BARE_METAL   = ceil(VCPU_PROV / c_bm) + N+  per region, × P_bm × n_reg
    TOTAL_MONTH  = COMPUTE_COST + EGRESS_COST + INGRESS_COST
    
    # What saturates first (reported in order of the lowest ratio)
    CPU_RATIO    = UTIL_PEAK / u
    TIME_RATIO   = p99 / BUDGET
    CONN_RATIO   = INFLIGHT_INST / W
    

    Worked example on the defaults

    16 of 16 rows

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    Average QPS

    50,000

    Busy vCPUs at peak (2 ms per request)

    200

    vCPUs to provision at 60% utilization

    334

    Instances per region (c7g.xlarge, N+1)

    85

    Instances total (2 regions, failover mode)

    170

    Capacity per region at 100% utilization

    170,000 QPS

    Utilisation at peak / headroom to saturation

    59% / 70%

    Compute budget (120 − 20 − 5)

    95 ms; margin over p99 target 45 ms

    In-flight requests at p99 per region / per instance

    5,000 / 59 (limit 256)

    Egress per month (20% bids at 1.5 KB, 80% no-bids at 200 B)

    61.4 TB

    Ingress per month (4 KB requests)

    539 TB, priced at $0

    Compute cost per month

    $18.0k (170 × $0.145 × 730)

    Egress cost per month, AWS tiers

    about $5.1k

    Egress cost per month, GCP Premium Tier

    about $5.5k

    Total per month (AWS)

    about $23k

    What saturates first

    CPU (ratio 0.98), then connections (0.23), then time (0.53)

    Two things stand out. Compute for 100,000 QPS costs less than a junior engineer, which is why the staffing line in the TCO methodology matters more than the cloud line. And the egress line is dominated by how many requests you answer with a bid, not by request volume, because inbound is free and no-bids are near-empty; a bidder that bids on 50% of requests instead of 20% pays roughly double for egress.

    Reference: measured Prebid Server throughput

    The only public, dated load test of an open-source auction server at scale is AWS's guidance for Prebid Server on Fargate. The figures are HTTP transactions per second against the auction endpoint, where one transaction can carry several impressions, so they are not directly comparable to exchange-to-bidder QPS, but they show the shape of the curve.

    8 of 8 rows

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    1

    800.79

    9.566 s

    87.70%

    10

    4,145.95

    1.850 s

    97.38%

    25

    11,074.86

    0.696 s

    98.93%

    50

    75,912

    0.358 s

    99.60%

    100

    75,411

    0.180 s

    99.89%

    200

    64,621.02

    0.131 s

    99.86%

    400

    128,793.61

    0.0745 s

    99.97%

    50 to 400 with auto scaling (recommended)

    190,881.19

    0.0553 s

    100%

    Source: AWS, Guidance for Deploying a Prebid Server on AWS, accessed 17 October 2026. The test spawned 10,000 users across four US regions; 80% of requests were auction calls; average payloads were 123 KB per request and 331 KB per response. Note that response time only reaches a bidder-grade figure (under 100 ms) at 400 tasks, which is the point of the planner's utilization input. For running Prebid Server yourself, see the Prebid Server self-hosting guide.

    Price table

    13 of 13 rows

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    EC2 c7g.xlarge, 4 vCPU, 8 GiB, on demand

    $0.145 per hour

    17 Oct 2026

    Vantage

    AWS data transfer out, first 10 TB per month

    $0.09 per GB

    Apr 2026 (page updated 1 May 2026)

    CloudZero

    AWS data transfer out, next 40 TB

    $0.085 per GB

    Apr 2026

    Same

    AWS data transfer out, next 100 TB

    $0.07 per GB

    Apr 2026

    Same

    AWS data transfer out, above 150 TB

    $0.05 per GB

    Apr 2026

    Same

    AWS free data transfer out

    100 GB per month

    17 Oct 2026

    AWS

    AWS inter-region

    $0.02 per GB

    Apr 2026

    CloudZero

    AWS inter-AZ

    $0.01 per GB each direction

    Apr 2026

    Same

    GCP Premium Tier, 0 to 1 TiB

    $0.12 per GiB

    effective 1 Feb 2024

    Google Cloud

    GCP Premium Tier, 1 to 10 TiB

    $0.11 per GiB

    effective 1 Feb 2024

    Same

    GCP Premium Tier, above 10 TiB

    $0.085 per GiB (Google); $0.08 per GB (third-party tracker)

    Feb 2024; Sep 2026

    Same; egresscost.com, verified Sep 2026

    GCP Standard Tier, first 10 TiB

    $0.085 per GB; 200 GiB free

    Sep 2026

    egresscost.com (third-party; verify on Google's page)

    Hetzner AX102

    16 cores, 128 GB ECC, 1 Gbit/s, unlimited traffic; price n/d on fetch

    17 Oct 2026

    Hetzner

    FAQ

    What is a typical OpenRTB timeout? There is no mandated value. The OpenRTB 2.6 example uses 120 ms and Google's guide says tmax is typically between 80 and 1,500 ms (IAB Tech Lab; Google, accessed 17 October 2026). Plan for the lowest tmax among your exchanges, and remember that intermediaries subtract their own processing and network buffers before forwarding; Prebid Server Java recommends giving bidders at least 150 ms (Prebid.org).

    How many requests per second can one bidder instance handle? It is 1,000 divided by CPU milliseconds per request, per vCPU, at full utilization, so a 4 vCPU instance at 2 ms per request saturates at 2,000 QPS and should run at about 1,200. The only honest source for the CPU figure is a load test of your bidder; the AWS Prebid Server table above shows how badly latency degrades when a node is pushed toward saturation (9.6 seconds average on one overloaded task).

    How much does bid request traffic cost in egress? Inbound requests are not charged on AWS or Google Cloud by default (verify on the provider's page); outbound responses are. At 50,000 average QPS, a 20% bid rate, 1.5 KB bids and 200-byte no-bids, egress is 61 TB a month, about $5,100 on AWS's tiers (CloudZero, 1 May 2026) and about $5,500 on Google Cloud Premium Tier (Google, effective 1 February 2024). Bidding more often costs more than receiving more.

    What utilization should a bidder run at? The planner defaults to 60% at peak, which is a heuristic, not a standard: tail latency rises non-linearly with utilization, and 60% leaves room for a region failover without breaching tmax. If your load test shows p99 within target at 75%, raise the input; the output recomputes.

    Do I need more than one region? Choose regions from measured supply paths, the latency target and failure requirements. Measure each relevant route before deciding on deployment topology. The planner’s regional and failover assumptions are explicit inputs; they do not establish that a particular network path will meet your target.

    Continue reading

    Use the rtb architecture guide to compare the related operating models, definitions and evidence before making this decision.

    How this works on owned infrastructure

    The planner prices compute and egress on public cloud list prices because they are the only ones that carry a date, but the same arithmetic applies to bare metal and to an owned data center, where the egress line disappears and the instance line becomes depreciation. AdSovereign is an enterprise, on-premise RTB stack (DSP, SSP, exchange, DMP and clean room) whose bidder is deployed on the customer's own infrastructure or private cloud, sized with this method and operated against a published latency target. The architecture page describes the bidder and its data path, the SLA page states the latency and availability commitments, the TCO calculator carries the staffing and license lines that this planner leaves out, and the pilot page describes a 60-day evaluation. The planner stays neutral; the product is mentioned only here.

    Sources

    1. IAB Tech Lab, OpenRTB 2.6 specification (GitHub, versions 2.6-202211 and 2.6-202303). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md
    2. Google, Authorized Buyers OpenRTB guide (accessed 17 October 2026). https://developers.google.com/authorized-buyers/rtb/openrtb-guide
    3. Prebid.org, Prebid Server /openrtb2/auction endpoint documentation (accessed 17 October 2026). https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html
    4. AWS, Guidance for Deploying a Prebid Server on AWS, "Configurations for ECS Auto Scaling" (accessed 17 October 2026). https://docs.aws.amazon.com/solutions/latest/prebid-server-deployment-on-aws/configurations-for-elastic.html
    5. Vantage, EC2 c7g.xlarge instance page (updated 17 October 2026). https://instances.vantage.sh/aws/ec2/c7g.xlarge
    6. AWS, EC2 On-Demand Pricing page (accessed 17 October 2026). https://aws.amazon.com/ec2/pricing/on-demand/
    7. CloudZero, "AWS egress costs" (published 8 July 2024, updated 1 May 2026, pricing verified April 2026). https://www.cloudzero.com/blog/aws-egress-costs
    8. Google Cloud, Virtual Private Cloud pricing announcement (prices effective 1 February 2024). https://cloud.google.com/vpc/pricing-announce
    9. egresscost.com, GCP egress pricing (verified September 2026). https://egresscost.com/gcp/
    10. Hetzner, AX102 dedicated server (accessed 17 October 2026). https://www.hetzner.com/dedicated-rootserver/ax102/
    11. US Bureau of Labor Statistics, Software Developers (May 2025 wages; modified 27 August 2026). https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm

    Changelog

    • 18 October 2026: aligned the title and heading and applied recorded source-URL corrections where needed. Factual research cutoff remains 17 October 2026.

    • 17 October 2026. First edition: 23 inputs, three-constraint model, AWS Prebid Server reference table, 13-row price table. Next review 15 January 2027.