Skip to content

The outage where the homepage looked fine and checkout was dead

A checkout-specific health check caught a payment-provider integration failure within two minutes, while a shallow homepage ping would have shown everything as healthy for hours.

Checks
9 checks that define a working store · Labor Day sale traffic
Sat, 09/05/2026 · 2:15 PMRV
Incident 41 · Checkout failing — Payments integration: payment intent timed out in 2 of 2 runs (us-east, then us-west)Paged Renata Voss · 2:14 PMOpen incident
Checks passing
8 of 9Homepage, product pages, cart, search all green
Failing
Synthetic checkoutPayment step · 20.0 s timeout · 2 regions
Alert rule fired
2:14 PM2 consecutive failures · 1m 31s after first failed intent
Legacy homepage ping
200 OKRetired · would still read healthy

All checks Passed Failed

Last 24 results per check
CheckTypeSystemEveryRegionsHistoryLastHealth
Homepage renders/HTTP + DOMStorefront web1 min3398 msHealthy
Product page · real stock/products/ridge-pack-28lHTTP + JSONCatalog & inventory1 min3541 msHealthy
Product page · variant stock/products/merino-crew-sockHTTP + JSONCatalog & inventory1 min3507 msHealthy
Synthetic checkoutcart → payment → confirm → voidBrowser scriptPayments integration3 min2Timeout 20.0 sFailing
Cart API · add linePOST /api/cart/linesAPICart service1 min3184 msHealthy
Search returns results/api/search?q=rain+shellAPISearch2 min2236 msHealthy
Account sign-intest account · sign in → ordersBrowser scriptIdentity5 min22.3 sHealthy
Static assets/_assets/app.cssHTTPCDN1 min361 msHealthy
TLS certificatestorefront · 71 days leftCertificateEdgeDaily1ValidHealthy

Synthetic checkout · by region

Every 3 min
us-east · failed 2:14 PM · 1 of 2us-west · confirm failed 2:14 PM · 2 of 2Next scheduled 2:16 PM

What the old ping would show

GET / only
200 OK · 402 msHomepage never touches payments

The shape of the work

Industry

E-commerce & Retail

Duration

Ongoing retainer

Cooperation model

Ongoing retainer, phased

Services
Availability monitoringIncident detection & alertingEscalation & on-call
Integrations
ShopifyStripeKlaviyoShipStation
Technologies
Synthetic monitoringUptime checksAlerting platformOn-call escalationStatus dashboard
Team
1 Project lead1 Product designer2 Frontend engineers1 Backend engineer1 QA engineer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

What went wrong, and when

01
  1. 01

    A payment-provider integration failure took checkout down during a weekend sale while the homepage, product pages, and every shallow health signal stayed green, so nothing in place would have caught it.

    The check measured the wrong thing entirely. A homepage ping proves a web server is answering, which is true in almost every commercially significant outage. Nothing exercised the payment path, so the class of failure that costs the most money was precisely the class the monitoring couldn't see. The outage was found by a customer email.

    We defined the endpoints that actually represent a working store (homepage, product page, and a full checkout health check), wired alert thresholds tuned to fire on a real degradation, and set an escalation path so a fired alert reached the on-call engineer directly instead of sitting in an unread channel.

Process

Phase by phase

  1. Phase 1: Define healthy

    What a working store means

    Identified the endpoints that define a genuinely working store, well beyond a loading homepage.

    • Endpoint inventory
    • Health definition
  2. Phase 2: Build the check

    Exercise the real flow

    Built a synthetic checkout health check that runs the actual payment path end to end.

    • Synthetic check
    • Test payment setup
  3. Phase 3: Tune

    Fire on degradation, not noise

    Tuned thresholds so alerts fire on real degradation and stay quiet through normal traffic variance.

    • Threshold configuration
    • Noise analysis
  4. Phase 4: Escalate

    Straight to on-call

    Wired an escalation path routing a fired alert directly to the on-call engineer.

    • Escalation policy
    • On-call rota
