{"id":28987,"date":"2026-07-31T14:24:16","date_gmt":"2026-07-31T12:24:16","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=28987"},"modified":"2026-07-31T14:24:18","modified_gmt":"2026-07-31T12:24:18","slug":"reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/","title":{"rendered":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Abstract<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Index Terms<\/em>\u2014Payment processing, Ultra-large-scale systems, Distributed transactions, Fraud detection, Ledger systems<\/p>\n\n\n\n<h2 id=\"loc-1\" class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ride-hailing platforms such as Uber operate as two-sided marketplaces. They match riders who want a trip with drivers who provide it, and they earn revenue by taking a commission on every fare. Every completed ride therefore triggers a flow of money. The rider pays in, the driver is paid out, and the platform retains the difference as its commission. At first glance, this appears trivial. In practice, performing it correctly across billions of transactions, dozens of countries, and a multitude of payment methods and providers is one of the defining challenges of a ULSS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The difficulty lies not in a single algorithmic challenge but in the combination of scale, heterogeneity, and an unforgiving correctness requirement. Networks are unreliable, external providers fail or respond twice, and fraudsters actively attack the system. Unlike most application failures, a mistake in this domain creates, destroys, or misdirects real money. A defect rate that would be acceptable in most software becomes a systemic financial risk when multiplied by the transaction volume of a global platform.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Problem Statement<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The notion of a ULSS, as characterized by <a id=\"loc-2\" href=\"#loc-72\" role=\"doc-biblioref\">P. Feiler et al. [1]<\/a>, describes systems whose scale in code, data, users, and organizational scope exceeds what classical software engineering assumes. Control is decentralized, requirements are inherently conflicting, the system evolves continuously while it operates, its parts are heterogeneous, and failures are not exceptional events but the normal case <a href=\"#loc-72\" role=\"doc-biblioref\">[1]<\/a>. A global payment platform exhibits every one of these characteristics. No single party controls the system. Card networks, issuing banks, PSPs, regulators, and the platform itself each control a part of every transaction. Requirements conflict by design, as low checkout latency competes with strong consistency, and aggressive fraud prevention competes with conversion, because every additional verification step loses legitimate customers. The set of payment methods evolves continuously as regional schemes appear. The parts are highly heterogeneous, since every provider exposes different Application Programming Interfaces (APIs), semantics, and settlement timelines. At billions of requests, moreover, network partitions, provider outages, and duplicated messages are everyday events that the architecture must absorb rather than treat as exceptions. The mechanisms presented in this paper (gateway abstraction, tiered consistency, reconciliation, and idempotency) are best understood as answers to precisely these ULSS characteristics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Goal<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The goal of this paper is to explain, in an end-to-end manner, how a ride-hailing platform moves money reliably at ULSS scale, and which architectural building blocks are required to do so. Rather than presenting a single component in isolation, we follow a payment through the entire system and use it to motivate each mechanism in turn. Uber serves as the paper\u2019s running case study, and we draw primarily on its publicly documented engineering practices.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Concretely, we aim to answer four questions.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>How is a single, user-friendly checkout built on top of many heterogeneous payment methods and PSPs (<a href=\"#loc-25\">Section&nbsp;III<\/a>)?<\/li>\n\n\n\n<li>How does the platform defend itself against fraud that the individual providers cannot see (<a href=\"#loc-34\">Section&nbsp;IV<\/a>)?<\/li>\n\n\n\n<li>How does it keep financial records balanced and traceable, and detect discrepancies under partial failures (<a href=\"#loc-42\">Section&nbsp;V<\/a>, <a href=\"#loc-50\">Section&nbsp;VI<\/a>, and <a href=\"#loc-55\">Section&nbsp;VII<\/a>)?<\/li>\n\n\n\n<li>How does it ensure that every payment instruction is executed exactly once despite an unreliable network (<a href=\"#loc-60\">Section&nbsp;VIII<\/a>)?<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Requirements and Structure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">From the marketplace model we can derive a list of requirements that structures the remainder of this paper. A ULSS payment platform must <span id=\"loc-3\"><\/span>(i) support a large and changing set of international and regional payment methods, <span id=\"loc-4\"><\/span>(ii) actively prevent fraud, <span id=\"loc-5\"><\/span>(iii) keep financial records balanced and traceable, <span id=\"loc-6\"><\/span>(iv) coordinate transactions that span many distributed services, <span id=\"loc-7\"><\/span>(v) reconcile its own record of transactions against external providers, and <span id=\"loc-8\"><\/span>(vi) execute each payment exactly once. This paper treats these requirements at the level of application and data architecture. Transport security, workload identity, and the platform\u2019s broader security posture are a separate concern and fall outside this scope, as do detailed cost modeling, individual PSP contract terms, and tax handling. The following sections address these requirements in this order, except that <a href=\"#loc-6\">(iv)<\/a> is treated alongside <a href=\"#loc-5\">(iii)<\/a> in <a href=\"#loc-42\">Section&nbsp;V<\/a>, since coordinating a payment across services and keeping its record correct are two aspects of the same problem. <a href=\"#loc-70\">Section&nbsp;IX<\/a> then examines design decisions that a platform at a different scale might reasonably make differently.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related Work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#loc-1\">Section&nbsp;I<\/a> grounds this paper in the foundational characterization of ULSSes by <a href=\"#loc-72\" role=\"doc-biblioref\">P. Feiler et al. [1]<\/a>. This section positions the paper against three adjacent bodies of literature that directly inform the architectural requirements of a global payment platform, covering transaction coordination across service boundaries, application-level correctness over unreliable networks, and payment security alongside real-time fraud screening.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bounded Atomicity and Saga Coordination<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Classical database systems relied on centralized transaction managers to enforce Atomicity, Consistency, Isolation, Durability (ACID) guarantees across data operations <a id=\"loc-9\" href=\"#loc-73\" role=\"doc-biblioref\">[2]<\/a>. In distributed microservice architectures, however, maintaining atomic commitment across independent service boundaries introduces severe availability risks. <a id=\"loc-10\" href=\"#loc-74\" role=\"doc-biblioref\">D. Skeen [3]<\/a> demonstrated the fundamental blocking constraints of multi-site commit protocols under network partitions, proving that synchronous atomic commitment compromises system availability during site failures. Bounding atomicity to isolated domain entities was further formalized by <a id=\"loc-11\" href=\"#loc-75\" role=\"doc-biblioref\">P. Helland [4]<\/a> and evaluated for modern microservices by <a id=\"loc-12\" href=\"#loc-76\" role=\"doc-biblioref\">N. Dragoni et al. [5]<\/a>, who argued that ULSSes must abandon cross-service database transactions and instead manage consistency through entity-scoped operations and asynchronous messaging.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To coordinate multi-service workflows without distributed locks, architectures at scale draw on long-running transaction models. <a id=\"loc-13\" href=\"#loc-77\" role=\"doc-biblioref\">H. Garcia-Molina and K. Salem [6]<\/a> introduced the saga pattern, demonstrating that a long-running distributed operation can be decomposed into a sequence of local transactions where each step is paired with a compensating action. This makes saga orchestration an important mechanism for financial workflows in particular, since a payment routinely spans exactly this kind of long-running, multi-service process. External services carry out these compensating actions, while double-entry bookkeeping provides an auditable record of their financial effects. Gulfstream (<a href=\"#loc-42\">Section&nbsp;V<\/a>) and LedgerStore (<a href=\"#loc-50\">Section&nbsp;VI<\/a>) apply these ideas by restricting zero-sum invariants to individual order entities <a id=\"loc-14\" href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a> and managing storage writes through intent-then-commit protocols <a id=\"loc-15\" href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>.<\/p>\n\n\n\n<h3 id=\"loc-16\" class=\"wp-block-heading\">End-to-End Correctness over Unreliable Networks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Executing money movements across distributed components requires handling network partitions, message loss, and duplicated requests. <a id=\"loc-17\" href=\"#loc-80\" role=\"doc-biblioref\">J. H. Saltzer, D. P. Reed, and D. D. Clark [9]<\/a> established the end-to-end argument in system design, showing that critical reliability functions cannot be completely satisfied by underlying network transport layers. Correctness must ultimately be guaranteed at the application endpoints. Modern payment platforms reflect this principle by enforcing exactly-once processing through application-level idempotency keys and structured retry budgets (<a href=\"#loc-60\">Section&nbsp;VIII<\/a>) rather than relying on transport acknowledgments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Theoretical limits on network communication further dictate what a distributed payment architecture can guarantee. <a id=\"loc-18\" href=\"#loc-81\" role=\"doc-biblioref\">E. A. Akkoyunlu, K. Ekanadham, and R. V. Huber [10]<\/a> proved that two parties cannot achieve guaranteed state agreement over an unreliable channel in a finite number of messages. <a id=\"loc-19\" href=\"#loc-82\" role=\"doc-biblioref\">M. J. Fischer, N. A. Lynch, and M. S. Paterson [11]<\/a> extended this result by showing that no deterministic consensus protocol can guarantee both safety and liveness in an asynchronous network if even a single process can experience an unannounced failure. Formalized as the Consistency, Availability, Partition Tolerance (CAP) theorem by <a id=\"loc-20\" href=\"#loc-83\" role=\"doc-biblioref\">S. Gilbert and N. Lynch [12]<\/a>, these constraints require large-scale systems to trade strict global consistency for high availability, settling for eventual consistency instead <a id=\"loc-21\" href=\"#loc-84\" role=\"doc-biblioref\">[13]<\/a>. Payment architectures address these theoretical bounds by employing tiered consistency models in storage (<a href=\"#loc-50\">Section&nbsp;VI<\/a>) and relying on asynchronous reconciliation (<a href=\"#loc-55\">Section&nbsp;VII<\/a>) as an external safety net.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Payment Security and Multi-Signal Fraud Detection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A third body of literature addresses the domain-specific challenges of payment security protocols and automated fraud detection. In payment security, <a id=\"loc-22\" href=\"#loc-85\" role=\"doc-biblioref\">S. Solat [14]<\/a> evaluated tokenization protocols that isolate sensitive primary account numbers from application backends, reducing regulatory compliance scope under standards such as Payment Card Industry Data Security Standard (PCI DSS) (<a href=\"#loc-70\">Section&nbsp;IX<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In fraud detection, <a id=\"loc-23\" href=\"#loc-86\" role=\"doc-biblioref\">S. Bhattacharyya et al. [15]<\/a> and <a id=\"loc-24\" href=\"#loc-87\" role=\"doc-biblioref\">A. Dal Pozzolo et al. [16]<\/a> examined machine learning methodologies for transaction streams characterized by extreme class imbalance and continuous concept drift. <a href=\"#loc-87\" role=\"doc-biblioref\">A. Dal Pozzolo et al. [16]<\/a> identified verification latency as a central challenge, where ground-truth fraud labels mature slowly because chargebacks surface weeks after the original transaction. Uber\u2019s Project RADAR (<a href=\"#loc-34\">Section&nbsp;IV<\/a>) addresses verification latency by structuring loss data along dual time dimensions and combining automated rule mining with human-in-the-loop analyst review.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While prior research has explored transaction theory, network reliability, and payment security alongside fraud detection as isolated topics, existing literature does not address how a global platform composes these mechanisms into one unified payment system. This paper provides that synthesis using Uber\u2019s documented engineering practices as a concrete case study.<\/p>\n\n\n\n<h2 id=\"loc-25\" class=\"wp-block-heading\">Payment Methods and PSP Integration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Requirement <a href=\"#loc-3\">(i)<\/a> is to support a large and continuously changing set of international and regional payment methods. The checkout must work globally while presenting each rider with locally relevant options. These include credit cards and digital wallets, deferred-payment schemes, and regional methods such as Single Euro Payments Area (SEPA) direct debit in Europe or Paytm<sup id=\"loc-26\" role=\"doc-noteref\"><a href=\"#loc-114\">1<\/a><\/sup> in India. Each method has its own semantics and settlement timeline, which is why the platform needs a common checkout interface that hides these differences <a id=\"loc-27\" href=\"#loc-88\" role=\"doc-biblioref\">[17]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Provider selection also affects processing cost. A PSP such as Stripe<sup id=\"loc-28\" role=\"doc-noteref\"><a href=\"#loc-115\">2<\/a><\/sup> or Adyen<sup id=\"loc-29\" role=\"doc-noteref\"><a href=\"#loc-116\">3<\/a><\/sup> can offer favorable rates while handling the underlying payment networks. A platform may instead connect directly to a card network or bank when its transaction volume makes the additional engineering and maintenance economical. A global platform can combine both approaches and select a route for each market and payment method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uber\u2019s payment platform demonstrates the number of integrations involved. By the end of 2018, it processed 14 million trips per day across 65 countries through 28 PSPs and 5 banks <a id=\"loc-30\" href=\"#loc-89\" role=\"doc-biblioref\">[18]<\/a>. Each integration requires contract negotiations, regulatory review, technical implementation, failure handling, and a gradual market-by-market rollout <a href=\"#loc-88\" role=\"doc-biblioref\">[17]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Payment Gateway and Provider Adapters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The platform-owned payment gateway forms the boundary between the rest of the platform and the provider landscape. It exposes a uniform internal API and routes each request to a PSP, a bank, or an internally operated digital wallet. Provider-specific adapters translate the gateway\u2019s canonical operations and result codes into the protocol and semantics of the destination. Other services depend on the gateway rather than on every individual integration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The gateway exposes four principal card operations. Authorize validates the card and reserves an amount without moving money, while capture converts an existing authorization into a charge up to the authorized amount. Void releases an authorization, whereas charge combines authorization and capture when no separate hold is needed <a href=\"#loc-88\" role=\"doc-biblioref\">[17]<\/a>. Calling services use these operations without implementing each provider\u2019s API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modern PSPs generally expose Representational State Transfer (REST)-APIs that exchange JavaScript Object Notation (JSON) and process individual transactions in near real time <a href=\"#loc-89\" role=\"doc-biblioref\">[18]<\/a>. Banks and older payment schemes may provide only batch integrations that exchange files through Secure File Transfer Protocol (SFTP) every few hours or once per day <a id=\"loc-31\" href=\"#loc-90\" role=\"doc-biblioref\">[19]<\/a>.<\/p>\n\n\n\n<h3 id=\"loc-32\" class=\"wp-block-heading\">Processing a Saved-Card Ride<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Consider how this gateway processes a ride paid with a saved credit card. Before the card can be used, the rider adds it and the PSP returns a token representing the stored card details. The Payments Profile Service (PPS) persists this token together with non-sensitive metadata such as the last four digits. Other platform services exchange the profile identifier or token rather than the raw card number. This separation reduces the platform\u2019s exposure to sensitive card data and its compliance scope <a href=\"#loc-85\" role=\"doc-biblioref\">[14]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Authorization and capture are separated because the final fare is not known when the trip begins. The flow therefore proceeds in three phases, of which <a href=\"#loc-33\" title=\"\">Fig.&nbsp;1<\/a> shows the second and third, in which the request leaves the platform for the provider.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the first phase, the app sends the ride request and selected payment-profile identifier to the backend. The backend loads the corresponding token and billing context from the PPS and creates a payment attempt for the estimated fare. Before any funds are reserved, the platform-wide risk engine (<a href=\"#loc-34\">Section&nbsp;IV<\/a>) may approve the attempt, decline it, or request additional verification. If the attempt is not approved, the app asks the rider to verify the transaction or choose another payment method <a href=\"#loc-88\" role=\"doc-biblioref\">[17]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">During authorization, the backend submits an authorization request for the estimated fare to the payment gateway. The gateway selects a route, and the corresponding adapter translates the canonical request into the chosen PSP\u2019s format. The provider carries the request through the card network to the issuing bank, which either declines it or places a hold on the rider\u2019s funds. On approval, the adapter normalizes the provider\u2019s response, the gateway returns it to the backend, and the ride is confirmed <a href=\"#loc-88\" role=\"doc-biblioref\">[17]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After the trip, the backend calculates the final fare and submits a capture against the existing authorization through the same gateway route. If the fare is lower than the estimate, only the lower amount is captured. The final fare can also exceed the original estimate, for instance when the trip takes a longer route than the one the estimate was based on, in which case the backend must place a supplementary authorization for the difference before it can capture the full amount. If the ride is canceled, the backend can void the hold instead. Once the PSP accepts the capture and queues it for clearing, the backend can issue the receipt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\" id=\"loc-33\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1008\" height=\"1024\" data-attachment-id=\"29093\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/auth-capture-sequence\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-scaled.png\" data-orig-size=\"2519,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}\" data-image-title=\"auth-capture-sequence\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;A saved-card payment routed through the platform&amp;#8217;s payment gateway. The gateway selects the provider and its adapter, which translates provider-specific requests and normalizes their results. The PSP is shown as encapsulating the acquiring side of the card network.&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png\" alt=\"\" class=\"wp-image-29093\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png 1008w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-295x300.png 295w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-768x780.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1511x1536.png 1511w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-2015x2048.png 2015w\" sizes=\"auto, (max-width: 1008px) 100vw, 1008px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 1: A saved-card payment routed through the platform&#8217;s payment gateway. The gateway selects the provider and its adapter, which translates provider-specific requests and normalizes their results. The PSP is shown as encapsulating the acquiring side of the card network.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The gateway hides provider interfaces but not their different timescales. A capture acknowledgement only means the PSP accepted the instruction, since clearing and settlement between financial institutions follow asynchronously, often overnight. The platform therefore treats the result as provisional until reconciliation (<a href=\"#loc-55\">Section&nbsp;VII<\/a>) compares its ledger with the provider\u2019s external record.<\/p>\n\n\n\n<h2 id=\"loc-34\" class=\"wp-block-heading\">Fraud Prevention<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Requirement <a href=\"#loc-4\">(ii)<\/a> calls for active fraud prevention. Every transaction that reaches the risk engine (<a href=\"#loc-32\">Section&nbsp;III.B<\/a>) is screened before any funds are reserved. This section examines the kinds of fraud a ride-hailing platform faces, why that screening cannot be delegated to the payment providers alone, and how Uber extends it from individual transactions to coordinated attacks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Threat Landscape<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">At a volume of millions of transactions per day, fraud is not an edge case but a systemic risk that costs money, time, and reputation. A ride-hailing platform faces several distinct attack patterns. Stolen cards are used to pay for rides, and when the legitimate cardholder disputes the charge, the platform still incurs the PSP\u2019s chargeback fee. Phantom rides are fabricated trips through which a driver collects a payout without providing a service. Coordinated attacks employ many accounts, often fully automated, acting in concert. In an account takeover, an attacker gains control of a legitimate account and abuses its stored payment methods. Promo abuse systematically exploits discounts and referral bonuses through multiple fake accounts. Uber reports encountering all of these patterns across its rides and delivery businesses <a id=\"loc-35\" href=\"#loc-91\" role=\"doc-biblioref\">[20]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why PSP Tools Are Insufficient<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">PSPs ship their own fraud-prevention tooling, such as Stripe Radar<sup id=\"loc-36\" role=\"doc-noteref\"><a href=\"#loc-117\">4<\/a><\/sup> or Adyen RevenueProtect<sup id=\"loc-37\" role=\"doc-noteref\"><a href=\"#loc-118\">5<\/a><\/sup>, which use machine learning to flag suspicious transactions <a id=\"loc-38\" href=\"#loc-92\" role=\"doc-biblioref\">[21]<\/a>. These tools are valuable but insufficient for a platform of Uber\u2019s scale, for three reasons.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>When the platform spreads traffic across several PSPs, no single provider sees the whole picture, so a fraudster who spreads activity across providers is hard to detect from any one vantage point.<\/li>\n\n\n\n<li>Relying on per-provider tooling adds external dependencies, per-transaction cost, and maintenance overhead for every integrated provider.<\/li>\n\n\n\n<li>Even sophisticated provider tooling does not automatically observe all platform-internal context. It can evaluate the payment data and contextual fields available through its integration, but cannot use information that the platform does not transmit <a id=\"loc-39\" role=\"doc-biblioref\" href=\"#loc-93\">[22]<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The platform, by contrast, directly controls first-party account, device, location, trip or order, and usage histories <a id=\"loc-40\" href=\"#loc-94\" role=\"doc-biblioref\">[23]<\/a>. These platform-specific and provider-level signals are therefore complementary. At Uber\u2019s scale it makes sense to operate a platform-wide risk engine rather than to rely on provider tooling alone.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A Platform-Wide Risk Engine<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The platform\u2019s own risk engine evaluates requests before deciding whether they may proceed. Its advantage is access to platform-specific context that is not necessarily transmitted to a PSP. Uber states that its fraud-prevention processes use account, device, location, trip or order, and usage data. The underlying data includes device identifiers, IP addresses, operating-system and mobile-network information, device-motion data, payment information, past trip statistics, and trip details such as time, route endpoints, distance, and order value <a href=\"#loc-94\" role=\"doc-biblioref\">[23]<\/a>. Uber further describes its automated fraud systems as monitoring location, payment, and usage information in real time and comparing it with historical information to identify suspicious behavior <a href=\"#loc-94\" role=\"doc-biblioref\">[23]<\/a>. A PSP may receive some of these fields and contribute valuable payment-network signals of its own, but it cannot evaluate platform context that is not included in the integration <a href=\"#loc-93\" role=\"doc-biblioref\">[22]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Based on these signals the engine chooses one of four responses <a id=\"loc-41\" href=\"#loc-95\" role=\"doc-biblioref\">[24]<\/a>, <a href=\"#loc-96\" role=\"doc-biblioref\">[25]<\/a>. Approve lets the transaction proceed normally. Step-up requires additional verification, such as a selfie or an Short Message Service (SMS) code, when confidence is moderate. Uber also uses penny drop verification when it suspects that a user does not own the card. It places two small random authorization holds on the card and asks the user to enter the amounts shown in their bank statement, giving a legitimate cardholder a way to prove ownership instead of being declined outright <a href=\"#loc-95\" role=\"doc-biblioref\">[24]<\/a>. Decline blocks a clear fraud case, and shadow mode logs a hypothetical decision without acting on it, letting engineers validate new models against real traffic before they can affect genuine users. The latter matters because the two error costs are asymmetric. A false negative costs the platform the fare, the chargeback fee, and standing with the card networks, while a false positive costs a paying customer who may not return. Because the risk engine sits in the synchronous authorization path of <a href=\"#loc-32\">Section&nbsp;III.B<\/a>, its decision must also fit within a strict latency budget, which is why such systems are typically built around dedicated low-latency feature stores.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Project RADAR<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Per-transaction scoring reacts to individual events, but large-scale fraud often arrives as coordinated attacks whose individual transactions may each look unremarkable. Uber\u2019s Project RADAR addresses fraud at the level of the attack rather than the transaction <a href=\"#loc-96\" role=\"doc-biblioref\">[25]<\/a>. RADAR targets two dominant payment-fraud outcomes for the platform. In the first, a completed trip\u2019s payment cannot be collected at all. In the second, a chargeback reverses a payment that was already collected, after the issuing bank sides with a dispute.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RADAR constructs features across these two dimensions by ingesting real-time transaction telemetry from streaming pipelines alongside historical data from analytical stores. Real-time signals capture immediate account and device patterns at order time, while delayed settlement updates refresh historical features as chargebacks mature over weeks <a href=\"#loc-96\" role=\"doc-biblioref\">[25]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RADAR\u2019s core is a time-series anomaly detector that forecasts expected fraud losses and raises an alarm when observed losses deviate from the forecast by more than normal variation would explain. Fraud data matures slowly, since a chargeback can surface weeks after the trip that caused it, the same verification-latency problem documented more broadly for card transactions <a href=\"#loc-87\" role=\"doc-biblioref\">[16]<\/a>. RADAR accounts for this by modeling the data along two time dimensions, the order time when the trip happened and the settlement maturity time when the payment outcome became known <a href=\"#loc-96\" role=\"doc-biblioref\">[25]<\/a>. Once an attack is detected, RADAR mines its transactions for common patterns in the categorical feature space and generates candidate blocking rules. These rules are not deployed automatically. They must meet high precision requirements and are reviewed by human analysts before Uber\u2019s rule engine pushes them to production <a href=\"#loc-96\" role=\"doc-biblioref\">[25]<\/a>. RADAR is thus deliberately a human-in-the-loop system, in which automation scales the detection while humans bound the consequences of the response.<\/p>\n\n\n\n<h2 id=\"loc-42\" class=\"wp-block-heading\">Double-Entry Bookkeeping<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Fraud prevention decides which transactions may proceed, but it says nothing about whether the transactions that do proceed are recorded correctly. Requirement <a href=\"#loc-5\">(iii)<\/a> addresses that correctness directly, beginning with how the books represent a single transaction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Double-entry bookkeeping most likely emerged in an early Florentine bank <a id=\"loc-43\" href=\"#loc-97\" role=\"doc-biblioref\">[26]<\/a>. Every account has a debit and a credit side, and every transaction touches at least two accounts such that the sum of all debits equals the sum of all credits. Money is therefore never created or destroyed within the books, but only moves between accounts. Entries, once written, are never modified. An error is corrected by an additional, compensating entry. These two properties, the zero-sum invariant and the append-only history, are exactly the guarantees a payment platform requires, which is why modern ledger services restate them as their core design principles <a id=\"loc-44\" href=\"#loc-98\" role=\"doc-biblioref\">[27]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uber\u2019s Gulfstream, the fifth generation of its collection and disbursement platform, enforces this invariant structurally <a href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a>. Gulfstream models a trip as a job with one or more orders, where each order consists of entries, and each entry describes one money movement between two accounts. The entries of an order must sum to zero, so the system cannot create or destroy money by construction. A trip with a fare of $18 and a service fee of $2, for example, forms one order with four entries. These are debits of $18 and $2 against the payer\u2019s escrow account, a credit of $18 to the payee\u2019s escrow account, and a credit of $2 to Uber\u2019s escrow account <a href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a>. Note that this example models the platform\u2019s share as a separate service fee, so the payee receives the full fare, whereas a commission model deducts the platform\u2019s share from the fare. Both structures satisfy the zero-sum invariant. Orders are furthermore immutable and are processed only after they have been durably persisted, which turns the bookkeeping rule against editing history into a storage-level guarantee. On this basis Gulfstream operates as a self-reconciling platform that serves around 18 million requests per day across more than 10,000 cities <a href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a>.<\/p>\n\n\n\n<h3 id=\"loc-45\" class=\"wp-block-heading\">Coordinating a Payment across Services<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The zero-sum invariant holds within one order, but confirming a trip touches many independently owned services, namely the payment profile, the risk engine, the collection path that charges the rider, and the disbursement path that pays the driver, each keeping its own state. A single database transaction spanning all of them is unavailable, and distributed transactions that hold locks across service boundaries are exactly what such architectures avoid, since a coordinator failure blocks every participant until it is resolved <a href=\"#loc-74\" role=\"doc-biblioref\">[3]<\/a>. <a href=\"#loc-75\" role=\"doc-biblioref\">P. Helland [4]<\/a> argues that systems at this scale should instead bound atomicity to a single owned entity and coordinate between entities by other means.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The saga pattern is that other means, expressing a long-running operation as a sequence of local transactions, each atomic within its own store and paired with a compensating transaction that semantically undoes it if a later step fails <a href=\"#loc-77\" role=\"doc-biblioref\">[6]<\/a>. A payment service compensates for a card charge by voiding or refunding it, and the ledger records the result with new balancing entries while preserving the originals as part of the audit trail. We interpret Gulfstream\u2019s documented structure through this pattern. A job groups the orders belonging to one trip, each order is a local unit whose entries sum to zero, and the order processor can produce successive orders and payment-result orders <a href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a>. Under this interpretation, requirement <a href=\"#loc-6\">(iv)<\/a> is answered at two levels, as the saga coordinates actions across services while the ledger records their financial effects. An intent-then-commit protocol, examined in <a href=\"#loc-50\">Section&nbsp;VI<\/a>, coordinates the write of a single order inside the store.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What a saga gives up is isolation. Its intermediate states are visible, so a trip can briefly appear collected on one side and unpaid on the other before a later step or its compensation completes. The platform tolerates this because the zero-sum invariant is checked over the settled result, not the intermediate one, and because reconciliation (<a href=\"#loc-55\">Section&nbsp;VII<\/a>) independently confirms the final state against the providers. Durability matters correspondingly. Gulfstream persists an order before processing it, separating the record of what must happen from the attempt to carry it out, so a crash between steps destroys neither the instruction nor the entries already written.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Consistency through Aggregation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The invariant scales from individual entries to aggregates. Over any set of trips, the total pay-in must equal the total pay-out plus the total commission. In accounting terms this is the classical trial balance check, in which the totals of all debit and credit balances must agree and any mismatch reveals an error in the books <a id=\"loc-46\" role=\"doc-biblioref\" href=\"#loc-99\">[28]<\/a>. <a href=\"#loc-48\" title=\"\">Table&nbsp;I<\/a> illustrates this for three example rides. The riders pay in 67.00\u20ac, the drivers receive 53.60\u20ac, and the platform retains 13.40\u20ac, so the books balance exactly. Any deviation implies that some party was paid incorrectly or that money appeared from nothing. If trip #2 were recorded with a pay-out of 28.50\u20ac instead of 28.00\u20ac, for example, the totals would disagree by 0.50\u20ac and immediately expose the defective entry. Because the check is a plain summation, it can be evaluated at any granularity, whether per trip, per day, or per market, and thus doubles as an operational monitoring signal, in which a non-zero difference always indicates a genuine defect rather than statistical noise. A balanced ledger can still contain a wrong amount, account, or duplicate transaction, so idempotency and external reconciliation remain necessary. Ledger platforms expose exactly this kind of balance check as a building block, letting teams wire it into an alerting system <a id=\"loc-47\" role=\"doc-biblioref\" href=\"#loc-100\">[29]<\/a>.<\/p>\n\n\n\n<figure id=\"loc-48\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Trip<\/th><th>Pay-in<\/th><th>Pay-out<\/th><th>Commission<\/th><\/tr><\/thead><tbody><tr><td>#1<\/td><td>20.00<\/td><td>16.00<\/td><td>4.00<\/td><\/tr><tr><td>#2<\/td><td>35.00<\/td><td>28.00<\/td><td>7.00<\/td><\/tr><tr><td>#3<\/td><td>12.00<\/td><td>9.60<\/td><td>2.40<\/td><\/tr><tr><td>Total<\/td><td>67.00<\/td><td>53.60<\/td><td>13.40<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Table I: Pay-in equals pay-out plus commission across rides in euros.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The remaining question is where these books live. Digitizing double-entry bookkeeping at ULSS scale, with billions of entries, imposes requirements that an ordinary database does not satisfy by default. Entries must be immutable, corrections must remain traceable, inconsistencies and unauthorized changes must be detectable, and the store must remain highly available, since every payment flow depends on it <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>, <a href=\"#loc-98\" role=\"doc-biblioref\">[27]<\/a>. Moreover, account activity is heavily skewed. A hot account, such as the account of a large merchant, can attract more than 30 balance-affecting updates per second, a rate that Uber sustains by batching updates at sub-second granularity while preserving strict consistency <a id=\"loc-49\" href=\"#loc-101\" role=\"doc-biblioref\">[30]<\/a>. Purpose-built append-only databases exist, but at Uber\u2019s scale the platform built its own storage system instead. While Gulfstream defines the logical accounting model and a workflow compatible with saga coordination, executing this model at ULSS scale requires a dedicated physical storage engine. <a href=\"#loc-50\">Section&nbsp;VI<\/a> examines LedgerStore, the immutable database that underpins these guarantees.<\/p>\n\n\n\n<h2 id=\"loc-50\" class=\"wp-block-heading\">LedgerStore<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">LedgerStore is Uber\u2019s storage-level answer to <a href=\"#loc-5\">(iii)<\/a>, an immutable system that acts as the single source of truth for all payment events. The store serves tens of billions of financial transactions per quarter and maintains over 2 trillion unique index entries with a petabyte-scale index storage footprint, while guaranteeing 99.99% availability, about 53 minutes of downtime per year <a id=\"loc-51\" href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>, <a href=\"#loc-102\" role=\"doc-biblioref\">[31]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Immutability and Storage Model<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The central design principle is immutability itself. Each transaction is written exactly once and never overwritten, which yields a complete and verifiable booking history. Ledger entries are stored in a table in Docstore, Uber\u2019s MySQL-based distributed datastore, where data is sorted by primary key across a fixed number of logical shards that are mapped onto a variable number of physical partitions <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>. Immutability is enforced and made verifiable through sealing. Incoming writes are grouped into sealing windows, time-range buckets that typically span 30 minutes. Once a window is sealed, no further updates to it are permitted, and the sealing process produces a manifest that lists the records of the window together with their checksums and carries a cryptographic signature over the whole manifest <a href=\"#loc-102\" role=\"doc-biblioref\">[31]<\/a>. Any query that reads only sealed windows is therefore guaranteed to be reproducible, and background validation of the signatures detects unauthorized modification after the fact <a href=\"#loc-102\" role=\"doc-biblioref\">[31]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Index Types<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On top of the immutable records, LedgerStore maintains three index types with different consistency guarantees, so that each query pattern pays only for the consistency it needs <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Strongly consistent indexes guarantee read-your-writes semantics and are maintained with a two-phase commit <a id=\"loc-52\" href=\"#loc-103\" role=\"doc-biblioref\">[32]<\/a>, whose mechanics the next two subsections examine. They serve real-time requests such as checking during a credit-card authorization whether a charge already exists, since acting on stale data would create a duplicate charge. This strictness has a price, precisely the trade-off between consistency and availability that the CAP theorem formalizes <a href=\"#loc-83\" role=\"doc-biblioref\">[12]<\/a>. Strong consistency raises write latency, since the write must wait for the index intents, and it lowers availability, since a single unavailable index blocks the entire write.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eventually consistent indexes serve the many use cases that do not need this strictness and accept the staleness window that eventual consistency permits in exchange for availability <a href=\"#loc-84\" role=\"doc-biblioref\">[13]<\/a>. When a rider opens their payment history, for example, it is acceptable for the most recent transaction to appear a few seconds late. These indexes are generated asynchronously through the materialized-view feature of the underlying Docstore. The record is written immediately, the index follows within seconds, and because the index maintenance runs in the background, it can neither slow down nor block the online write. Typical uses are payment history, reporting and analytics, and audit trails for compliance <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Time-range indexes address a third access pattern. The two index types described above answer queries for all entries of a given account, whereas the time-range index answers queries for all entries between two timestamps by placing a business timestamp as the leading sort component of the key. The most important use case is hot-to-cold tiering. Because the store is append-only, it grows without bound, yet most entries are never read again after a short time. Using the time-range index, old entries can be identified and moved to cheaper cold storage while hot data stays on fast storage, and because the data is immutable, this relocation is safe. The offloading proceeds at the granularity of sealed windows, so only closed and verified data ever moves <a href=\"#loc-102\" role=\"doc-biblioref\">[31]<\/a>. Time-range indexes also support reconciliation, internal audits, and batch payouts at the end of a settlement period <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Write Path<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On a strongly consistent write, illustrated in <a href=\"#loc-53\" title=\"\">Fig.&nbsp;2<\/a>, LedgerStore first writes an intent, a declaration that a record is about to be written, to every affected index before writing the record itself. Once the indexes acknowledge the intent, the record is written to the record table. As soon as the record write succeeds, LedgerStore returns success to the client, and the corresponding index commits happen asynchronously, so that index maintenance does not inflate the end-to-end latency <a role=\"doc-biblioref\" href=\"#loc-79\">[8]<\/a>. If an intent write fails, the insert fails as a whole, so the consistency guarantee is never weakened. The one ordering that must be strictly serial is the intent before the record. If the record were written first and the writer crashed, the record would be invisible to index-based reads, with no trace that anything is missing. The intent-then-commit protocol instead guarantees that every record is either reachable or explicitly repairable, and in practice only a small percentage of index entries ever remain in the intent state <a role=\"doc-biblioref\" href=\"#loc-79\">[8]<\/a>. This protocol spans the record table and every affected index, and it is how LedgerStore coordinates a single logical write across multiple shards.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\" id=\"loc-53\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path.png\"><img loading=\"lazy\" decoding=\"async\" width=\"876\" height=\"1024\" data-attachment-id=\"29095\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/ledgerstore-write-path\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path.png\" data-orig-size=\"1527,1784\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}\" data-image-title=\"ledgerstore-write-path\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;LedgerStore write path, in which index intents are written and acknowledged before the record. The client receives success as soon as the record write completes, and index commits follow asynchronously.&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path-876x1024.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path-876x1024.png\" alt=\"\" class=\"wp-image-29095\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path-876x1024.png 876w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path-257x300.png 257w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path-768x897.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path-1315x1536.png 1315w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/ledgerstore-write-path.png 1527w\" sizes=\"auto, (max-width: 876px) 100vw, 876px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 2: LedgerStore write path, in which index intents are written and acknowledged before the record. The client receives success as soon as the record write completes, and index commits follow asynchronously.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Read Path and Self-Healing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When a write is interrupted between the intent and the commit, LedgerStore resolves the resulting inconsistency lazily, at read time, which is what makes the system self-healing. Three cases can arise on read <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>If the index entry is already committed, LedgerStore returns it directly.<\/li>\n\n\n\n<li>If the index shows only an intent and the corresponding record is present in the record table, the write actually succeeded and only the commit step was lost, so LedgerStore commits the index entry on the spot before returning the result.<\/li>\n\n\n\n<li>If the index shows an intent but no record exists, the write was aborted midway, so LedgerStore rolls the index entry back and returns an empty response.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Reads therefore repair inconsistent states without any external intervention. Because this repair only triggers for entries that are actually read, an orphaned intent on a record nobody reads again is left uncorrected on this path, though the completeness checks (<a href=\"#loc-54\">Section&nbsp;VI.E<\/a>) still surface any such inconsistency that persists.<\/p>\n\n\n\n<h3 id=\"loc-54\" class=\"wp-block-heading\">Verifying Completeness<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Immutability alone does not make a store trustworthy. It also needs a way to verify completeness, since inconsistencies must be detectable rather than simply assumed absent. LedgerStore verifies its indexes against the source-of-truth records using order-independent checksums computed at a fixed time-window granularity. The checksum over all records in a window must match the checksum over the corresponding index entries, so even a single missing entry surfaces as a window-level mismatch <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>. Sealing adds a further cross-regional layer of assurance. Before a window is sealed, checksums computed from direct table reads and from the database streams in both replication regions must all agree, so a window only seals once the data is provably identical everywhere <a href=\"#loc-102\" role=\"doc-biblioref\">[31]<\/a>. This turns the assumption that nothing was lost into a continuously checked invariant. The same machinery underpins the index life cycle. A new index is created by a state machine that backfills it from historical data in rate-limited batches and validates it against the records before it starts serving reads <a href=\"#loc-79\" role=\"doc-biblioref\">[8]<\/a>.<\/p>\n\n\n\n<h2 id=\"loc-55\" class=\"wp-block-heading\">Reconciliation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Even an internally consistent ledger must still agree with what the PSPs actually did. Requirement <a href=\"#loc-7\">(v)<\/a> calls for this external check, which matches transaction records against each other and resolves any discrepancies that result <a id=\"loc-56\" href=\"#loc-104\" role=\"doc-biblioref\">[33]<\/a>. PSPs publish settlement files on provider-specific schedules, commonly daily or weekly, so reconciliation may take place around seven days after the transaction. The platform parses these files and compares their events with its payment records. This checks whether the platform\u2019s records agree with the provider\u2019s report. Settlement accounting also compares the expected payout with the corresponding bank statement to verify that the funds were deposited <a id=\"loc-57\" href=\"#loc-105\" role=\"doc-biblioref\">[34]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Matching Engine and Discrepancy Classification<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The reconciliation service compares each record in a PSP settlement file with the corresponding record in the payment platform. Uber matches the two records using a deterministic transaction reference shared with the PSP <a href=\"#loc-105\" role=\"doc-biblioref\">[34]<\/a>. Mismatches and their adjustments are commonly classified into three operational categories <a id=\"loc-58\" href=\"#loc-106\" role=\"doc-biblioref\">[35]<\/a>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Automatable discrepancies<\/strong>, where the cause and correction are known and automating the adjustment is cost-effective.<\/li>\n\n\n\n<li><strong>Manual triage<\/strong>, where the cause and correction are known but automation would cost too much, so the case is routed to the finance team.<\/li>\n\n\n\n<li><strong>Unclassified anomalies<\/strong>, where the cause is unknown and the finance team must investigate the case.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Settlement Latency and Multi-Currency Edge Cases<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The matching engine must also account for differences caused by currency conversion and settlement delays. When the presentment and settlement currencies differ, the original transaction amount and the payout amount cannot be compared directly. Accurate reconciliation therefore records both amounts and the exchange rate used. If the rate changes between the transaction and settlement dates, the difference is recorded as a foreign exchange gain or loss <a id=\"loc-59\" href=\"#loc-107\" role=\"doc-biblioref\">[36]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reconciliation is also useful internally, for example to check whether the ledger and a user-facing wallet balance agree with each other. Gulfstream was explicitly designed as a platform that can reconcile itself <a href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a>. Its limitation is that it is reactive, since it finds errors only after the fact. It is therefore preferable to prevent certain classes of error from arising in the first place, which motivates the exactly-once guarantee examined next.<\/p>\n\n\n\n<h2 id=\"loc-60\" class=\"wp-block-heading\">Exactly-Once Execution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The core problem of a distributed payment system is that networks are unreliable. A payment instruction can be lost in transit, or it can arrive twice. Requirement <a href=\"#loc-8\">(vi)<\/a> states the desired guarantee, which this paper decomposes into the two simpler properties in <a href=\"#loc-61\">(1)<\/a> that must hold simultaneously.<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mtext>exactly-once<\/mtext><mo>=<\/mo><mtext>at-least-once<\/mtext><mo>\u2227<\/mo><mtext>at-most-once<\/mtext><\/mrow><annotation encoding=\"application\/x-tex\">\\text{exactly-once} =\n\\text{at-least-once} \\land \\text{at-most-once}<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">At-least-once execution means that an instruction eventually takes effect, although it may take effect more than once. At-most-once execution means that an instruction never takes effect more than once, although it may not take effect at all. Retrying targets the first property, while idempotency targets the second. Both mechanisms appear in Uber\u2019s documented payment architecture <a id=\"loc-62\" href=\"#loc-89\" role=\"doc-biblioref\">[18]<\/a>, <a href=\"#loc-108\" role=\"doc-biblioref\">[37]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A theoretical caveat is in order. Exactly-once delivery over an unreliable network is impossible in the strict sense, since no finite number of acknowledgments allows two parties to agree with certainty that a message was received exactly once <a href=\"#loc-81\" role=\"doc-biblioref\">[10]<\/a>. What distributed systems implement instead is exactly-once processing. Messages may be delivered more than once, while retries provide at-least-once execution under the assumption that the system eventually recovers. Deduplication ensures that each message affects the receiver\u2019s state at most once. The guarantee thus shifts from the transmission of the message to its effect on the receiver\u2019s state, and it must be re-established at every step of a processing pipeline. Uber\u2019s real-time ad-event pipeline, though outside the payments domain, shows what this construction looks like in production. Transactional writes between the stream processor and Kafka make each processing step atomic, every aggregated result carries a unique record identifier as an idempotency key, and the analytical store deduplicates on that key during ingestion, so a redelivered event changes the final state at most once <a id=\"loc-63\" href=\"#loc-109\" role=\"doc-biblioref\">[38]<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Retry<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Retrying is the mechanism that lets a request eventually succeed despite transient failures, but a naive strategy can worsen the situation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Immediate retries are simple but dangerous, since against an already overloaded system they add load and can drive the platform into a provider\u2019s rate limit. Fixed intervals are more predictable but remain risky during longer outages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Increasing intervals give the system time to recover. One established variant is full jitter. It first computes a capped exponential upper bound and then samples the actual delay uniformly between zero and that bound <a id=\"loc-64\" href=\"#loc-110\" role=\"doc-biblioref\">[39]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formally, full jitter delays the <math><mi>\ud835\udc58<\/mi><\/math>-th retry as given in <a href=\"#loc-65\">(2)<\/a>,<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><msub><mi>t<\/mi><mi>k<\/mi><\/msub><mo>=<\/mo><msub><mi>U<\/mi><mi>k<\/mi><\/msub><mo>\u22c5<\/mo><mrow><mi>min<\/mi><mo>\u2061<\/mo><\/mrow><mrow><mo fence=\"true\" form=\"prefix\">(<\/mo><mrow><msub><mi>t<\/mi><mtext>max<\/mtext><\/msub><mo separator=\"true\">,<\/mo><msub><mi>t<\/mi><mn>0<\/mn><\/msub><mo>\u22c5<\/mo><msup><mn>2<\/mn><mi>k<\/mi><\/msup><\/mrow><mo fence=\"true\" form=\"postfix\">)<\/mo><\/mrow><\/mrow><annotation encoding=\"application\/x-tex\">t_{k} = U_{k} \\cdot \\min\\left(\n{t_{\\text{max}},t_{0} \\cdot 2^{k}} \\right)<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">where <math><msub><mi>\ud835\udc61<\/mi><mn>0<\/mn><\/msub><\/math> denotes the base delay, <math><msub><mi>\ud835\udc61<\/mi><mo>max<\/mo><\/msub><\/math> caps the wait, and each <math><msub><mi>\ud835\udc48<\/mi><mi>\ud835\udc58<\/mi><\/msub><\/math> is sampled independently from a uniform distribution over the interval from zero to one. The random factor spreads requests that failed at the same moment across the full backoff window, which prevents them from re-creating the original load spike <a href=\"#loc-110\" role=\"doc-biblioref\">[39]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, giving up is sometimes the correct choice. When further attempts are pointless, for example with an invalid API key or a fraud-suspected account, retries should stop. Giving up must not mean discarding the message, though. Uber\u2019s payment platform routes each failure through a defined error strategy that either retries the operation or archives the message to a dead-letter queue <a href=\"#loc-89\" role=\"doc-biblioref\">[18]<\/a>, <a href=\"#loc-108\" role=\"doc-biblioref\">[37]<\/a>. This is how a poison-pill message, one that is malformed or otherwise fails the same way on every attempt, is kept from being lost or from blocking the messages queued behind it. Once archived, the message is preserved for inspection instead of silently dropped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two further disciplines keep retries safe at ULSS scale.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Retries must be bounded by a retry budget.<\/strong> In a multi-tier system in which the app retries the backend, the backend retries the gateway, and the gateway retries the PSP, naive per-tier retries multiply, and three attempts at each of three tiers turn a single user action into up to 27 provider requests. Only one tier should therefore own the retry policy for a given failure.<\/li>\n\n\n\n<li><strong>Retries must distinguish between error classes.<\/strong> A timeout or an Hypertext Transfer Protocol (HTTP) <code class=\"\" data-line=\"\">5xx<\/code> response is worth retrying, whereas a validation error or a card decline is deterministic and fails identically on every attempt, so retrying it merely consumes rate limits <a id=\"loc-66\" role=\"doc-biblioref\" href=\"#loc-111\">[40]<\/a>. This classification is also the point where retry policy may conflict with business logic, since a card decline is a final answer from the issuing bank and not a transient fault.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Idempotency<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Retries guarantee at-least-once execution but, by construction, create the risk of duplicates. Duplicates also arise from a repeated tap on the payment button or from a lost response, in which the PSP has already charged the card but the confirmation never reaches the client, which consequently repeats the request. Idempotency removes this risk. The client attaches the same unique idempotency key to every attempt of an operation, and the server executes the operation only on its first occurrence, returning the stored result for every subsequent attempt. The technique is standard practice at payment providers such as Stripe, which exposes it through the Idempotency-Key HTTP request header <a id=\"loc-67\" href=\"#loc-112\" role=\"doc-biblioref\">[41]<\/a>. The header has also been the subject of efforts to define a common HTTP field <a id=\"loc-68\" href=\"#loc-113\" role=\"doc-biblioref\">[42]<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Concretely, when a charge request arrives with key <math><msub><mi>\ud835\udc3e<\/mi><mn>1<\/mn><\/msub><\/math>, the payment service consults an idempotency store for <math><msub><mi>\ud835\udc3e<\/mi><mn>1<\/mn><\/msub><\/math>. If the key is unknown, the service passes <math><msub><mi>\ud835\udc3e<\/mi><mn>1<\/mn><\/msub><\/math> to the PSP as the provider idempotency key, executes the charge, stores the result under <math><msub><mi>\ud835\udc3e<\/mi><mn>1<\/mn><\/msub><\/math> within its own idempotency store, and returns a successful response to the client. If the service crashes after the provider executes the charge but before the local result is stored, a retry passes the same key to the provider and retrieves the original result instead of charging again. If the same request arrives after the local result has been stored, the service returns that result without contacting the provider (<a href=\"#loc-69\" title=\"\">Fig.&nbsp;3<\/a>) <a role=\"doc-biblioref\" href=\"#loc-108\">[37]<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\" id=\"loc-69\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing.png\"><img loading=\"lazy\" decoding=\"async\" width=\"916\" height=\"1024\" data-attachment-id=\"29096\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/idempotent-charge-processing\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing.png\" data-orig-size=\"2062,2306\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;,&quot;alt&quot;:&quot;&quot;}\" data-image-title=\"idempotent-charge-processing\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Idempotent charge processing, in which the payment service passes the same idempotency key K_1 to the PSP. A retry returns the stored result instead of triggering a second charge.&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-916x1024.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-916x1024.png\" alt=\"\" class=\"wp-image-29096\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-916x1024.png 916w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-268x300.png 268w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-768x859.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-1373x1536.png 1373w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/idempotent-charge-processing-1831x2048.png 1831w\" sizes=\"auto, (max-width: 916px) 100vw, 916px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 3: Idempotent charge processing, in which the payment service passes the same idempotency key <math><semantics><msub><mi>K<\/mi><mn>1<\/mn><\/msub><annotation encoding=\"application\/x-tex\">K_1<\/annotation><\/semantics><\/math> to the PSP. A retry returns the stored result instead of triggering a second charge.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Key Lifecycle and Concurrency Edge Cases<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The robustness of an application-level idempotency scheme depends on low-level storage details and state-machine transitions that are easy to misconfigure. The first critical requirement is deterministic key derivation. Gulfstream constructs transaction identifiers deterministically by hashing the user identifier, job payload, and order sequence number <a href=\"#loc-78\" role=\"doc-biblioref\">[7]<\/a>. Because the resulting key remains identical across all retries of a single payment instruction, the platform avoids key collisions while guaranteeing that retried operations map to the same idempotent entry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A second critical requirement is managing concurrent in-flight races. If a network timeout prompts a client to retry while the original request is still executing in the payment gateway, a naive lookup for a stored result will return a cache miss. To prevent duplicate execution under concurrent retries, the idempotency store must represent three distinct state transitions.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Pending execution<\/strong>, where a request has acquired an in-flight reservation lock and is currently executing against the gateway or provider. Duplicate retries that hit a pending state are deferred, blocked, or rejected with a retry-after status rather than starting a second execution.<\/li>\n\n\n\n<li><strong>Completed payload<\/strong>, where the primary execution succeeded and stored its response payload, enabling subsequent retries to immediately return the cached result without touching downstream services.<\/li>\n\n\n\n<li><strong>Terminal failure<\/strong>, where a non-retryable error occurred, allowing the platform to fail fast or accept a new key depending on the failure taxonomy.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">A third requirement involves store durability and provider-sticky routing. In accordance with the end-to-end argument (<a href=\"#loc-16\">Section&nbsp;II.B<\/a>), the idempotency store must match the availability and durability Service Level Agreement (SLA) of the primary payment pipeline <a href=\"#loc-103\" role=\"doc-biblioref\">[32]<\/a>. The store must also record provider affinity, binding each idempotency key to the specific PSP that received the initial request. This prevents cross-provider duplicate charges by ensuring that retries are routed back to the original provider rather than initiating a new charge at an alternative gateway <a href=\"#loc-108\" role=\"doc-biblioref\">[37]<\/a>. Upstream payment providers implement identical mechanisms by accepting idempotency headers on their REST-APIs <a href=\"#loc-113\" role=\"doc-biblioref\">[42]<\/a>, which extends exactly-once guarantees across the organizational boundary to external financial networks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Together, idempotency and reconciliation guarantee correctness across two distinct boundaries. Idempotency establishes application-level exactly-once execution internally, while reconciliation establishes financial settlement agreement with external providers.<\/p>\n\n\n\n<h2 id=\"loc-70\" class=\"wp-block-heading\">Discussion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The architecture presented so far reflects the choices of one specific platform. Three of its design decisions deserve a closer look, since a smaller platform, or the same platform at an earlier point in its growth, might reasonably decide differently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fraud Prevention as a Risk-Appetite Decision<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The value of a platform-wide risk engine grows with the data available to it. Historical and behavioral baselines grow more informative as the platform accumulates transaction history, since distinguishing normal behavior from anomalous behavior depends on having enough of it. Supervised fraud models also depend on labeled data for training <a href=\"#loc-86\" role=\"doc-biblioref\">[15]<\/a>. A young platform has little of either, so provider tooling can supply a useful baseline while its own data matures. Over time, the platform can add rules based on its unique context, evaluate new models in shadow mode, and give its own engine more responsibility as the evidence supports it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">How the engine is tuned, whether to approve, request further verification, or decline, is not a purely technical choice. A false negative costs the fare and the chargeback fee, while a false positive may cost a customer who never returns. How these outcomes are weighed depends on where the platform sits in its growth. An early-stage platform fighting for market share may reasonably tolerate more fraud loss to avoid friction at checkout. An established platform may instead favor a stricter threshold. The setting of the risk engine is therefore a business decision expressed in engineering terms, not a fixed technical optimum.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Build versus Buy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The build-versus-buy decision appears at several layers of the payment stack. Buying shifts the fixed cost of engineering, operations, and specialist knowledge to a provider, but adds fees and limits control. Building reverses that trade-off. Transaction volume determines whether the fixed cost can be spread across enough payments, while strategic value and operational fit determine whether ownership is useful in the first place.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">LedgerStore shows how this reasoning applies to a concrete component. Append-only, immutable, verifiable storage is available off the shelf, for example in the open-source database immudb<sup id=\"loc-71\" role=\"doc-noteref\"><a href=\"#loc-119\">6<\/a><\/sup>. Uber still has three reasons to build its own system.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Cost.<\/strong> At billions of entries, the licensing cost or inefficiency of a general-purpose solution scales with volume, while a purpose-built system can use workload-specific optimizations such as hot-to-cold tiering.<\/li>\n\n\n\n<li><strong>Control.<\/strong> LedgerStore can choose between two-phase commit and asynchronous materialized views for each index, matching consistency to the query patterns of its workload.<\/li>\n\n\n\n<li><strong>Integration.<\/strong> LedgerStore sits on top of Uber\u2019s internal Docstore infrastructure and inherits its operational tooling, sharding, and on-call processes. An external system would add another storage stack to operate.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">A platform processing thousands rather than billions of transactions per day reaches a different conclusion. An off-the-shelf ledger or even the balance and reporting APIs of a PSP may remain the more economical choice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same decision recurs elsewhere in the stack. A platform can bring fraud prevention (<a href=\"#loc-34\">Section&nbsp;IV<\/a>) in-house as its transaction history and need for platform-specific decisions grow. It can later connect directly to card networks and banks (<a href=\"#loc-25\">Section&nbsp;III<\/a>), when the fees saved justify the fixed cost of certification, membership, and settlement operations. These choices do not have to be made together. A platform may own the components that create a strategic advantage while continuing to buy the rest. The general ULSS lesson, aligned with the architectural principles of <a href=\"#loc-72\" role=\"doc-biblioref\">P. Feiler et al. [1]<\/a>, is that each build decision must be derived from the platform\u2019s scale and needs, not copied from a case study.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Choosing the Compliance Boundary<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Compliance places a boundary around what the platform should operate itself. Tokenization keeps raw card data at the PSP and leaves the platform with tokens and non-sensitive metadata, which reduces its scope under standards such as PCI DSS <a href=\"#loc-85\" role=\"doc-biblioref\">[14]<\/a>. A hosted checkout can narrow that boundary further. In contrast, bringing payment functions in-house increases the number of systems, processes, and teams that must satisfy regulatory controls and produce evidence for audits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The right boundary is the smallest one that still gives the platform the capabilities it needs to own. A smaller platform may rely on a full-service provider for checkout and fraud scoring. A multi-PSP platform accepts more compliance work because it values control over routing, redundancy, and cross-provider risk signals. This boundary should be reconsidered as the platform enters new regions, adds payment methods, or takes on functions previously handled by a provider. Compliance is therefore not a separate feature added after the architecture is designed. It is a constraint on which parts of the architecture the platform chooses to own, and it is also what limits this study\u2019s own visibility into how those delegated parts actually work, a boundary the next section makes explicit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Limitations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This paper is a synthesis of publicly available engineering talks and blog posts, not a measurement study. The primary sources are published by the companies themselves, describe their systems at different points in time, and generally omit failure statistics, cost breakdowns, and the false-positive rate of the risk engine. The architecture presented here should therefore be read as a consistent reconstruction of one platform\u2019s design rather than a validated reference architecture, and quantitative claims such as a consistency lag of a few seconds, or 99.99% availability, reproduce the sources rather than constituting independent evidence.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Requirement<\/th><th>Mechanism<\/th><th>Cost accepted<\/th><th>Residual limitation<\/th><\/tr><\/thead><tbody><tr><td><a href=\"#loc-3\">(i)<\/a> payment methods and PSPs<\/td><td>gateway and adapters (<a href=\"#loc-25\">Section&nbsp;III<\/a>)<\/td><td>an abstraction layer to maintain<\/td><td>each new PSP still needs its own rollout<\/td><\/tr><tr><td><a href=\"#loc-4\">(ii)<\/a> prevent fraud<\/td><td>risk engine, RADAR (<a href=\"#loc-34\">Section&nbsp;IV<\/a>)<\/td><td>latency in the authorization path<\/td><td>quality scales with history (<a href=\"#loc-70\">Section&nbsp;IX<\/a>)<\/td><\/tr><tr><td><a href=\"#loc-5\">(iii)<\/a> balanced and traceable records<\/td><td>ledger, immutability, checksums (<a href=\"#loc-42\">Section&nbsp;V<\/a>, <a href=\"#loc-50\">Section&nbsp;VI<\/a>)<\/td><td>storage that only grows<\/td><td>internal consistency only<\/td><\/tr><tr><td><a href=\"#loc-6\">(iv)<\/a> coordinate services<\/td><td>saga interpretation with compensating entries (<a href=\"#loc-45\">Section&nbsp;V.A<\/a>), intent-then-commit (<a href=\"#loc-50\">Section&nbsp;VI<\/a>)<\/td><td>compensation logic per step<\/td><td>a saga gives up isolation<\/td><\/tr><tr><td><a href=\"#loc-7\">(v)<\/a> reconcile against providers<\/td><td>settlement matching, discrepancy classification (<a href=\"#loc-55\">Section&nbsp;VII<\/a>)<\/td><td>a batch pipeline and manual queues<\/td><td>reactive, so errors surface late<\/td><\/tr><tr><td><a href=\"#loc-8\">(vi)<\/a> exactly-once execution<\/td><td>retries and idempotency keys (<a href=\"#loc-60\">Section&nbsp;VIII<\/a>)<\/td><td>a store as durable as the payment path<\/td><td>processing, not delivery<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Table II: Each requirement from the introduction, the mechanism that satisfies it, the cost accepted in exchange, and the limitation that remains.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The central lesson of this case study is that reliable payment processing does not require every component or external partner to behave reliably. It requires the platform to preserve enough information to determine what was intended, what was attempted, and what ultimately happened. Immutable records, idempotent operations, and reconciliation turn timeouts, duplicate messages, and delayed settlement from ambiguous failures into states that can be detected and repaired. This shift from preventing every failure to making every financial effect traceable is what allows the system to operate safely at ultra-large scale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At the same time, <a href=\"#loc-70\">Section&nbsp;IX<\/a> shows that the architecture examined here reflects one platform\u2019s scale rather than a universal prescription. The risk appetite behind fraud-engine tuning, the build-versus-buy calculus, and the compliance boundary must all be re-derived from the concrete transaction volume, regulatory environment, and growth trajectory of the platform at hand. How aggressively to screen for fraud, which components to build rather than buy, and how much of the compliance burden to take on remain genuinely open, business-driven questions. The architectural building blocks presented here define the solution space, but they do not decide which trade-offs are appropriate for a particular platform.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-2\">[1]<\/a><\/span> P. Feiler et al., <em>Ultra-Large-Scale Systems: The Software Challenge of the Future<\/em>. Software Engineering Institute, 2006. [Online].<span style=\"white-space: pre-wrap\">  <\/span>Available: <a href=\"https:\/\/www.sei.cmu.edu\/library\/ultra-large-scale-systems-the-software-challenge-of-the-future\/\">https:\/\/www.sei.cmu.edu\/library\/ultra-large-scale-systems-the-software-challenge-of-the-future\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-9\">[2]<\/a><\/span> J. Gray, \u201cThe Transaction Concept: Virtues and Limitations,\u201d in <em>Proceedings of the Seventh International Conference on Very Large Data Bases (VLDB &#8217;81)<\/em>, Cannes, France, Sept. 1981, pp. 144\u2013154.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-10\">[3]<\/a><\/span> D. Skeen, \u201cNonblocking Commit Protocols,\u201d in <em>Proceedings of the 1981 ACM SIGMOD International Conference on Management of Data &#8211; SIGMOD &#8217;81<\/em>, Ann Arbor, Michigan: ACM Press,<span style=\"white-space: pre-wrap\">  <\/span>1981, pp. 133\u2013142. doi: <a href=\"https:\/\/doi.org\/10.1145\/582318.582339\">10.1145\/582318.582339<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-11\">[4]<\/a><\/span> P. Helland, \u201cLife Beyond Distributed Transactions: An Apostate\u2019s Opinion,\u201d <em>Queue<\/em>, vol. 14, no. 5, pp. 69\u201398, Oct. 2016, doi: <a href=\"https:\/\/doi.org\/10.1145\/3012426.3025012\">10.1145\/3012426.3025012<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-12\">[5]<\/a><\/span> N. Dragoni et al., \u201cMicroservices: Yesterday, Today, and Tomorrow,\u201d in <em>Present and Ulterior Software Engineering<\/em>, M. Mazzara and B. Meyer, Eds., Cham: Springer International Publishing, 2017, pp. 195\u2013216. doi: <a href=\"https:\/\/doi.org\/10.1007\/978-3-319-67425-4_12\">10.1007\/978-3-319-67425-4_12<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-13\">[6]<\/a><\/span> H. Garcia-Molina and K. Salem, \u201cSagas,\u201d in <em>Proceedings of the 1987 ACM SIGMOD International Conference on Management of Data &#8211; SIGMOD &#8217;87<\/em>, San Francisco, California, United States: ACM Press,<span style=\"white-space: pre-wrap\">  <\/span>1987, pp. 249\u2013259. doi: <a href=\"https:\/\/doi.org\/10.1145\/38713.38742\">10.1145\/38713.38742<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-14\">[7]<\/a><\/span> A. Singla and S. Wu, \u201cRevolutionizing Money Movements at Scale with Strong Data Consistency.\u201d Accessed: May 07, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/money-scale-strong-data\/\">https:\/\/www.uber.com\/us\/en\/blog\/money-scale-strong-data\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-15\">[8]<\/a><\/span> K. Devarajaiah, \u201cHow LedgerStore Supports Trillions of Indexes at Uber.\u201d Accessed: Apr. 30, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/how-ledgerstore-supports-trillions-of-indexes\/\">https:\/\/www.uber.com\/us\/en\/blog\/how-ledgerstore-supports-trillions-of-indexes\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-17\">[9]<\/a><\/span> J. H. Saltzer, D. P. Reed, and D. D. Clark, \u201cEnd-to-End Arguments in System Design,\u201d <em>ACM Transactions on Computer Systems<\/em>, vol. 2, no. 4, pp. 277\u2013288, Nov. 1984, doi: <a href=\"https:\/\/doi.org\/10.1145\/357401.357402\">10.1145\/357401.357402<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-18\">[10]<\/a><\/span> E. A. Akkoyunlu, K. Ekanadham, and R. V. Huber, \u201cSome Constraints and Tradeoffs in the Design of Network Communications,\u201d <em>ACM SIGOPS Operating Systems Review<\/em>, vol. 9, no. 5, pp. 67\u201374, Nov. 1975, doi: <a href=\"https:\/\/doi.org\/10.1145\/1067629.806523\">10.1145\/1067629.806523<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-19\">[11]<\/a><\/span> M. J. Fischer, N. A. Lynch, and M. S. Paterson, \u201cImpossibility of Distributed Consensus with One Faulty Process,\u201d <em>Journal of the ACM<\/em>, vol. 32, no. 2, pp. 374\u2013382, Apr. 1985, doi: <a href=\"https:\/\/doi.org\/10.1145\/3149.214121\">10.1145\/3149.214121<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-20\">[12]<\/a><\/span> S. Gilbert and N. Lynch, \u201cBrewer&#8217;s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services,\u201d <em>ACM SIGACT News<\/em>, vol. 33, no. 2, pp. 51\u201359, June 2002, doi: <a href=\"https:\/\/doi.org\/10.1145\/564585.564601\">10.1145\/564585.564601<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-21\">[13]<\/a><\/span> W. Vogels, \u201cEventually Consistent,\u201d <em>Communications of the ACM<\/em>, vol. 52, no. 1, pp. 40\u201344, Jan. 2009, doi: <a href=\"https:\/\/doi.org\/10.1145\/1435417.1435432\">10.1145\/1435417.1435432<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-22\">[14]<\/a><\/span> S. Solat, \u201cSecurity of Electronic Payment Systems: A Comprehensive Survey.\u201d Accessed: July 28, 2026. [Online]. Available: <a href=\"http:\/\/arxiv.org\/abs\/1701.04556\">http:\/\/arxiv.org\/abs\/1701.04556<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-23\">[15]<\/a><\/span> S. Bhattacharyya et al., \u201cData Mining for Credit Card Fraud: A Comparative Study,\u201d <em>Decision Support Systems<\/em>, vol. 50, no. 3, pp. 602\u2013613, Feb. 2011, doi: <a href=\"https:\/\/doi.org\/10.1016\/j.dss.2010.08.008\">10.1016\/j.dss.2010.08.008<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-24\">[16]<\/a><\/span> A. Dal Pozzolo et al., \u201cCredit Card Fraud Detection: A Realistic Modeling and a Novel Learning Strategy,\u201d <em>IEEE Transactions on Neural Networks and Learning Systems<\/em>, vol. 29, pp. 3784\u20133797, Sept. 2017, doi: <a href=\"https:\/\/doi.org\/10.1109\/TNNLS.2017.2736643\">10.1109\/TNNLS.2017.2736643<\/a>.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-27\">[17]<\/a><\/span> \u201c[Payments Platform] Payments Integration at Uber: A Case Study \u2013 Gergely Orosz.\u201d Accessed: May 27, 2026. [Online]. Available: <a href=\"https:\/\/www.youtube.com\/watch?v=yooCE5B0SRA\">https:\/\/www.youtube.com\/watch?v=yooCE5B0SRA<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-30\">[18]<\/a><\/span> \u017d. Obrenovi\u0107, \u201cUber\u2019s Payments Platform.\u201d Accessed: Apr. 30, 2026. [Online]. Available: <a href=\"https:\/\/underhood.blog\/uber-payments-platform\">https:\/\/underhood.blog\/uber-payments-platform<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-31\">[19]<\/a><\/span> \u201c[Payments Platform] To the Nines: Building Uber&#8217;s Payments Processing System \u2013 Paul Sorenson.\u201d Accessed: Mar. 24, 2026. [Online]. Available: <a href=\"https:\/\/www.youtube.com\/watch?v=MJABqwzBkHs\">https:\/\/www.youtube.com\/watch?v=MJABqwzBkHs<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-35\">[20]<\/a><\/span> Y. Diao and I. Geracioti, \u201cMastermind: Using Uber Engineering to Combat Fraud in Real Time.\u201d Accessed: July 29, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/mastermind\/\">https:\/\/www.uber.com\/us\/en\/blog\/mastermind\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-38\">[21]<\/a><\/span> R. Drapeau, \u201cHow We Built It: Stripe Radar.\u201d Accessed: July 16, 2026. [Online]. Available: <a href=\"https:\/\/stripe.dev\/blog\/how-we-built-it-stripe-radar\">https:\/\/stripe.dev\/blog\/how-we-built-it-stripe-radar<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-39\">[22]<\/a><\/span> Stripe, Inc., \u201cRisk Insights.\u201d Accessed: July 29, 2026. [Online]. Available: <a href=\"https:\/\/docs.stripe.com\/radar\/reviews\/risk-insights\">https:\/\/docs.stripe.com\/radar\/reviews\/risk-insights<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-40\">[23]<\/a><\/span> Uber Technologies, Inc., \u201cUber Privacy Notice: Riders and Order Recipients.\u201d Accessed: July 29, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/global\/en\/privacy-notice-riders-order-recipients\/\">https:\/\/www.uber.com\/global\/en\/privacy-notice-riders-order-recipients\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-41\">[24]<\/a><\/span> S. Yen, \u201cStopping Uber Fraudsters Through Risk Challenges.\u201d Accessed: May 27, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/stopping-uber-fraudsters-through-risk-challenges\/\">https:\/\/www.uber.com\/us\/en\/blog\/stopping-uber-fraudsters-through-risk-challenges\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-41\">[25]<\/a><\/span> E. Ng et al., \u201cProject RADAR: Intelligent Early Fraud Detection System with Humans in the Loop.\u201d Accessed: May 27, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/project-radar-intelligent-early-fraud-detection\/\">https:\/\/www.uber.com\/us\/en\/blog\/project-radar-intelligent-early-fraud-detection\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-43\">[26]<\/a><\/span> A. Sangster, \u201cThe Genesis of Double Entry Bookkeeping,\u201d <em>The Accounting Review<\/em>, vol. 91, no. 1, pp. 299\u2013315, 2016, Accessed: July 25, 2026. [Online].<span style=\"white-space: pre-wrap\">  <\/span>Available: <a href=\"http:\/\/www.jstor.org\/stable\/43867017\">http:\/\/www.jstor.org\/stable\/43867017<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-44\">[27]<\/a><\/span> M. McNierney, \u201cHow to Scale a Ledger, Part V: Immutability and Double-Entry.\u201d Accessed: July 16, 2026. [Online]. Available: <a href=\"https:\/\/www.moderntreasury.com\/journal\/how-to-scale-a-ledger-part-v\">https:\/\/www.moderntreasury.com\/journal\/how-to-scale-a-ledger-part-v<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-46\">[28]<\/a><\/span> M. Franklin, P. Graybeal, and D. Cooper, <em>Principles of Accounting: Volume 1, Financial Accounting<\/em>. in Open Textbook Library. Houston, TX: OpenStax, 2019.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-47\">[29]<\/a><\/span> K. Krier, \u201cHow to Think About Ledger Balances &#8211; Modern Treasury.\u201d Accessed: July 28, 2026. [Online]. Available: <a href=\"https:\/\/www.moderntreasury.com\/journal\/how-to-think-about-ledger-balances\">https:\/\/www.moderntreasury.com\/journal\/how-to-think-about-ledger-balances<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-49\">[30]<\/a><\/span> R. K. Gautam and A. Kale, \u201cBuilding High Throughput Payment Account Processing.\u201d Accessed: May 21, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/high-throughput-processing\/\">https:\/\/www.uber.com\/us\/en\/blog\/high-throughput-processing\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-51\">[31]<\/a><\/span> P. Patel, J. Chovatia, and K. Devarajaiah, \u201cHow Uber Migrated Financial Data from DynamoDB to Docstore.\u201d Accessed: July 25, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/dynamodb-to-docstore-migration\/\">https:\/\/www.uber.com\/us\/en\/blog\/dynamodb-to-docstore-migration\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-52\">[32]<\/a><\/span> U. Joshi and M. Fowler, <em>Patterns of Distributed Systems<\/em>. in The Addison-Wesley Signature Series. Hoboken (New Jersey) Addison Wesley, 2024.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-56\">[33]<\/a><\/span> \u201cPayment Reconciliation: What It Is and How It\u2019s Done | Stripe.\u201d Accessed: July 29, 2026. [Online]. Available: <a href=\"https:\/\/stripe.com\/resources\/more\/payment-reconciliation-101\">https:\/\/stripe.com\/resources\/more\/payment-reconciliation-101<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-57\">[34]<\/a><\/span> O. Singh et al., \u201cStreamlining Financial Precision: Uber&#8217;s Advanced Settlement Accounting System.\u201d Accessed: July 16, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/ubers-advanced-settlement-accounting-system\/\">https:\/\/www.uber.com\/us\/en\/blog\/ubers-advanced-settlement-accounting-system\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-58\">[35]<\/a><\/span> A. Xu and S. Lam, \u201cPayment System,\u201d in <em>System Design Interview: An Insider&#8217;s Guide<\/em>, vol. 2, Byte Code LLC, 2022, pp. 315\u2013340.<\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-59\">[36]<\/a><\/span> \u201cPresentment Currency and Settlement Currency Explained | Stripe.\u201d Accessed: July 29, 2026. [Online]. Available: <a href=\"https:\/\/stripe.com\/resources\/more\/presentment-currency-and-settlement-currency-explained-what-every-business-needs-to-know\">https:\/\/stripe.com\/resources\/more\/presentment-currency-and-settlement-currency-explained-what-every-business-needs-to-know<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-62\">[37]<\/a><\/span> \u201c[MoneyCon 2019] Reliable Processing in a Streaming Payment System.\u201d Accessed: Mar. 24, 2026. [Online]. Available: <a href=\"https:\/\/www.youtube.com\/watch?v=5TD8m7w1xE0\">https:\/\/www.youtube.com\/watch?v=5TD8m7w1xE0<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-63\">[38]<\/a><\/span> J. Tsafatinos et al., \u201cReal-Time Exactly-Once Ad Event Processing with Apache Flink and Kafka.\u201d Accessed: July 28, 2026. [Online]. Available: <a href=\"https:\/\/www.uber.com\/us\/en\/blog\/real-time-exactly-once-ad-event-processing\/\">https:\/\/www.uber.com\/us\/en\/blog\/real-time-exactly-once-ad-event-processing\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-64\">[39]<\/a><\/span> M. Brooker, \u201cExponential Backoff And Jitter | AWS Architecture Blog.\u201d Accessed: July 16, 2026. [Online]. Available: <a href=\"https:\/\/aws.amazon.com\/de\/blogs\/architecture\/exponential-backoff-and-jitter\/\">https:\/\/aws.amazon.com\/de\/blogs\/architecture\/exponential-backoff-and-jitter\/<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-66\">[40]<\/a><\/span> B. de Water, \u201c10 Tips for Building Resilient Payment Systems.\u201d Accessed: July 16, 2026. [Online]. Available: <a href=\"https:\/\/shopify.engineering\/building-resilient-payment-systems\">https:\/\/shopify.engineering\/building-resilient-payment-systems<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-67\">[41]<\/a><\/span> B. Leach, \u201cDesigning Robust and Predictable APIs with Idempotency.\u201d Accessed: July 16, 2026. [Online]. Available: <a href=\"https:\/\/stripe.com\/blog\/idempotency\">https:\/\/stripe.com\/blog\/idempotency<\/a><\/li>\n\n\n\n<li><span class=\"prefix\"><a role=\"doc-backlink\" href=\"#loc-68\">[42]<\/a><\/span> \u201cIdempotency-Key Header &#8211; HTTP | MDN.\u201d Accessed: July 19, 2026. [Online]. Available: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Idempotency-Key\">https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Idempotency-Key<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Footnotes<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><sup role=\"doc-backlink\"><a href=\"#loc-26\">1<\/a><\/sup><a href=\"https:\/\/paytm.com\">https:\/\/paytm.com<\/a><\/li>\n\n\n\n<li><sup role=\"doc-backlink\"><a href=\"#loc-28\">2<\/a><\/sup><a href=\"https:\/\/stripe.com\">https:\/\/stripe.com<\/a><\/li>\n\n\n\n<li><sup role=\"doc-backlink\"><a href=\"#loc-29\">3<\/a><\/sup><a href=\"https:\/\/www.adyen.com\">https:\/\/www.adyen.com<\/a><\/li>\n\n\n\n<li><sup role=\"doc-backlink\"><a href=\"#loc-36\">4<\/a><\/sup><a href=\"https:\/\/stripe.com\/radar\">https:\/\/stripe.com\/radar<\/a><\/li>\n\n\n\n<li><sup role=\"doc-backlink\"><a href=\"#loc-37\">5<\/a><\/sup><a href=\"https:\/\/www.adyen.com\/risk-management\">https:\/\/www.adyen.com\/risk-management<\/a><\/li>\n\n\n\n<li><sup role=\"doc-backlink\"><a href=\"#loc-71\">6<\/a><\/sup><a href=\"https:\/\/github.com\/codenotary\/immudb\">https:\/\/github.com\/codenotary\/immudb<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.<\/p>\n","protected":false},"author":1207,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[120,656,659,650,21,651,2,223],"tags":[1234,1235,1236,1232,1233],"ppma_author":[1035,1044],"class_list":["post-28987","post","type-post","status-publish","format-standard","hentry","category-cloud-technologies","category-databases","category-devops","category-scalable-systems","category-system-architecture","category-system-designs","category-system-engineering","category-ultra-large-scale-systems","tag-distributed-transactions","tag-fraud-detection","tag-ledger-systems","tag-payment-processing","tag-ultra-large-scale-systems-2"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Robin Schmidt\"\/>\n\t<meta name=\"keywords\" content=\"distributed transactions,fraud detection,ledger systems,payment processing,ultra-large-scale systems\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Computer Science Blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart\" \/>\n\t\t<meta property=\"og:description\" content=\"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-31T12:24:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-31T12:24:18+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#article\",\"name\":\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart\",\"headline\":\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform\",\"author\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/author\\\/robin_schmidt\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/auth-capture-sequence.png\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#articleImage\"},\"datePublished\":\"2026-07-31T14:24:16+02:00\",\"dateModified\":\"2026-07-31T14:24:18+02:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#webpage\"},\"articleSection\":\"Cloud Technologies, Databases, DevOps, Scalable Systems, System Architecture, System Designs, System Engineering, Ultra Large Scale Systems, Distributed transactions, Fraud detection, Ledger systems, Payment processing, Ultra-large-scale systems, Robin Schmidt, tm129\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/#listItem\",\"name\":\"System Designs\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/#listItem\",\"position\":2,\"name\":\"System Designs\",\"item\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/system-engineering\\\/#listItem\",\"name\":\"System Engineering\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/system-engineering\\\/#listItem\",\"position\":3,\"name\":\"System Engineering\",\"item\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/system-engineering\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#listItem\",\"name\":\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/#listItem\",\"name\":\"System Designs\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#listItem\",\"position\":4,\"name\":\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/category\\\/system-designs\\\/system-engineering\\\/#listItem\",\"name\":\"System Engineering\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/#organization\",\"name\":\"Computer Science Blog @ HdM Stuttgart\",\"description\":\"on computer science and media topics\",\"url\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/author\\\/robin_schmidt\\\/#author\",\"url\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/author\\\/robin_schmidt\\\/\",\"name\":\"Robin Schmidt\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a0c4d706261a2d836b2eea83799fe2c3cf82a858681a2d685644006285830865?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Robin Schmidt\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#webpage\",\"url\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/\",\"name\":\"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart\",\"description\":\"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/2026\\\/07\\\/31\\\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/author\\\/robin_schmidt\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/index.php\\\/author\\\/robin_schmidt\\\/#author\"},\"datePublished\":\"2026-07-31T14:24:16+02:00\",\"dateModified\":\"2026-07-31T14:24:18+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/#website\",\"url\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/\",\"name\":\"Computer Science Blog @ HdM Stuttgart\",\"description\":\"on computer science and media topics\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/blog.mi.hdm-stuttgart.de\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart","description":"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.","canonical_url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/","robots":"max-image-preview:large","keywords":"distributed transactions,fraud detection,ledger systems,payment processing,ultra-large-scale systems","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#article","name":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart","headline":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform","author":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/author\/robin_schmidt\/#author"},"publisher":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence.png","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#articleImage"},"datePublished":"2026-07-31T14:24:16+02:00","dateModified":"2026-07-31T14:24:18+02:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#webpage"},"isPartOf":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#webpage"},"articleSection":"Cloud Technologies, Databases, DevOps, Scalable Systems, System Architecture, System Designs, System Engineering, Ultra Large Scale Systems, Distributed transactions, Fraud detection, Ledger systems, Payment processing, Ultra-large-scale systems, Robin Schmidt, tm129"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de#listItem","position":1,"name":"Home","item":"https:\/\/blog.mi.hdm-stuttgart.de","nextItem":{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/#listItem","name":"System Designs"}},{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/#listItem","position":2,"name":"System Designs","item":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/","nextItem":{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/#listItem","name":"System Engineering"},"previousItem":{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/#listItem","position":3,"name":"System Engineering","item":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/","nextItem":{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#listItem","name":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform"},"previousItem":{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/#listItem","name":"System Designs"}},{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#listItem","position":4,"name":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform","previousItem":{"@type":"ListItem","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/#listItem","name":"System Engineering"}}]},{"@type":"Organization","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/#organization","name":"Computer Science Blog @ HdM Stuttgart","description":"on computer science and media topics","url":"https:\/\/blog.mi.hdm-stuttgart.de\/"},{"@type":"Person","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/author\/robin_schmidt\/#author","url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/author\/robin_schmidt\/","name":"Robin Schmidt","image":{"@type":"ImageObject","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a0c4d706261a2d836b2eea83799fe2c3cf82a858681a2d685644006285830865?s=96&d=mm&r=g","width":96,"height":96,"caption":"Robin Schmidt"}},{"@type":"WebPage","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#webpage","url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/","name":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart","description":"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/#website"},"breadcrumb":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/#breadcrumblist"},"author":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/author\/robin_schmidt\/#author"},"creator":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/author\/robin_schmidt\/#author"},"datePublished":"2026-07-31T14:24:16+02:00","dateModified":"2026-07-31T14:24:18+02:00"},{"@type":"WebSite","@id":"https:\/\/blog.mi.hdm-stuttgart.de\/#website","url":"https:\/\/blog.mi.hdm-stuttgart.de\/","name":"Computer Science Blog @ HdM Stuttgart","description":"on computer science and media topics","inLanguage":"en-US","publisher":{"@id":"https:\/\/blog.mi.hdm-stuttgart.de\/#organization"}}]},"og:locale":"en_US","og:site_name":"Computer Science Blog","og:type":"article","og:title":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart","og:description":"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.","og:url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/","og:image":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png","og:image:secure_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png","article:published_time":"2026-07-31T12:24:16+00:00","article:modified_time":"2026-07-31T12:24:18+00:00","twitter:card":"summary","twitter:title":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform | Computer Science Blog @ HdM Stuttgart","twitter:description":"Moving money correctly is one of the hardest problems that an Ultra-Large-Scale System (ULSS) must solve. At a volume of billions of transactions, even a vanishingly small error rate translates into substantial financial loss, regulatory exposure, and reputational damage. This paper examines the architecture of a large-scale payment platform using a ride-hailing service as a running example, drawing primarily on the publicly documented engineering practices of Uber. We trace the full life cycle of a card payment, from payment-method onboarding through authorization and capture to the reconciliation of the resulting settlement, and discuss how the platform integrates multiple Payment Service Providers (PSPs) behind a single checkout. We then address the four properties that make such a system trustworthy at scale. Fraud prevention is achieved through a platform-wide risk engine, financial correctness through an immutable double-entry bookkeeping system backed by Uber\u2019s LedgerStore with multiple consistency models, coordination across independently owned services through a workflow that can be interpreted as a saga, and exactly-once execution through the combination of retries and idempotency. We further discuss reconciliation as an external safety net and checksum-based verification of ledger completeness. We close with a discussion of three scale-dependent design trade-offs, including (i) fraud-engine tuning, (ii) build-versus-buy decisions, and (iii) the compliance boundary.","twitter:image":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/auth-capture-sequence-1008x1024.png"},"aioseo_meta_data":{"post_id":"28987","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-07-30 16:53:48","updated":"2026-07-31 12:24:18","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/\" title=\"System Designs\">System Designs<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/\" title=\"System Engineering\">System Engineering<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tReliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/blog.mi.hdm-stuttgart.de"},{"label":"System Designs","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/"},{"label":"System Engineering","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/"},{"label":"Reliable Payment Processing in Ultra-Large-Scale Systems: A Case Study of a Ride-Hailing Platform","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/31\/reliable-payment-processing-in-ultra-large-scale-systems-a-case-study-of-a-ride-hailing-platform\/"}],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":29005,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/07\/30\/polyglot-data-storage-in-ultra-large-scale-systems-a-workload-driven-architecture-for-a-ride-hailing-platform\/","url_meta":{"origin":28987,"position":0},"title":"Polyglot Data Storage in Ultra-Large-Scale Systems: A Workload-Driven Architecture for a Ride-Hailing Platform","author":"Tilman Zorn","date":"30. July 2026","format":false,"excerpt":"Abstract: The assumption that a single type of data storage can serve every workload no longer holds at ultra-large scale. This paper examines storage in a globally distributed ride-hailing platform, where each workload is mapped to a storage engine whose guarantees match its access pattern, consistency requirement, and query shape.\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/grafik.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/grafik.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/grafik.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/07\/grafik.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":36,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2015\/11\/26\/systems-engineering-and-management-ws-20152016\/","url_meta":{"origin":28987,"position":1},"title":"Systems Engineering and Management WS 2015\/2016","author":"Thomas Pohl","date":"26. November 2015","format":false,"excerpt":"The course Systems Engineering and Management is designed to bridge the gap between theoretical studies in Ultra Large\u00a0Scale Systems\u00a0and\u00a0professional state of the art development. Students should find a platform to explore modern tooling and environments for building, integrating, testing and scaling their applications. It turned out as a good idea\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":9663,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/02\/24\/how-to-increase-robustness-of-a-large-scale-system-by-testing\/","url_meta":{"origin":28987,"position":2},"title":"How to increase robustness of a large scale system by testing","author":"Johannes Mauthe","date":"24. February 2020","format":false,"excerpt":"When a distributed software system grows bigger and bigger, one will end up with a big amount of various components which all need to scale independently. In order to achieve these components working smooth together, it is necessary to figure out at which time a component needs to be scaled,\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/lh3.googleusercontent.com\/8h_z-5W6olzeJeyXw7NwIHYdRJs3FyHcLk-NSsfw_eWM-2oCE1FnZFBxC3qw2IqdnSal43O8bc5uMGFaBvbKLZjhRu4Q2nlitp7AbAeNTc3BOFW2u_6xtpR3jIEvNLDPpsrmL8c9","width":350,"height":200},"classes":[]},{"id":23138,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/31\/an-overview-of-large-scale-deep-learning\/","url_meta":{"origin":28987,"position":3},"title":"An overview of Large Scale Deep Learning","author":"mk374","date":"31. March 2022","format":false,"excerpt":"article by Annika Strau\u00df (as426) and Maximilian Kaiser (mk374) Introduction Improving Deep Learning with ULS for superior model training Single Instance Single Device (SISD) Multi Instance Single Device (MISD) Multi Instance Multi Device (MIMD) Single Instance Multi Device (SIMD) Model parallelism Data parallelism Improving ULS and its components with the\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":23961,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/10\/microservices-any-good\/","url_meta":{"origin":28987,"position":4},"title":"Microservices &#8211; any good?","author":"Kim Bastiaanse","date":"10. February 2023","format":false,"excerpt":"As software solutions continue to evolve and grow in size and complexity, the effort required to manage, maintain and update them increases. To address this issue, a modular and manageable approach to software development is required.\u00a0Microservices architecture provides a solution by breaking down applications into smaller, independent services that can\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":24485,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/03\/05\/amd-epyc-9004-a-small-scale-supercomputer\/","url_meta":{"origin":28987,"position":5},"title":"AMD EPYC 9004 \u2013 a small scale supercomputer?","author":"Maximilian von Detten","date":"5. March 2023","format":false,"excerpt":"For a long time the server and desktop space was dominated by intel CPUs. AMD lacked severely behind the competition with its processors but changed everything up, when they launched their ZEN architecture processors in February 2017. Suddenly they started to compete on the consumer side of processors again and\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":1035,"user_id":1207,"is_guest":0,"slug":"robin_schmidt","display_name":"Robin Schmidt","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a0c4d706261a2d836b2eea83799fe2c3cf82a858681a2d685644006285830865?s=96&d=mm&r=g","author_category":"","user_url":"","last_name":"Schmidt","first_name":"Robin","job_title":"","description":""},{"term_id":1044,"user_id":1216,"is_guest":0,"slug":"tobias_mener","display_name":"tm129","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b267d920fa9f5e0bb9eda975e37b34041ee1c4c1720c71e3be6a623608987195?s=96&d=mm&r=g","author_category":"","user_url":"","last_name":"Me\u00dfner","first_name":"Tobias","job_title":"","description":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/28987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1207"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=28987"}],"version-history":[{"count":15,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/28987\/revisions"}],"predecessor-version":[{"id":29111,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/28987\/revisions\/29111"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=28987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=28987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=28987"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=28987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}