Failure & Scale Scenarios
How each failure mode manifests, its customer/business impact, how it's detected, how the system behaves safely in the moment, how it recovers, and how it's prevented going forward -- from payment/order races and reservation edge cases through event delivery, fulfillment, reconciliation, flash-sale overload and regional failure.
Payment Succeeds, Order Creation Fails
The payment provider confirms a charge, but the local order-creation step fails before it's durably recorded.
Customer/business impact
A charge exists with no matching order -- the worst-case customer experience if not resolved: money taken, nothing purchased.
Detection
A stable checkout/payment reference created before the payment attempt lets this be found -- via the payment provider's webhook, a status query, or reconciliation, rather than depending on the crashed request thread.
Safe behavior
Do not blindly create an arbitrary new order. Retry order creation using the same durable checkout/order identity that was created before the payment attempt (see Complete Design's baseline ordering) -- this is why creating a durable pending order/checkout identity before calling the provider matters.
Recovery
If retries succeed, the order is created/confirmed against the existing identity. If the database was unavailable for an extended period, reconciliation detects the payment with no associated confirmed order and completes it retroactively.
Prevention
Always create the durable checkout/order identity before the payment attempt (see Trade-offs & Decisions -> Order-Before-Payment vs. Order-After-Payment), so recovery has a stable anchor to resume against.
Inventory Reserved, Payment Definitively Fails
Inventory is successfully reserved. The payment is definitively declined or rejected -- not ambiguous, a real business decline.
Customer/business impact
None if handled correctly -- the reservation is released and the SKU becomes available again for other shoppers.
Detection
The payment provider returns a definitive failure/decline response.
Safe behavior
Transition the order to a payment-failed state and trigger the compensating release of the inventory reservation.
Recovery
The compensating release call runs idempotently; if it fails, reservation expiry provides a backstop so the unit doesn't stay held indefinitely (see Reservation Release Failure below).
Prevention
Reservation TTL/expiry is a required correctness backstop, not a luxury -- without it, a crashed compensation step leaves inventory permanently held.
Payment Unknown, Reservation Nearing Expiry
Payment times out and remains ambiguous. The reservation is approaching its expiry window. This is the most important edge case in the whole design -- do not immediately release merely because payment timed out.
Customer/business impact
If the reservation is released and the payment later turns out to have succeeded, the customer was charged for an item no longer reserved for them -- a much worse outcome than a slightly longer hold.
Detection
The order sits in PAYMENT_PENDING/UNKNOWN as the reservation's expires_at approaches.
Safe behavior
Do not release on timeout alone. Apply an explicit bounded policy: extend the reservation while payment resolves, or -- if it must expire before resolution -- define a later-success recovery/refund path in advance rather than discovering the gap after the fact.
Recovery
Payment resolves (via webhook, status query, or reconciliation) to either success or definitive failure. If it resolves to success after the reservation already expired, recovery re-attempts allocation or falls back to the pre-defined refund path if the unit is no longer available.
Prevention
Design the reservation-extension and later-success-recovery policy before launch, not as an incident response the first time it happens. See the Payment System module for how the payment side classifies and resolves ambiguous outcomes.
Search Index Stale / Indexing Backlog
The indexing pipeline lags or backs up. Search results show outdated product information -- a stale price, a since-disabled product, an incorrect availability signal.
Customer/business impact
A shopper may see an outdated price or an unavailable product in search results. This is a discovery-quality issue, not a checkout-correctness issue.
Detection
Indexing-lag metric breaches its SLO; a backlog of unprocessed catalog-change events grows.
Safe behavior
Continue serving the stale index for discovery -- the catalog database remains authoritative. Checkout always revalidates current price and availability regardless of what search displayed, so stale search data cannot cause an oversell or a wrong charge.
Recovery
The indexing pipeline drains the backlog once its dependency (indexer capacity, index cluster health) recovers.
Prevention
Monitor and alert on indexing lag against its own SLO (see Architecture Deep Dive -> Search Read Model), independent of checkout-path health metrics.
Queue Backlog During High Volume
A flash sale produces confirmed orders faster than fulfillment (or another consumer) can process them. The backlog grows.
Customer/business impact
Checkout confirmation is unaffected -- customers get their order confirmation immediately. Fulfillment is delayed, not lost.
Detection
Consumer lag and backlog-depth metrics on the fulfillment/notification queues.
Safe behavior
Let the backlog absorb the burst within its retention window rather than forcing more throughput than the true downstream bottleneck allows. This is graceful degradation, not automatically harmless -- a severe enough backlog can breach fulfillment SLOs, exceed broker storage/retention limits, or exceed operational capacity, and needs its own alerting and admission/degradation policy rather than being assumed safe by default.
Recovery
As traffic normalizes, the backlog drains; if fulfillment SLOs are breached, proactively communicate delay to affected customers.
Prevention
Define backlog alert thresholds and a degradation policy ahead of the next expected traffic spike, not as an ad hoc reaction during one.
Catalog Cache Failure
The product cache becomes fully unavailable. All catalog reads fall through to the database at once.
Customer/business impact
Catalog browsing is slower, not incorrect. Inventory, checkout and orders are unaffected -- they never depended on the product cache.
Detection
Cache health checks/connection errors; a sudden spike in catalog DB read traffic and latency.
Safe behavior
A circuit breaker, request coalescing, and rate limiting in front of the catalog DB prevent the full-miss traffic from overwhelming it. Do not assume the database can automatically absorb a jump from a typically low miss rate to 100% traffic -- that assumption is exactly what a circuit breaker and load-shedding policy exist to protect against.
Recovery
Once the cache recovers, hit rate returns to normal and DB load drops back down; no data reconciliation is needed since the cache was never authoritative.
Prevention
Load-test the catalog DB against a simulated full cache-miss burst ahead of time, and size the circuit breaker/rate limiter against that measured capacity rather than an assumed one.
Catalog Cache Stampede
A hot product's cache entry expires under heavy concurrent read load -- many requests miss at the same instant and hit the database simultaneously.
Customer/business impact
A brief latency spike or elevated error rate for that specific product's page, potentially cascading to the catalog DB if many hot keys expire near-simultaneously.
Detection
A spike in DB load correlated with a specific cache key's TTL expiry, or generally with periodic bulk cache warm-up/expiry cycles.
Safe behavior
Request coalescing/single-flight (only one request repopulates the cache while others wait for that result) prevents the thundering herd; TTL jitter avoids many hot keys expiring in the same instant; stale-while-revalidate serves the slightly-stale value while a single request refreshes it in the background.
Recovery
The cache repopulates after the single coalesced request completes; load returns to normal immediately.
Prevention
Apply TTL jitter and single-flight/coalescing specifically to known hot products, not just uniformly low-traffic ones.
Duplicate Checkout Request
A client retries Place Order -- a double-click, a network retry, or an at-least-once client-side delivery.
Customer/business impact
Without protection: a duplicate order, a duplicate reservation, or a duplicate charge.
Detection
The retried request carries the same checkout idempotency identity as the original.
Safe behavior
Resolve the duplicate against the durable checkout/order identity and return the same logical checkout/order -- no second reservation, no second order, no second payment attempt.
Recovery
No repair action needed -- this is the expected, correct behavior of a properly built idempotent checkout path.
Prevention
See Architecture Deep Dive -> Checkout Idempotency for the durable identity and fingerprint mechanism that makes this a non-event.
Orchestrator Crash After Reservation Succeeds
Inventory reservation succeeds, but the checkout orchestrator crashes before persisting the next workflow step.
Customer/business impact
None if recovery works correctly -- the reservation already exists durably and is not lost.
Detection
A resumed orchestrator (or a workflow-age monitor) finds a checkout stuck before the expected next transition.
Safe behavior
On resume, the orchestrator discovers the existing ACTIVE reservation (via the durable checkout/reservation identity) rather than attempting a second reservation, and continues the saga from that point.
Recovery
The saga proceeds to the payment step using the already-reserved inventory; if the checkout never resumes, reservation expiry eventually releases it.
Prevention
Every workflow step must be durably recorded before triggering the next one, so a crash always leaves a resumable state -- see Architecture Deep Dive -> Checkout Orchestration.
Reservation Release Call Fails
Payment definitively fails, and the compensating inventory-release call itself fails.
Customer/business impact
The unit stays reserved and unavailable to other shoppers longer than it should, if the compensating release isn't retried.
Detection
The release call returns an error, or the reservation's state doesn't transition as expected after the compensation step ran.
Safe behavior
Retry the release idempotently. Do not assume the compensation succeeded merely because it was invoked -- see Architecture Deep Dive -> Checkout Compensation.
Recovery
If retries also fail, reservation expiry (TTL) is the backstop that eventually releases the unit; reconciliation detects any reservation that stayed ACTIVE despite its order reaching a terminal failed/cancelled state.
Prevention
Never rely on a single invocation of a compensating action succeeding -- always pair it with a durable retry policy and a TTL-based backstop.
Reservation Expiry Races with Confirmation
Payment confirmation and reservation expiry happen at nearly the same instant -- both attempt to transition the same reservation.
Customer/business impact
Without protection: the reservation could be simultaneously committed (sold) and expired (released), an internally inconsistent state that risks oversell or a confirmed order with no backing stock.
Detection
A conditional/versioned state transition on the reservation record rejects one of the two concurrent attempts.
Safe behavior
Use a conditional state transition (WHERE state = 'ACTIVE' AND version = expected) for both the commit path and the expiry path, so only one of them can win -- the loser's caller (confirmation flow or expiry scan) handles the rejection explicitly rather than assuming success.
Recovery
If expiry wins and payment later confirms as successful, the order falls back to the payment-unknown/reservation-expiry recovery policy (see above) rather than silently confirming against a reservation that no longer exists.
Prevention
Never implement commit and expiry as unconditional writes -- both must go through the same guarded, versioned transition.
Price Changes During Checkout
The price changes between when the cart displayed it and when checkout resolves an authoritative quote.
Customer/business impact
If unhandled: the customer is silently charged a different amount than what they saw, damaging trust.
Detection
The checkout quote's price/version differs from the cart's displayed-price snapshot.
Safe behavior
Surface the change to the customer and require acceptance according to product policy before completing the charge -- never silently charge the stale or the new value without acknowledgment.
Recovery
The customer accepts the new terms and checkout proceeds with the current quote, or declines and the checkout is abandoned without a charge.
Prevention
See Architecture Deep Dive -> Pricing Architecture for the display-price vs. checkout-quote vs. order-line-snapshot model that makes this detectable in the first place.
Product Disabled During Checkout
A product or SKU is disabled/delisted (recalled, discontinued, seller removed) while it's sitting in a shopper's cart or mid-checkout.
Customer/business impact
Without revalidation, a shopper could complete a purchase of an item the business no longer intends to sell.
Detection
Checkout's purchasability check against current catalog/SKU status finds the item disabled.
Safe behavior
Reject that line item at checkout with a clear message, rather than trusting the cart's earlier snapshot of purchasability.
Recovery
The shopper removes the item and continues with the rest of the cart, or the checkout is abandoned.
Prevention
Always revalidate purchasability (not just price and availability) at checkout -- a cart is intent captured at an earlier point in time, never a guarantee.
Order DB Commits, Event Publish Fails
The order database commits the CONFIRMED transition, but the direct publish call to the broker fails or the process crashes before it happens.
Customer/business impact
Without an outbox, fulfillment and notification never receive the event -- the order is confirmed and paid, but nothing downstream happens.
Detection
With a transactional outbox: outbox-lag monitoring surfaces unpublished rows directly. Without one: this may only surface when a customer notices a missing shipment.
Safe behavior
Use a transactional outbox so the event's existence is guaranteed by the same transaction that committed the order state -- the publish gap becomes a bounded relay-lag problem to monitor, not a silent event loss.
Recovery
The outbox relay retries publishing the unpublished row until the broker acknowledges it.
Prevention
Do not rely on a direct publish-after-commit call for anything downstream treats as consequential. See Architecture Deep Dive -> Transactional Outbox and Trade-offs & Decisions -> Direct Publish vs. Transactional Outbox.
Duplicate order.confirmed Event
The outbox relay (or any at-least-once publisher) delivers the same order.confirmed event to a consumer more than once.
Customer/business impact
If the fulfillment consumer isn't idempotent: a duplicate shipment. If the notification consumer isn't idempotent: a duplicate confirmation email.
Detection
The event carries a stable event/order/business-operation identity the consumer checks against its own already-processed record.
Safe behavior
Each consumer deduplicates or makes its own operation idempotent using that stable identity before applying its effect.
Recovery
No system-level recovery needed -- this is expected steady-state behavior of a correctly built consumer under at-least-once delivery.
Prevention
Design every downstream consumer to be idempotent from the start -- see Architecture Deep Dive -> Event Consumer Idempotency.
Out-of-Order Order Events
Events for the same order arrive out of the order they were produced -- for example, a cancellation event delivered before the confirmation event it should follow.
Customer/business impact
Applying events blindly in arrival order could confirm fulfillment for an order that was actually cancelled, or vice versa.
Detection
A consumer checks the incoming event's implied transition against the order's current recorded state/version.
Safe behavior
Consumers use state/version semantics rather than blindly applying events in arrival order -- an event proposing an invalid transition for the order's current state is rejected or deferred, not applied.
Recovery
The rejected/deferred event is logged for observability; if it represents a genuine gap, reconciliation surfaces it.
Prevention
Never assume in-order delivery from a message broker without an explicit ordering key or a guarded consumer-side transition check.
Fulfillment Service Outage
The fulfillment service or its downstream warehouse system becomes unavailable.
Customer/business impact
Orders remain confirmed and paid; new orders continue to be accepted. Fulfillment is delayed, not lost -- customers experience a shipping delay, not a checkout failure.
Detection
Fulfillment consumer lag and error-rate metrics; a growing backlog of unprocessed order.confirmed events in the outbox/broker.
Safe behavior
The outbox/broker retains the work durably; checkout and order confirmation continue independently of fulfillment's health.
Recovery
Once fulfillment recovers, it drains the backlog; if the outage was long enough to breach fulfillment SLOs, proactively communicate delay to affected customers.
Prevention
If capacity/backlog limits are exceeded for a sustained period, the business may need to throttle new order acceptance for affected categories rather than accept orders it can't fulfill in a reasonable time -- this is a product/ops decision, not an automatic architectural default.
Duplicate Shipment Risk
A fulfillment command is redelivered (retry, at-least-once redelivery) after it already created a shipment.
Customer/business impact
Without protection: two shipments and two shipping labels for one order line -- a real cost and a confusing customer experience.
Detection
The redelivered command carries the same business idempotency key (order_id + fulfillment_operation) as an already-processed one.
Safe behavior
The fulfillment workflow recognizes the existing shipment for that key and returns/no-ops rather than creating a second one.
Recovery
No repair needed if idempotency held; if a duplicate slipped through before this was in place, it needs manual reconciliation with the carrier and a customer-facing correction.
Prevention
See Architecture Deep Dive -> Event Consumer Idempotency and Fulfillment Workflow -- every command that creates a physical, costly side effect needs this discipline.
Hot-SKU Contention
One SKU receives a huge volume of concurrent reservation attempts -- far beyond what horizontal API scaling can help with.
Customer/business impact
Elevated latency and reservation-failure rate specifically for that SKU's checkout path, even while the rest of the platform is healthy.
Detection
Reservation conflict/failure-rate metric spikes for one specific SKU, disproportionate to overall traffic.
Safe behavior
Scaling the stateless Inventory Service does not remove contention on the underlying storage row/partition for that one SKU -- see Architecture Deep Dive -> Flash-Sale Hot-SKU Contention for the serialization/partitioning/admission-control responses.
Recovery
Contention subsides once the SKU sells out (fail fast on 'sold out' to stop further doomed attempts) or the sale event ends.
Prevention
For known high-demand launches, apply admission control or serialized processing proactively rather than discovering the hot-key bottleneck during the event.
Flash-Sale Overload
A flash sale drives simultaneous load spikes across catalog, checkout, inventory, payment and the broker -- each needs its own protection, not one shared fix.
Customer/business impact
Without independent protection, one overloaded component (e.g. the payment provider rate-limiting the platform) can cascade into failures elsewhere (checkout timeouts, retry storms on inventory).
Detection
A dashboard tracking each layer's load independently: catalog/cache hit rate, checkout admission rate, inventory reservation conflict rate, payment provider latency/rate-limit responses, broker/outbox backlog depth.
Safe behavior
Protect each layer independently: CDN/cache absorb browse traffic; bounded concurrency and admission control protect checkout and the payment provider; the broker/outbox absorbs backlog within retention limits. Shed nonessential features (recommendations, reviews, personalization) before shedding checkout correctness.
Recovery
Each layer recovers independently as load subsides; backlogs drain within their retention windows.
Prevention
Load-test each layer against a realistic flash-sale traffic shape ahead of a known high-traffic event, not just the platform in aggregate.
Bot Traffic During High-Demand Launches
Automated clients attempt to acquire a disproportionate share of scarce inventory during a high-demand launch.
Customer/business impact
Legitimate shoppers can be crowded out of scarce inventory by automated purchasing at a scale humans can't match.
Detection
Request-pattern anomalies (velocity, timing precision, header/behavior fingerprints) feeding into rate limiting and admission control.
Safe behavior
Rate limiting and admission/fairness policy at a conceptual level -- this module does not attempt to teach a full anti-bot security system.
Recovery
N/A at the architectural level covered here -- specific mitigation is a product/security team responsibility beyond this module's scope.
Prevention
Combine rate limiting, admission control, and a waiting room where fairness is a hard product requirement (see Trade-offs & Decisions -> Flash-Sale Admission Control).
Checkout Orchestrator Crash
The process running the checkout saga crashes at an arbitrary point mid-workflow.
Customer/business impact
None if recovery is correct -- the customer may experience a brief delay, but no duplicate charge, reservation, or order.
Detection
A checkout/workflow-age metric flags a saga that hasn't progressed within its expected time window.
Safe behavior
Resume from the last durably recorded state; every command in the saga (reserve, charge, confirm) is idempotent, so resuming and retrying the current step is always safe.
Recovery
The saga continues from where it left off, using the durable checkout identity to avoid re-doing already-completed steps.
Prevention
See Architecture Deep Dive -> Checkout Orchestration -- durable state before triggering each next step is what makes this recoverable by construction.
Order Database Failure
The order database becomes unavailable at various points in the checkout sequence.
Customer/business impact
Depends on when: before any durable order/checkout identity exists, the safest response is to reject cleanly rather than proceed toward a payment attempt with nothing durable to anchor recovery to.
Detection
Database connection errors/timeouts from the order-write path.
Safe behavior
No confirmation is issued until the required durable order state actually exists. Never call the payment provider before a durable checkout/order identity has been committed.
Recovery
Once the database recovers, checkout can proceed normally; any in-flight attempt that failed before creating a durable identity is simply retried as a new attempt.
Prevention
Treat 'durable identity exists before any external side effect' as an absolute ordering rule, not a best-effort guideline.
Payment/Order Mismatch
The payment record and the order record disagree -- paid-but-unconfirmed, or confirmed-without-valid-payment-evidence.
Customer/business impact
Paid-but-unconfirmed risks the order never being fulfilled despite a successful charge; confirmed-without-payment-evidence risks fulfilling an order that was never actually paid for.
Detection
Reconciliation's comparison step between payment state and order state for the same checkout identity.
Safe behavior
Do not resolve by guessing -- use the payment system's own authoritative status (via status query or webhook) as the source of truth for what actually happened financially, and drive the order transition off that.
Recovery
Reconciliation completes the missing order confirmation, or flags the confirmed-without-payment case for review/cancellation depending on product policy.
Prevention
Track payment/order mismatch rate as an observability metric -- a sustained rate is a leading indicator of a systemic integration issue between the checkout saga and the payment system.
Inventory/Order Mismatch
The inventory reservation state and the order state disagree -- a confirmed order with no committed reservation, or a committed reservation with no confirmed order.
Customer/business impact
A confirmed order without a committed reservation risks fulfilling an order for stock that was never actually allocated to it -- a hidden oversell.
Detection
Reconciliation's cross-check between order state and reservation state for the same checkout identity.
Safe behavior
Flag the discrepancy rather than silently confirming fulfillment; depending on severity, this may require quarantining the order for manual review rather than auto-repairing.
Recovery
Reconciliation either recreates the missing committed reservation (if stock still allows it) or escalates for manual resolution (if it doesn't).
Prevention
Ensure the checkout saga always commits the reservation and confirms the order within the same guarded transition sequence -- see Architecture Deep Dive -> Order Reconciliation for the full discrepancy list this sweep should check.
Cancellation Races with Shipping
A customer requests cancellation at nearly the same moment the fulfillment workflow ships the order.
Customer/business impact
Without a guard, the system could accept a cancellation for an order that's already physically shipped, creating a confusing customer experience and a costly reverse-logistics problem.
Detection
The cancellation request checks the order/fulfillment state at the moment it's processed, not the state the customer saw when they clicked cancel.
Safe behavior
A conditional transition determines whether cancellation is still allowed given the fulfillment state at that instant; if fulfillment has already progressed past the cancellable point, route the request to the return/refund-after-shipment path instead.
Recovery
The customer is informed the item already shipped and offered the return workflow instead of a cancellation.
Prevention
See Architecture Deep Dive -> Cancellation, Returns & Refunds -- the eligibility check must be conditional on current state, not the state at the time the customer initiated the request.
Refund Failure
An order is cancelled, but the associated refund fails, times out ambiguously, or is delayed.
Customer/business impact
The customer's order shows CANCELLED while their money hasn't actually been returned -- a real financial impact if not tracked to resolution.
Detection
The refund's own state (owned by the Payment System) remains pending/failed/ambiguous past its expected resolution window.
Safe behavior
Never report a cancellation as financially complete until the refund state actually resolves -- order=CANCELLED and refund=SUCCEEDED are independent facts. Surface refund status to the customer separately from order status.
Recovery
The refund resolves through the Payment System's own ambiguous-outcome handling (retry, status query, webhook, reconciliation) -- see the Payment System module for the full mechanics.
Prevention
Never collapse order cancellation and refund completion into one status field -- track them as separate, independently observable state machines.
Regional Failure
An entire region hosting part of the platform becomes unavailable -- the hardest scenario here, since ownership and fencing questions touch checkout, inventory and orders simultaneously.
Customer/business impact
Ambiguous in-flight checkouts during the failover window carry the same double-reservation/double-charge risk as any other ambiguous outcome, now compounded by the question of which region has write authority for a given SKU's inventory or a given order.
Detection
Regional health checks and failover automation; defined RPO/RTO targets for the inventory and order stores.
Safe behavior
Define, ahead of any failure, which region owns write authority for a given SKU's inventory and for a given in-flight checkout, and how idempotency uniqueness is preserved across regions so the same checkout identity can't be double-honored in two regions at once.
Recovery
Failover promotes a standby region using the same fencing discipline as any single-leader failover, so the original region cannot resume writing unexpectedly after recovering; in-flight checkouts are resolved via the same ambiguous-outcome and reconciliation mechanisms used for any other unresolved attempt.
Prevention
Treat multi-region active-active inventory as an advanced extension to design deliberately, not a casual default -- and rehearse the failover path before it's needed for real.
Triage by scenario family
| Family | Scenarios | Core response |
|---|---|---|
| Payment and checkout correctness | 01, 02, 03, 08, 12, 13, 23, 24, 25 | Durable checkout/order identity before payment; idempotent saga steps; payment status as source of truth; never release on timeout alone; revalidate price and purchasability at checkout |
| Inventory and reservation | 09, 10, 11, 19, 20, 26 | Resume against the existing ACTIVE reservation; idempotent release; conditional transition so expiry and commit cannot both win; never grant a reservation from a cached count; flag inventory/order mismatches |
| Events and fulfillment | 05, 14, 15, 16, 17, 18 | Transactional outbox; consumer idempotency and state/version checks; durable retention while fulfillment is down; backlog is absorbed within retention limits |
| Catalog, search and traffic | 04, 06, 07, 21, 22 | Stale search is fine because checkout revalidates; breaker, coalescing and jittered TTLs for cache failure; layered protection and admission control for flash sales and bots |
| Cancellation, refunds and region | 27, 28, 29 | Conditional cancel against fulfillment state; refund status reported separately from order status; pre-assigned write authority and fenced failover |
- 01Read the payment and checkout family first: money moves there, so every step needs a durable checkout/order identity created before the payment attempt and idempotent commands that are safe to resume.
- 02Authoritative inventory decisions never come from a cache; when the inventory store is unavailable, checkout pauses or fails rather than guessing.
- 03Make reservation expiry and confirmation compete through one conditional state transition so only one can win, and retry compensating releases idempotently.
- 04The outbox converts lost events into relay lag, and every consumer still deduplicates and checks state/version because delivery is at-least-once and unordered.
- 05Backlogs are graceful degradation only within retention and SLO limits; flash-sale protection is layered (CDN/cache, admission control, bounded concurrency, shedding nonessential features).
- 06Order status and refund status are independent facts; do not report a cancellation as financially complete until the refund resolves.