Incident 41 · Checkout failing
Labor Day sale · Payments integration · payment intent timing out
Closed Sun, 09/06/2026RV
Time to detect
Under 2 min1m 31s from first failed intent to rule firing
Time to reach on-call
Under 5 min4m 12s to Renata Voss's acknowledgement
Checkout downtime avoided
~3 hEstimate · avg revenue per hour × downtime avoided
Found by
Synthetic checkoutLast outage: a customer email

First five minutes

Sat, 09/05/2026 · from 2:13:04 PM
0 min1 min2 min3 min4 min5 min
Homepage rendersevery 1 min · 3 regions
Checkout · us-eastscheduled run1 of 2
Checkout · us-westconfirm, sent at once2 of 2next interval
Alert rulepayment pathFired T+1:31
On-callRenata VossAck
Why it was under two minutes
The confirming run went out at once from us-west, not at the next interval (T+3:41)
2 consecutive failures in two regions, so one bad network path pages nobody
The page went to a named person with a 5-minute deadline, not to a channel

Minute by minute

12 entries
TimeEvent
2:13:04 PMT+0:00Provider logFirst failed payment-intent call (read afterward)
2:13:16 PMT+0:12Homepage renders200 · hero + nav present · passing all through
2:13:45 PMT+0:41Synthetic checkoutScheduled run starts · us-east
2:14:08 PMT+1:04Synthetic checkoutPayment intent timed out at 20.0 s · 1 of 2
2:14:09 PMT+1:05Synthetic checkoutConfirming run dispatched now · us-west
2:14:32 PMT+1:28Synthetic checkoutPayment intent timed out again · 2 of 2
2:14:35 PMT+1:31Alert ruleCheckout · payment path fires · incident 41
2:14:37 PMT+1:33EscalationPaged Renata Voss · push + SMS
2:14:37 PMT+1:33EscalationCopy posted to #store-alerts
2:16:37 PMT+3:33EscalationNo ack after 2 min · phone call placed
2:17:16 PMT+4:12Renata VossAcknowledged from phone
2:19:37 PMT+6:33EscalationStep 2 (Theo Lindqvist) not needed
Downtime avoided is an estimate, not a measurement.
On screen

Incident 41, the weekend checkout outage: detected in under 2 minutes, on-call reached in under 5, about three hours of checkout downtime avoided (an estimate), with the first five minutes on a timeline and the minute-by-minute record.

The numbers, before and after

Under 2 minutes

Time to detect the outage

Under 5 minutes

Time to reach on-call

~3 hours of full checkout downtime avoided

Estimated sales saved during the sale

Time to detect and time to reach on-call are both from the first real incident under the new monitoring. The sales-saved figure is an estimate: the retailer's own average revenue per hour at that trading period applied to the downtime avoided, and it's presented as an estimate, not a measurement.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

Introduction

The engagement

The only uptime check before we started was a basic homepage ping, so a broken checkout could sit undetected for hours as long as the homepage kept loading.

An online retailer whose entire uptime monitoring was a homepage ping. The engagement was commissioned after a weekend sale during which a payment-provider integration failed and checkout was down for a stretch while every signal in place stayed green, because the homepage, which doesn't touch payments, kept loading perfectly throughout.

Uptime & Reliability Monitoring

The solution

How it was handled

  1. 01

    Identified the endpoints that define a genuinely working store, well beyond a loading homepage

    The checks were rewritten around what a working store means (homepage renders, product page returns real stock, checkout completes) as three separate assertions.

  2. 02

    Built a synthetic checkout health check that exercises the real payment flow

    It runs against the payment provider in test mode on a dedicated SKU, so a real failure is caught without a real order ever being created.

  3. 03

    Tuned alert thresholds to fire on a real degradation, not normal traffic noise

    The thresholds were set from a month of existing traffic, because the previous alerts had fired often enough that everyone had learned to ignore them.

  4. 04

    Wired an escalation path routing a fired alert straight to the on-call engineer

    Alerts route to a named responder with an acknowledgment deadline and escalate to the next if it passes, instead of posting into a channel.

