Skip to content

Capacity planning and traffic modeling

Before you write any test configuration, you need a number to test against. Traffic modeling turns “how bad could it get?” into a virtual-user target that you configure in MaxoPerf. Skip this step and you are guessing. Your stress test then runs either too low to find real problems or too high to mean anything.

  • Access to last year’s web analytics (Google Analytics, Adobe, or equivalent) and/or server-side request logs.
  • A rough estimate of the conversion funnel: what percentage of visitors add to cart, proceed to checkout, and complete payment.
  • Your current SLO thresholds: what p95 latency and error rate are acceptable during peak load.

Teams often set VU counts by gut feel (“let’s do 1000 users”) instead of data. That leads to one of two failures:

  1. Undertesting. The 1000-user test passes and you declare readiness. Real BFCM traffic is 5000 concurrent users, and the system falls over.
  2. Overtesting. The 5000-user number you picked is 10× actual peak. The test breaks everything, you spend weeks fixing issues production would never see, and you run out of time for real readiness work.

Base the test on real data and you avoid both.

Pull last year’s BFCM traffic data. Find the peak concurrent sessions or peak RPS in a 5-minute window. If you have no data from last year (for example, you are a new business), take your highest-traffic day on record and apply a growth multiplier.

Suppose your analytics show:

  • Peak concurrent sessions last Black Friday: 8,400 sessions in a 5-minute window
  • Business expects 35 % YoY growth this year

Projected peak concurrent sessions: 8,400 × 1.35 = 11,340 sessions

Add 20 % safety headroom to cover measurement error and unexpected surges: 11,340 × 1.20 = ~13,600 sessions

This is your target peak concurrent load.

Step 2: Derive concurrency (virtual users) from sessions

Section titled “Step 2: Derive concurrency (virtual users) from sessions”

Concurrent sessions in analytics and virtual users in a load test are related, but they are not the same thing. A virtual user in MaxoPerf makes one request, waits (think time), then makes another, much like a real browser session with pauses.

Use Little’s Law to derive VU count:

VUs = Throughput (RPS) × Average response time (s)

Or, working from sessions:

VUs ≈ Peak concurrent sessions × (avg request duration / avg session think time)

For a typical e-commerce site with 500 ms average server response time and 5 s of think time between clicks:

VUs ≈ 13,600 × (0.5 / 5) = 1,360 VUs

For a simpler model, use this rule of thumb for a typical e-commerce browsing + checkout mix: VUs ≈ 10 % of peak concurrent sessions. In this example, 13,600 × 0.10 = 1,360 VUs, which gives the same result.

If you prefer to model by RPS rather than VUs:

  • Peak sessions: 13,600
  • Each session generates ~2 page requests per minute on average
  • Peak RPS = 13,600 × 2 / 60 = ~453 RPS

In MaxoPerf you can target RPS directly with the throughput stop mode. You can also calculate the VU count that produces your target RPS at your expected average latency.

Pages do not get equal traffic. A checkout endpoint with 2 % conversion sees a fraction of the homepage’s traffic. Build a per-endpoint profile:

Funnel stageRelative trafficEndpoint examples
Homepage / category browse100 %GET /, GET /category/:id
Product detail page (PDP)60 %GET /product/:id
Search40 %GET /search?q=...
Add to cart15 %POST /cart/items
Checkout start8 %GET /checkout
Payment2 %POST /checkout/payment

This breakdown sets the scenario weights in your end-to-end journey load test. If your checkout scenario sends 100 % of VUs to the payment endpoint, you are stress-testing payment in isolation, not modeling real traffic.

  1. Open the MaxoPerf console and navigate to Tests → New test.
  2. In the Load profile section, set Virtual users to your modeled peak VU count. In this example, that is 1,360.
  3. Set Ramp-up to 5–10 minutes. Even a doorbuster spike has a brief ramp, so do not start at full VUs.
  4. Set Duration to match your test type: 15–20 min for a load test, 30–60 min for a stress test.
  5. In the scenario file, weight requests according to the funnel breakdown from Step 3.

Record these values so the whole team works from the same numbers:

ParameterValueSource
Historical peak concurrent sessions8,400GA4 (Black Friday 2024, 22:00–22:05 UTC)
YoY growth factor1.35Business forecast Q4 2025
Safety headroom1.20Engineering judgment
Target peak VUs1,360Modeled (Little’s Law)
Target peak RPS~453 RPSSessions × request rate
Acceptable p95 latency800 msSLO: checkout page
Acceptable error rate0.5 %SLO: payment endpoint

Store this document in your team wiki and link it from the MaxoPerf test description. When someone asks “why 1,360 VUs?”, the answer is one link away.

DoDon’t
Model from last year’s actual peak, not average trafficUse your average daily traffic as the BFCM target
Add 20 % safety headroom above the modeled peakTest at exactly the projected number and let model error bite you
Break down VU targets by funnel stageRun all VUs against the checkout endpoint only
Document the model so the whole team uses the same numbersKeep the VU number in your head and change it between tests
Revisit the model after each test run and adjust it if actual throughput differsLock the numbers before your first run and never update them