Deep Dive · Issue 16
The price you see vs. the price you pay: how marketplaces handle search-vs-checkout consistency
Search shows one price, checkout charges another. The gap is built into the architecture, and checkout-time recalculation is the safety net.

The gap
Two systems, one price

Behind every marketplace search result sits a read-optimized display layer, and behind checkout sits a transactional layer. Price data flows between them through catalog, pricing, search index, cart, and checkout services. Every hop is a chance for drift.
43% of visitors go straight to the search bar, and the price they see there anchors their purchase decision. When that price doesn't match checkout, 48% of customers who abandon cite extra costs as too high. The gap between search and checkout is small in dollars and large in trust.
Every hop between catalog and checkout is a chance for the price to drift.
The read side
Pre-computing every possible price

In a microservice setup, the product service "does not execute any business logic; they only collect data." Denormalized copies get pushed downstream into a read store that search queries directly, accepting redundancy for fast filtering.
Three ways to put dynamic prices in search
Post-filtering after search works only under 1,000 records and breaks pagination. A middleware layer scales to 10,000 products but cannot sort by price. The third option pre-computes 10 to 20 prices per SKU so search can filter and sort natively.
Pre-computation is the recommended approach, but the architect flags the consistency risk: a price update may not propagate due to latency, so the old price lingers in search results.
The storage cost of pre-computation
Pre-computing 10 to 20 prices per product across customer groups, events, stores, zones, and discounts means the database may hold large volumes of price combinations that are never queried. The architect flags this as the accepted trade-off for enabling native filtering and sorting at any scale.
The reconciliation boundary
Checkout is where the price becomes real

Whatever search shows, the checkout API performs a full recalculation at transaction time. Salesforce CPQ describes the flow as "add, configure, price, validate, checkout," with mandatory pricing recalculations and transaction commits at the final step.
Crystallize's hydrate mutation takes only SKU and quantity, and the server computes net price, gross price, tax, discounts, and totals at 4-decimal precision. The cart object exposes isStale and isExpired booleans so the frontend can trigger a re-hydration pass before checkout. Shopify makes carts ephemeral by design: once an order is created, the cart is deleted.
Checkout does not trust the price it receives from the display layer. It recomputes from the source of truth, and the customer pays the recomputed price regardless of what search showed.
What the hydrate call sends
Price context at hydration includes whether taxes are included (B2C vs B2B), currency, selected price variant identifier, compare-at variant, and fallback variant identifiers in priority order. The server uses this context to compute the final price server-side, removing pricing logic from the frontend entirely.
The tradeoff
Why the gap is designed in

System designers explicitly apply CAP theorem to this split. Search must be highly available: if search goes down, nobody can find products, so it serves slightly stale data in exchange for always being responsive. The target is 200ms search latency for 10M monthly active users. Payment and inventory management prioritize consistency: incorrect charges or overselling are worse than a brief outage.
Search layer
High availability, 200ms, stale OK
Checkout layer
High consistency, full recompute
When a price changes upstream, the update propagates through Kafka events to the search index. The inherent latency is why "the old price is showing in the search results until you implement extra strategies". Checkout-time recalculation is the safety net that makes this trade-off workable.
Search can be eventually consistent because checkout is strongly consistent.
Closing
The price is always recomputed
Why it matters
The search-vs-checkout price gap is a structural property of partitioned commerce systems. Marketplaces accept that search will sometimes show a stale price because making search both instant and always-correct would mean giving up the availability that most visitors depend on. The checkout layer absorbs the inconsistency by recomputing everything at the transaction boundary, so the charge is always correct even when the search result that started the journey was not.
The short version
- Search and checkout are separate systems with different consistency guarantees; price data drifts between them.
- Marketplaces pre-compute 10 to 20 prices per SKU and store them denormalized so search can filter and sort natively.
- Checkout APIs perform a full price recalculation at transaction time, ignoring what the search layer displayed.
- CAP partitioning lets search be eventually consistent (200ms, high availability) while checkout is strongly consistent.
- The gap between what you see and what you pay is the accepted cost of a responsive search layer.
Sources
- 1.Ecommerce Architecture: The Ultimate Guide for 2026 (Frameworks, Costs & Checklists) | RBMSoft
- 2.Scalable E-Commerce Architecture - Part 1: Inventory, Product and Search - DEV Community
- 3.✅ System Design 3: E-Commerce Platform like Amazon / Flipkart Architecture Design | HLD / LLD
- 4.Ecommerce Checkout: 10 Best Practices for 2024 | Salesforce AP
- 6.Checkout Items in Cart | Configure, Price, Quote (CPQ) Cart APIs | Communications, Media, Energy and Utilities APIs (Managed Package) | Salesforce Developers
- 7.Checkout Flow Tutorial
- 9.Request For Comment: Transitioning from Checkout to Cart · Shopify/storefront-api-feedback · Discussion #225 · GitHub