01

Checks that mean something

Endpoints chosen to represent a working store, beyond a homepage that happens to respond.

The old monitor pinged the homepage and reported green through an outage that stopped every sale. The checks were rewritten around what a working store actually means: the homepage renders, a product page returns real stock, and checkout completes. Three assertions instead of one, each attributed to a system, so an alert names the failing part instead of announcing that something is wrong.

What shipped
  • Homepage, product page and checkout checked separately
  • Product check asserts real stock, not a 200 response
  • Alerts name the failing system, not just the site
Health definition
What a working store means: three assertions, each attributed to the system that owns it
Thu, 09/17/2026RV

1Homepage renders

Owner: Storefront web
GET / · 3 regions · 1 min
  • Status is 200
  • Hero banner present in <main>
  • Category nav has 6+ links
  • No error-template marker
  • Rendered within 3 s
Alert namesHomepage not rendering · Storefront web

2Product page returns real stock

Owner: Catalog & inventory
GET /products/ridge-pack-28l · 3 regions
  • Status is 200
  • offers.availability is InStock
  • Inventory qty > 0 for a stocked variant
  • Price present and non-zero
  • Add to cart enabled
Alert namesProduct stock missing · Catalog & inventory

3Checkout completes

Owner: Payments integration
Browser script · 2 regions · 3 min
  • Cart accepts the test SKU
  • Address step returns shipping rates
  • Payment intent created within 20 s
  • Confirmation shows an order number
  • Test order voided afterwards
Alert namesCheckout failing · Payments integration

The monitor it replaced

Retired
Homepage pingRetiredGET / expects 200 · 1 regionOne assertion, attributed to nothing
During the sale outage it read200 OKwhile checkout took no orders Found by a customer email
3 assertions9 checksAlerts name the system

Endpoint inventory

Each check belongs to one assertion and one owner
CheckTargetOwnerAssertion
Homepage renders/Storefront web1
Product page · real stock/products/ridge-pack-28lCatalog & inventory2
Product page · variant stock/products/merino-crew-sockCatalog & inventory2
Synthetic checkoutcart → payment → confirm → voidPayments integration3
Cart API · add linePOST /api/cart/linesCart serviceSupporting
Search returns results/api/search?q=rain+shellSearchSupporting
Account sign-intest account · sign in → ordersIdentitySupporting
Static assets/_assets/app.cssCDNSupporting
TLS certificatestorefront · 71 days leftEdgeSupporting
On screen

The health definition: homepage renders, product page returns real stock, checkout completes. Three assertions, each owned by a system and naming it in the alert, beside the retired homepage ping and the inventory of all nine checks.

Synthetic checkout · run 7f3a21
A scripted order walked end to end against the live payment provider in test mode, then voided
Sat, 09/05/2026 · 2:14 PMRV
Failed at step 4 · payment intent timed outNothing on any page a ping requests changed. Only this step can see it.Started2:13:45 PMRegionus-eastTest SKUAC-TEST-0001Result1 of 2 Confirming from us-west

Step timings

Scale 0–24 s · payment step timeout 20 s
0 s6 s12 s18 s24 s
1. Load product page/products/test-sku-ac-00011.2 s
2. Add test SKU to cartPOST /api/cart/lines0.6 s
3. Shipping addressTest address · ground0.9 s
4. Create payment intentProvider · test modeTimeout 20.0 s
5. Confirm orderWaits for confirmation pageSkipped after timeout—
6. Void test orderRuns in finally · cart released0.3 s
Passed Timed out Skipped

checkout.spec

