<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reconciliation on Corebaseit — POS · EMV · Payments · AI · Telecommunications</title><link>https://corebaseit.com/tags/reconciliation/</link><description>Recent content in Reconciliation on Corebaseit — POS · EMV · Payments · AI · Telecommunications</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>contact@corebaseit.com (Vincent Bevia)</managingEditor><webMaster>contact@corebaseit.com (Vincent Bevia)</webMaster><lastBuildDate>Thu, 23 Jul 2026 18:30:00 +0200</lastBuildDate><atom:link href="https://corebaseit.com/tags/reconciliation/index.xml" rel="self" type="application/rss+xml"/><item><title>Every Payment Has a Liability Owner</title><link>https://corebaseit.com/corebaseit_posts/every-payment-has-a-liability-owner/</link><pubDate>Thu, 23 Jul 2026 18:30:00 +0200</pubDate><author>contact@corebaseit.com (Vincent Bevia)</author><guid>https://corebaseit.com/corebaseit_posts/every-payment-has-a-liability-owner/</guid><description>&lt;img src="https://corebaseit.com/diagrams/the-hidding-edge.png" alt="Featured image of post Every Payment Has a Liability Owner" />&lt;p>A card-present payment is often treated as a request/response system: send an authorization, receive Approved or Declined, print a receipt. That model is incomplete. A single tap crosses a terminal, payment application, SDK or kernel, acquirer host, card scheme, and issuer. Each hop can succeed, fail, time out, or succeed without the previous hop ever learning the outcome.&lt;/p>
&lt;p>This post is about those disagreements — the edge cases where software behavior turns into financial risk. It covers why &lt;code>UNKNOWN&lt;/code> is more expensive than &lt;code>DECLINED&lt;/code>, why a retry is a liability decision, how SoftPOS adds failure modes that dedicated terminals do not have, and how store-and-forward and reconciliation force you to decide who absorbs a loss. The happy path of EMV is documented elsewhere; the design work starts when visibility is lost.&lt;/p>
&lt;h2 id="a-payment-is-a-distributed-state-machine">A payment is a distributed state machine
&lt;/h2>&lt;p>The useful mental model is not card → POS → acquirer → scheme → issuer. It is a chain of participants that can each hold a different view of the same payment:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Customer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Merchant
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Terminal / SoftPOS device
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → POS application
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Payment SDK / EMV kernel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Acquirer host
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Card scheme
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Issuer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Failure can occur at any layer. When it does, two questions appear immediately, and they are not the same question:&lt;/p>
&lt;ol>
&lt;li>Did the customer pay?&lt;/li>
&lt;li>Who loses the money if the answers diverge?&lt;/li>
&lt;/ol>
&lt;p>In production systems, an authorization that leaves the device and never returns a usable response is not a clean failure. It is a loss of visibility. The issuer may have approved; the merchant application may still be sitting on a timeout. That gap is where duplicate authorizations, blocked funds, chargebacks, and reconciliation debt come from. The same theme shows up in the &lt;a class="link" href="https://corebaseit.com/corebaseit_posts/double-charging/" >double-charging post&lt;/a>: an error often means you lost sight of the ledger, not that nothing happened on it.&lt;/p>
&lt;h2 id="unknown-is-the-expensive-status">&lt;code>UNKNOWN&lt;/code> is the expensive status
&lt;/h2>&lt;p>Payment UIs are trained on two outcomes. Real platforms need more:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>APPROVED
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DECLINED
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>UNKNOWN
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>REVERSED
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>EXPIRED
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>CHARGEBACK
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>UNKNOWN&lt;/code> is the dangerous one. A concrete sequence:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>POS sends authorization
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Issuer approves
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Response is lost on the network
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → POS times out
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Customer walks away
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At that moment the system cannot answer the operational questions that matter at the counter: Was the cardholder charged or held? Is a retry safe? Should inventory be released? Should a receipt print?&lt;/p>
&lt;p>Timeouts themselves are layered. Connection timeouts, request timeouts, and issuer timeouts sit on different clocks; a gateway &lt;code>504&lt;/code> is yet another visibility cut. None of those signals tells you whether the issuer already posted an approval. Treating the timeout as &lt;code>FAILED&lt;/code> and firing a new authorization with a new transaction reference is how one purchase becomes two.&lt;/p>
&lt;p>The safer pattern, drawn from the transaction lifecycle model used in production POS and acquirer stacks, is deterministic recovery rather than optimistic retry:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>AUTH_REQUESTED → TIMEOUT → status query / reconcile → REVERSAL_SENT → REVERSED
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>When the outcome remains uncertain, reverse. Do not invent a final state. ISO 8583 reversals (&lt;code>0400&lt;/code> / &lt;code>0420&lt;/code>) exist for exactly this class of uncertainty: unwind a hold when the acquirer or terminal cannot guarantee what the issuer did. The distinctions between reversal, refund, and chargeback — and where each sits relative to settlement — are covered in &lt;a class="link" href="https://corebaseit.com/corebaseit_posts/reversals-refunds-chargebacks-payment-lifecycle/" >Reversals, Refunds, and Chargebacks&lt;/a>.&lt;/p>
&lt;h2 id="every-retry-is-a-financial-decision">Every retry is a financial decision
&lt;/h2>&lt;p>Outside payments, &amp;ldquo;retry until success&amp;rdquo; is a resilience habit. Inside payments it is often a money-moving decision.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Authorization sent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Timeout
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Retry with a new reference
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> → Original approval arrives later
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now there are two authorizations for one customer intent. Idempotency is the control that makes retries safe: the host must recognize the second message as the same payment. In ISO 8583 terms that usually means reusing identifiers such as STAN and RRN (and, on many stacks, a composite key with terminal ID and date) so the host can return the cached outcome instead of posting again.&lt;/p>
&lt;p>Interpretation, not a universal law: retries before the customer commits — while nothing has left the device — are cheap. After the state machine enters &lt;code>AUTH_REQUESTED&lt;/code>, every error is an uncertain outcome. Past that boundary, read-before-write beats blind resend: query status, reconcile, reverse when in doubt, then decide whether another attempt is still justified with the same identifiers.&lt;/p>
&lt;p>Exponential backoff alone does not solve this. Backoff without idempotency and recovery only spaces out the duplicate risk.&lt;/p>
&lt;h2 id="every-failure-has-an-owner">Every failure has an owner
&lt;/h2>&lt;p>Payment engineering becomes interesting when the incident review ends with a financial question: who absorbs the loss?&lt;/p>
&lt;p>Depending on the stage and the scheme rules, that can be the merchant, the acquirer, the issuer, the scheme, or the payment provider. Architecture choices change that exposure.&lt;/p>
&lt;p>&lt;strong>Confirmed fact (scheme programme rules, not a statute):&lt;/strong> card networks did not force EMV migration by legal mandate. They shifted counterfeit-fraud liability toward the party that failed to deploy EMV capability on its side of the transaction. Certification is therefore risk mitigation as much as a conformance exercise.&lt;/p>
&lt;p>&lt;strong>Interpretation for terminal design:&lt;/strong> if the merchant supports EMV correctly, counterfeit liability often sits with the issuer after the liability shift. That protection is conditional. Magstripe fallback after a chip read failure is one of the classic ways merchants re-inherit exposure — and the rules are not identical across schemes. Mastercard historically allowed constrained fallback after documented EMV malfunction; Visa has restricted or prohibited fallback in EMV-capable environments in many markets. SoftPOS under PCI MPoC has no magstripe path at all: EMV/NFC only. Treat &amp;ldquo;fallback&amp;rdquo; as a scheme- and region-controlled exception, not a default resilience feature.&lt;/p>
&lt;p>Other financial edge cases that show up repeatedly in operations:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Lost approval&lt;/strong> — issuer approved; merchant never learned; customer sees a hold; merchant may retry.&lt;/li>
&lt;li>&lt;strong>Lost reversal&lt;/strong> — merchant cancelled or voided locally; issuer never received the unwind; funds stay blocked.&lt;/li>
&lt;li>&lt;strong>Authorization / settlement mismatch&lt;/strong> — authorized €100, cleared €95, or currency conversion surprises between merchant EUR and issuer USD.&lt;/li>
&lt;li>&lt;strong>Chargebacks months later&lt;/strong> — the only defense is a complete, immutable audit trail of what the terminal, host, and scheme each recorded.&lt;/li>
&lt;/ul>
&lt;h2 id="edge-cases-that-break-the-happy-path-model">Edge cases that break the happy-path model
&lt;/h2>&lt;h3 id="approval-lost-after-issuer-authorization">Approval lost after issuer authorization
&lt;/h3>&lt;p>Issuer state: &lt;code>APPROVED&lt;/code>. Merchant state: &lt;code>TIMEOUT&lt;/code>. Customer state: &amp;ldquo;my banking app shows the money is gone.&amp;rdquo; Support cannot resolve this from the POS UI alone. Status inquiry and reconciliation against acquirer records are required before any second attempt.&lt;/p>
&lt;h3 id="application-crash-or-process-death-after-approval">Application crash or process death after approval
&lt;/h3>&lt;p>Authorization succeeds. Android kills the SoftPOS process before durable local finalization. The merchant reopens the app and asks whether to &amp;ldquo;pay again.&amp;rdquo; If the answer is driven by UI state instead of host state, you recreate the duplicate path. Never acknowledge merchant success before durable storage, and never treat process death as proof that the issuer did not approve.&lt;/p>
&lt;h3 id="early-card-removal-contact">Early card removal (contact)
&lt;/h3>&lt;p>During a chip transaction, removing the card before Generate AC completes leaves the EMV dialogue unfinished. The correct recovery is restart of the card dialogue — not a new online authorization invented from partial tags.&lt;/p>
&lt;h3 id="duplicate-taps-and-double-button-presses">Duplicate taps and double button presses
&lt;/h3>&lt;p>Two NFC events, or three presses of Pay, can produce multiple authorization requests for one physical purchase. Duplicate detection at the application layer and an idempotency key at the host layer are both required. User error still becomes a distributed-systems problem once the first request has left the device.&lt;/p>
&lt;h3 id="battery-death-between-authorization-and-completion">Battery death between authorization and completion
&lt;/h3>&lt;p>Exactly between online approval and local completion/finalization, power loss leaves the backend holding an authorization and the merchant holding ambiguity. The durable state should be &lt;code>UNKNOWN&lt;/code> / recovery-required, not silently rewritten as declined.&lt;/p>
&lt;h3 id="recovery-succeeds-after-the-customer-already-retried">Recovery succeeds after the customer already retried
&lt;/h3>&lt;p>The original authorization eventually completes. The customer&amp;rsquo;s second attempt also succeeds. Reconciliation then has to decide which authorization represents the purchase and which must be reversed. This is the nightmare scenario that recovery SLAs and manual investigation queues exist to contain.&lt;/p>
&lt;h2 id="softpos-adds-failure-modes-dedicated-terminals-do-not-have">SoftPOS adds failure modes dedicated terminals do not have
&lt;/h2>&lt;p>A traditional payment terminal owns its hardware boundary. SoftPOS runs on a consumer or COTS device, so the operating system becomes part of the payment flow.&lt;/p>
&lt;p>Failure modes that matter in practice:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Android lifecycle and process death&lt;/strong> — the activity resumes; the SDK session, attestation result, and in-memory terminal binding may not. Treating &lt;code>onResume&lt;/code> as &amp;ldquo;ready to tap&amp;rdquo; is a payment decision made on stale state.&lt;/li>
&lt;li>&lt;strong>Attestation and Play Integrity&lt;/strong> — if integrity checks fail or Google services are unavailable (offline, outage), whether payment continues is a policy decision owned jointly by the SoftPOS solution and the acquirer, not a silent default. PCI MPoC treats device integrity as continuously monitored, not as a one-time install gate.&lt;/li>
&lt;li>&lt;strong>NFC ownership conflicts&lt;/strong> — two apps competing for reader mode can abort or corrupt a tap mid-dialogue.&lt;/li>
&lt;li>&lt;strong>Permissions and OEM behavior&lt;/strong> — NFC, network, location, battery optimization, and Play Services can change while the app is backgrounded. Samsung, Pixel, and industrial OEMs do not fail identically.&lt;/li>
&lt;li>&lt;strong>Tampered application / rooted device&lt;/strong> — code signing, integrity verification, and attestation are the controls; continuing after a hard attestation failure is accepting elevated fraud and compliance risk.&lt;/li>
&lt;/ul>
&lt;p>These are not theoretical. They are the SoftPOS equivalents of a terminal reboot mid-transaction, except the reboot can be invisible to the cashier.&lt;/p>
&lt;h2 id="store-and-forward-is-deferred-risk-not-offline-magic">Store-and-forward is deferred risk, not offline magic
&lt;/h2>&lt;p>When connectivity is gone, merchants still want to accept payments. Two mechanisms get conflated under the word &amp;ldquo;offline,&amp;rdquo; and they have different liability profiles.&lt;/p>
&lt;p>&lt;strong>True offline EMV&lt;/strong> — card and terminal approve locally with a Transaction Certificate (TC). Risk is bounded by card and terminal EMV parameters (floor limits, consecutive offline caps, AUC). The issuer may never see a real-time auth.&lt;/p>
&lt;p>&lt;strong>Store-and-forward (deferred authorization)&lt;/strong> — the terminal accepts the sale now, stores the ARQC and EMV data, and sends a normal online authorization when connectivity returns. The issuer can still decline hours later. Who pays for goods already handed over depends on the merchant–acquirer agreement and the controls on the queue (amount caps, count caps, encryption at rest, idempotent upload).&lt;/p>
&lt;p>Book and field experience converge on the same warning: queued authorizations carry measurable decline exposure after the fact; treat that as merchant (or contractually assigned) risk, not as a free resilience feature. SoftPOS on COTS often supports SAF or nothing — not true offline EMV. The full distinction is in &lt;a class="link" href="https://corebaseit.com/corebaseit_posts/offline-emv-vs-store-and-forward/" >Offline EMV vs Store-and-Forward&lt;/a>.&lt;/p>
&lt;p>Queue-specific edge cases worth designing explicitly:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Offline queue → phone stolen → pending payments never uploaded
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Offline queue → sync timeout → retry → acquirer sees duplicates without idempotency
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Offline queue → storage corruption → pending payments disappear
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Encrypt the queue, persist it durably, and upload with the same idempotency discipline used for online retries.&lt;/p>
&lt;h2 id="reconciliation-is-where-architecture-meets-finance">Reconciliation is where architecture meets finance
&lt;/h2>&lt;p>Every mature payment platform eventually discovers that merchant records, acquirer records, and issuer records can disagree:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Merchant: approved Acquirer: declined
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Merchant: missing settlement
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Settlement without authorization
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Authorization without settlement
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Duplicate settlement
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Automated reconciliation is not a finance afterthought. It is the last control that turns ambiguous distributed state into an explainable euro. Chargebacks months later are won or lost on whether you can prove exactly what happened at each hop — cryptograms, response codes, STAN/RRN correlation, timestamps, and the recovery actions taken after uncertainty.&lt;/p>
&lt;h2 id="three-concerns-that-stay-separate">Three concerns that stay separate
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Concern&lt;/th>
&lt;th>Goal&lt;/th>
&lt;th>Typical mechanisms&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Correctness&lt;/td>
&lt;td>The payment reaches one final business state exactly once&lt;/td>
&lt;td>Idempotency keys, state machines, recovery, reconciliation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Resilience&lt;/td>
&lt;td>The system keeps operating under failure&lt;/td>
&lt;td>Controlled retries, outbox/durable queues, store-and-forward with caps, circuit breakers&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Liability&lt;/td>
&lt;td>Financial responsibility is clear when participants disagree&lt;/td>
&lt;td>EMV liability rules, PCI controls, immutable audit logs, scheme dispute evidence&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Good payment systems do not eliminate failures. They make failures deterministic: a known state, a known recovery path, and a known owner of the residual financial risk.&lt;/p>
&lt;p>The question that usually matters in an incident is not whether an API returned HTTP 200. It is whether, months later, you can still explain every euro.&lt;/p>
&lt;h2 id="references">References
&lt;/h2>&lt;ol>
&lt;li>EMVCo, &lt;em>EMV Integrated Circuit Card Specifications for Payment Systems&lt;/em> (Books 1–4) — card–terminal protocol, cryptograms, and risk management.&lt;/li>
&lt;li>ISO, &lt;em>ISO 8583&lt;/em> — financial transaction messaging, including reversal MTIs &lt;code>0400&lt;/code> / &lt;code>0420&lt;/code> and correlation fields (STAN, RRN, original data elements).&lt;/li>
&lt;li>PCI SSC, &lt;em>PCI Mobile Payments on COTS (MPoC)&lt;/em> — SoftPOS security, attestation, and acceptance constraints (including no magstripe path).&lt;/li>
&lt;li>Card network programme rules (Visa, Mastercard, and others via your acquirer) — liability shift, fallback policy, authorization validity, and chargeback reason codes are scheme- and region-controlled; confirm current guides before implementation decisions.&lt;/li>
&lt;li>&lt;em>Point-of-Sale Systems Architecture: A Practical Guide to Secure, Certifiable POS Systems&lt;/em> — Chapter 3 (EMV principles and magstripe fallback constraints), Chapter 8 (transaction lifecycle, timeouts, idempotency, reversal recovery), Chapter 14 (offline EMV vs store-and-forward and queue risk), Chapter 16 (scheme integration, reversal automation, reconciliation), Chapter 17 (liability shift as risk mitigation rather than legal mandate).&lt;/li>
&lt;/ol>
&lt;h2 id="further-reading">Further reading
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://corebaseit.com/corebaseit_posts/double-charging/" >Double Charges: The Hardest Problem in Payments Is Remembering You Already Did&lt;/a> — read-before-write recovery after lost visibility&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/corebaseit_posts/offline-emv-vs-store-and-forward/" >Offline EMV vs Store-and-Forward&lt;/a> — two offline mechanisms, two liability profiles&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/corebaseit_posts/reversals-refunds-chargebacks-payment-lifecycle/" >Reversals, Refunds, and Chargebacks&lt;/a> — pre-settlement unwind vs post-settlement money movement&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/corebaseit_posts/what-happens-in-2-3-seconds-of-card-payment/" >What Actually Happens in the 2–3 Seconds of a Card Payment&lt;/a> — the happy-path authorization chain these edge cases interrupt&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/corebaseit_posts/stip_when_the_bank_goes_offline/" >STIP: When the Bank Goes Offline&lt;/a> — scheme stand-in decisions when the issuer host is unreachable&lt;/li>
&lt;/ul></description></item></channel></rss>