Script · v14
1// checkout.spec · provider in test mode
2const sku = "AC-TEST-0001" // dedicated SKU
3step("product", () => visit(pdp(sku)))
4step("cart", () => addToCart(sku, 1))
5step("address", () => fillAddress(TEST_ADDR))
6step("payment", { timeout: "20s" }, () =>
7 createPaymentIntent({ mode: "test" }))
8step("confirm", () => expectOrderNumber())
9finally(() => voidTestOrder())
10
11// every 3 min · us-east, us-west
12onFail: confirmNow({ region: "other" })
13page: after 2 consecutive failures

Run history · this afternoon

Every 3 min, alternating · confirm runs go out at once
us-eastFailed · 2:14 PM
us-westConfirm · 2:14 PM
1:00 PM2:14 PM

Same moment, other checks

2:14:08 PM
Homepage renders200 · 398 ms
Product page · real stockInStock · 541 ms
Cart API · add line201 · 184 ms
Synthetic checkoutTimeout 20.0 s
On screen

One synthetic checkout run on the dedicated test SKU: product page, cart and address pass, the payment intent against the provider in test mode times out, confirmation is skipped and the test order is voided, while every page check at that moment stays green.

02

A synthetic checkout

A health check that exercises the real payment flow, end to end.

The checkout probe runs a real order end to end on a test SKU every few minutes (cart, address, payment intent, confirmation) against the live payment provider in test mode, then voids it. That's what catches the failures that matter: an expired API key or a declined provider doesn't affect any page a ping would ever request.

What shipped
  • A real order run end to end every few minutes
  • Live payment provider in test mode, then voided
  • Catches expired keys and provider failures a ping can't see
Checkout · payment path
What has to happen before someone is woken, and who is woken in what order
Thu, 09/17/2026RV

Alert rule Active

Owner: Payments integration
Fails whenAny step errors, or payment exceeds 20 s
Pages after2 consecutive failures, from two regions
Confirm runDispatched at once, not at the next interval
ThresholdsSet from 30 days of existing traffic
Routes toPolicy · Storefront revenue path
Channel copy#store-alerts gets a copy, never the page

Retired rules 6 removed

Paged people for nothing
RuleWhy it went
Homepage response > 800 ms · one sampleFired on ordinary evening peaks
Any 5xx on /api/searchSingle bot bursts, no shopper impact
web-2 CPU > 80%Resource, not a symptom
Cart API p95 > 400 ms · 1 min windowWindow too short for traffic noise
Image CDN 404 count > 0Stale product images, not an outage
Checkout page response > 2 s · one pingPage loaded; said nothing about payment
The noise that had taught everyone to ignore alerts, gone before the new rule went live.

Escalation chain

Ack deadline 5 min per step
1RVRenata VossPrimary on-callWhenAt onceHowPush + SMS · call at 2 min
2TLTheo LindqvistSecondary on-callWhenNo ack in 5 minHowPush, SMS, call
3IBImani BrooksEngineering leadWhenNo ack in 10 minHowPhone call
4WKWalt KesslerHead of e-commerce, Alder & CraneWhenNo ack in 15 minHowPhone call

On-call rota · Q3

Weeks run Monday to Sunday
WeekPrimarySecondaryPages
08/24 – 08/30Theo LindqvistRenata Voss—
08/31 – 09/06Renata VossTheo LindqvistIncident 41
09/07 – 09/13Imani BrooksRenata Voss—
09/14 – 09/20Theo LindqvistImani Brooks—
09/21 – 09/27Renata VossTheo Lindqvist—
Acknowledged by Renata Voss · 2:17:16 PMSat, 09/05/2026 · paged 2:14:37 PM · phone call 2:16:37 PM · step 2 not neededUnder 5 min
03

Escalation to a person

On screen

The checkout alert rule (two consecutive failures from two regions, thresholds from a month of traffic) with the six retired false-page rules, the four-step escalation chain with its acknowledgment deadline, the on-call schedule and the acknowledgment that closed the weekend page.

A fired alert routed to the on-call engineer, never left in an unread channel.

Alerts route to a person with an acknowledgment deadline and an escalation to the next responder if it passes, so a two-in-the-morning failure never sits in a channel until nine. Thresholds require two consecutive failures before paging, which removed the noise that had taught everyone to ignore the previous alerts in the first place.

What shipped
  • Paged to a named responder with an escalation deadline
  • Two consecutive failures required before paging
  • Noise removed, so the alerts are believed again

Working inside their operation

A cross-functional team of 5 worked on an ongoing retainer, covering Availability monitoring, Incident detection & alerting, Escalation & on-call. We ran a weekly demo and a shared board they could read at any time. Their team took over day-to-day operation of the checks while we stayed on the retainer for thresholds and escalation.

A phased retainer: checks first, then thresholds, then escalation. The escalation path was treated as part of the monitoring, never as an operational detail: the previous alerts had gone to a channel, and a channel at two in the morning is a place alerts go to wait. Thresholds require two consecutive failures before paging, which removed the noise that had trained everyone to ignore them.

What it settled

What changed in the runbook

A homepage ping proves the web server is up and nothing else that matters.

Almost every outage that costs money leaves the web server answering, which is why the cheapest possible check is also the one that catches least.

The two-minute detection came from checking the flow that earns money, not the page that loads fastest.

Exercising the payment flow is what makes an expired key or a provider failure visible. Neither affects any page a ping would ever request.

An alert nobody receives is indistinguishable from no monitoring at all.

The escalation is the monitoring: detection at two minutes and delivery at nine in the morning is the same outcome as no detection at all.

The outage, minute by minute

Why the checkout failure was caught in under two minutes

Four moments from the weekend incident: a check fails, a second region confirms it, the alert rule fires, and a person is reached. The homepage stayed green through all of it. Switch tabs, or use the arrow keys once one is focused.

Incident 41 · first five minutes Homepage check: 200 OK the whole time
0m1m2m3m4m5m
Checkout · us-east
Checkout · us-west
On-call
1 of 2 Confirmed failure Alert rule fires Paged until acknowledged Next 3-min intervalDashed: 2 and 5 minutes · timings illustrative
Since first failed intentT+4:122:17:16 PM · Sat 09/05

The page reaches a named person, who acknowledges before the deadline

Paged
T+1:33 · push + SMS
Phone call
T+3:33 · no ack yet
Acknowledged
T+4:12 · Under 5 min

The page went to the primary on-call engineer with a 5-minute acknowledgement deadline, not to a channel. Had it passed, the secondary would have been paged next; it didn't, so step 2 was never needed.

Architecture

From a test order to the person who can fix it

The escalation is part of the monitoring, not an operational afterthought. A failure detected in two minutes and read at nine the next morning is the same outcome as no detection at all.

  1. 01 · Define
    Health definitionHomepage renders, product page returns real stock, checkout completes: three assertions, each attributed to the system that owns it.
  2. 02 · Probe
    Synthetic checkoutA real order on a dedicated test SKU every few minutes, against the live payment provider in test mode, then voided.
  3. 03 · Decide
    Alert ruleTwo consecutive failures before paging, with thresholds set from a month of existing traffic, never guessed.
  4. 04 · Route
    Escalation policyThe alert names the failing system and goes to a named responder, never into a channel where it waits until morning.
  5. 05 · Reach
    On-call engineerAn acknowledgment deadline on every step; if it passes, the page escalates to the next responder in a four-step chain.
So a dead checkout can’t hide

Real assertions, quiet thresholds, a person on the end

The payment path is exercised

The checkout probe runs a real order end to end against the live provider in test mode and voids it, so an expired key or a failing provider shows up, even though neither touches any page a ping would request.

Noise doesn't page anyone

Two consecutive failures are required before paging, and thresholds were set from a month of existing traffic. The false-page rules that had taught everyone to ignore alerts were retired.

A person is reached, or the next one is

Alerts go to a named on-call responder with an acknowledgment deadline and escalate to the next responder if it passes. A channel gets a copy, never the only copy.

Would your monitoring notice if checkout stopped taking payments? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.