Real-Time Payment Reconciliation: The Complete Guide
A mid-market marketplace loses 0.8-1.4% of net revenue to reconciliation errors, not fraud — mostly because daily batch reconciliation detects problems 36-72 hours after they happen. By then, a refund has been double-processed, a partial capture has never settled, or a BNPL instalment has been attributed to the wrong merchant. The cost is concrete: Adyen’s 2024 Revenue Accelerate report puts the median manual reconciliation cost at $18 per unresolved item, and Stripe’s internal benchmarks show that finance teams at $100M+ GMV companies spend 15-25% of their operational headcount on reconciliation that should be automated.
This guide covers the full architecture of a production real-time reconciliation system — from event ingestion through the matching engine to the ledger and audit trail. It is written for the engineering or finance leader who needs to build or buy a system that handles mixed payment rails (SEPA Instant, cards, BNPL, crypto), chargeback flows, and multi-currency settlement, and who needs it to be auditable under PCI-DSS and SOX.
What is real-time payment reconciliation?
Payment reconciliation is the process of verifying that every transaction recorded in your internal ledger matches a corresponding entry on an external statement — acquirer report, bank statement, PSP webhook, or scheme file. The match confirms that money moved as expected, in the expected amount, at the expected time.
Classic reconciliation runs on a T+1 or T+2 schedule: you download the previous day’s settlement file, run a batch match, and investigate exceptions the next morning. Real-time reconciliation replaces that batch job with a continuous stream: events arrive as they happen, the matching engine processes them within seconds, and breaks surface immediately rather than 24-36 hours later.
The key outputs are the same in both models, but the latency is orders of magnitude different:
- Matched: internal record paired with an external confirmation, amounts and identifiers agree.
- Unmatched: internal record with no external counterpart (or vice versa) within the expected window.
- Disputed: matched by ID but with a discrepancy in amount, currency, or timing.
- Pending: transaction is within its normal settlement window and has not yet generated an external event.
The shift from batch to real-time is not just a latency improvement. It changes the economics of float management, the feasibility of instant merchant payouts, and the precision of regulatory reporting.
Why batch reconciliation breaks at scale
Batch reconciliation was designed for a world with one payment rail, one settlement file per day, and a team that worked business hours. That world no longer exists for any company processing more than 50K monthly transactions across multiple rails.
Float ambiguity: In a daily batch, transactions initiated on day T may settle on T+1 or T+2 depending on the rail. Without continuous matching, your internal ledger overstates or understates available cash for the entire settlement window. At $10M daily GMV, a 1-day float misallocation of 0.5% is $50K sitting in the wrong bucket.
Refund race conditions: A customer requests a refund at 11:55 PM. The original transaction is in yesterday’s settled batch. The refund initiates tonight and will appear in tomorrow’s batch. A batch system can match these only if it joins across two separate batch files, which most legacy systems do not do cleanly. The result: the refund appears as an unexplained debit, and the original appears as unmatched revenue.
Multi-rail complexity: SEPA Instant settles in under 10 seconds. A card authorisation may settle 2-3 business days later. A BNPL instalment settles weekly. A crypto payment may settle in 15 seconds or 15 minutes depending on network congestion. Treating these as a single batch produces timing collisions that are impossible to resolve without per-rail settlement logic.
Partial captures: An e-commerce order authorised for €150 may settle in two partial captures of €90 and €60 if items ship separately. A batch matcher looking for a single €150 credit will never find it. The €90 and €60 appear as two unexplained debits against a single internal record.
Currency conversion timing: FX rates at settlement differ from rates at authorisation. A $1,000 USD card transaction authorised at 1.08 EUR/USD that settles 2 days later at 1.05 EUR/USD produces a €28.57 discrepancy. Without per-transaction FX recording, this becomes an unexplained break every time.
Chargeback windows: Visa chargebacks can arrive up to 120 days after the original transaction. Mastercard allows 45-120 days. A batch system that only looks back 30 days will simply drop these as unmatched debits, creating a ghost liability on your books.
Reference architecture
A production real-time reconciliation system has six layers. Each layer has a clear responsibility and a defined interface to the next.
Layer 1 — Sources. The system must ingest from all external financial sources: acquirer settlement reports (usually SFTP or API — Adyen, Stripe, Braintree all offer webhook push), bank statement APIs (PSD2 open banking, SWIFT MT940/942, BAI2 for US banks), PSP webhooks for authorisation, capture, and refund events, and your own internal ledger events (order created, refund approved, payout initiated). Every source emits different formats; the first step is normalisation into a canonical transaction model (described below).
Layer 2 — Ingestion. A streaming platform — Apache Kafka or AWS Kinesis — receives normalised events from all sources. Each source has its own topic or stream. Events are immutable: once written, they are never modified. A connector layer (Kafka Connect, Lambda functions, or a custom ingestion service) transforms raw source payloads into the canonical model before writing to the stream. Idempotency keys at this layer prevent duplicate ingestion when sources retry failed deliveries.
Layer 3 — Matching engine. The core of the system. Events from internal and external topics are consumed by the matching engine, which attempts to pair them using a cascade of strategies (detailed in the next section). Matches are written to a reconciliation store (PostgreSQL with partitioning by settlement date, or a purpose-built store like TimescaleDB for time-series workloads). Unmatched events that exceed their expected settlement window are promoted to breaks.
Layer 4 — Break management. Breaks enter a workflow orchestrator — Temporal, Camunda, or a simpler state machine — that applies configurable resolution rules: retry matching with a wider time window, route to a specific team queue, auto-resolve if amount difference is below a tolerance threshold (e.g., <$0.05 due to rounding), or escalate after N hours without resolution. Break management is where SLA commitments to merchants or regulators are enforced.
Layer 5 — Ledger update. Confirmed matches trigger double-entry ledger postings with idempotency keys. Every posting has a transaction_id, a debit account, a credit account, an amount, and a currency. The ledger is append-only; corrections are counter-entries, never edits. This structure is required for SOX compliance and PCI-DSS audit trails.
Layer 6 — Reporting. Near-real-time dashboards (Metabase, Apache Superset, or a custom BI layer) read from the reconciliation store and the ledger. Dashboards show match rate, break aging, pending settlement, and FX variance. An immutable audit log — events written to S3 or GCS with object-lock enabled — provides the long-term record for regulatory examination.
For a deeper dive into the streaming and event-driven layer specifically, see our companion article on real-time data pipelines.
Matching strategies that work
A production matching engine does not apply a single strategy. It applies a cascade, from most precise to most approximate, and stops when a match is found with sufficient confidence.
| Strategy | Precision | Recall | Compute cost | When to use |
|---|---|---|---|---|
| Hard match (transaction_id equality) | 1.00 | 0.70-0.85 | Very low | PSP webhooks with stable IDs |
| Soft match (amount + merchant + ±24h) | 0.97 | 0.90-0.95 | Low | Bank statements, acquirer files |
| Probabilistic (Jaccard on memo + Levenshtein on merchant name) | 0.91-0.95 | 0.95-0.98 | Medium | Legacy bank feeds, missing IDs |
| Graph-based (split captures / refund chains) | 0.88-0.93 | 0.93-0.97 | High | BNPL instalments, partial captures |
Hard match looks for an exact external_id or payment_reference that appears in both the internal record and the external settlement event. This works reliably for PSPs that echo back your own reference in their webhook payload — Stripe’s payment_intent ID, Adyen’s pspReference. Hard match alone covers 70-85% of volume at well-integrated PSPs.
Soft match applies when IDs are absent or inconsistent (common with bank statement lines). The engine attempts to match on a combination of amount (within a tolerance of ±0.01%), merchant identifier (MCC code + acquirer merchant ID), and a time window of ±24 hours around the expected settlement date. Precision stays high because the combination of three fields rarely collides accidentally.
Probabilistic matching uses text similarity on memo or description fields. Jaccard similarity on 3-gram tokenisation of the memo string handles abbreviated merchant names (“AMZN*MKTP US” matching “Amazon Marketplace”). Levenshtein distance on merchant names handles typos and abbreviations. A confidence score is computed per match candidate; only matches above a threshold (typically 0.85) are auto-accepted. Below-threshold candidates go to the break queue for human review.
Graph-based matching handles transactions that are structurally related: a €150 authorisation that produces a €90 capture and a €60 capture, or a €200 purchase that generates a €50 refund and a €150 net settlement. The engine builds a transaction graph where nodes are events and edges are parent_transaction_id references, then matches the subgraph against the expected settlement pattern. This is the most expensive strategy and is applied only when simpler strategies fail.
The canonical transaction model
Every event in the system — internal or external, regardless of source rail — must be normalised to a single canonical model before it enters the matching engine. Without this, you are matching apples to oranges and any precision metric is meaningless.
The minimum viable canonical model has fourteen fields:
class Transaction(BaseModel):
transaction_id: UUID # UUIDv7 (time-sortable) — internal primary key
external_id: str | None # PSP or bank reference; nullable for internal-only events
idempotency_key: str # Prevents duplicate ingestion on retries
rail: Rail # Enum: SEPA_INSTANT, SEPA_CREDIT, CARD_VISA, CARD_MC,
# BNPL_KLARNA, BNPL_AFTERPAY, CRYPTO_ETH, etc.
direction: Literal["debit", "credit"]
gross_amount: Decimal # Amount as presented to the customer / merchant
currency: str # ISO 4217 (EUR, USD, GBP, BRL, INR)
net_amount: Decimal # After fees, in settlement currency
fee_amount: Decimal # PSP / scheme fee, explicit
fx_rate: Decimal | None # Settlement FX rate; None for same-currency transactions
merchant_id: str # Internal merchant identifier
merchant_name: str # As reported by source — may differ across rails
initiated_at: datetime # When the transaction was created by the payer
settled_at: datetime | None # When external settlement was confirmed; None if pending
status: TxStatus # Enum: PENDING, SETTLED, REFUNDED, DISPUTED, VOIDED
parent_transaction_id: UUID | None # For refunds, captures, chargebacks
supersedes_id: UUID | None # For amendments (new record replaces old)
Rationale for key fields:
transaction_idas UUIDv7 gives time-sortable keys without a sequence generator, enabling efficient range queries on settlement date without a separate index.external_idis nullable because internal ledger events (e.g., a fee accrual) have no external counterpart and should still flow through the same model.idempotency_keyis separate fromtransaction_idbecause the same logical transaction may be retried with a different external_id by the PSP. The idempotency key is derived from your own data (e.g.,order_id + rail + direction) and is stable across retries.gross_amountandnet_amountare stored separately because the spread between them is a direct input to fee reconciliation — a separate reconciliation workstream from settlement reconciliation.settled_atbeing nullable rather than defaulting toinitiated_atis critical: it prevents the system from treating a pending transaction as settled and creating a phantom match.
SEPA Instant / FedNow / Pix / UPI — multi-rail considerations
Each instant payment rail has idiosyncrasies that affect your reconciliation pipeline in specific ways.
SEPA Instant (RT1 / TIPS). Settles in under 10 seconds, 24/7/365. No batch window. The maximum transaction amount is €100,000 per the EBA CLEARING scheme rules (as of 2024). Every SEPA Instant credit transfer carries an end-to-end ID in the <EndToEndId> field of the pain.001 message — this is your hard-match key. If your PSP does not echo this field in their webhook, you are forced into soft matching immediately. Peak volume Monday 09:00-10:00 CET: design for 3-5x average throughput.
FedNow (US). Launched July 2023. Unlike ACH, FedNow settles individually, not in batches. The transaction limit is $500,000 by default (participating banks may set lower limits). FedNow uses ISO 20022 message formatting, which means rich structured data in the remittance information field — better hard-match coverage than legacy ACH. Key difference from SEPA Instant: not all US banks participate yet, so your pipeline must handle graceful fallback to next-day ACH for non-participating institutions.
Pix (Brazil). Operated by Banco Central do Brasil. Settles 24/7 in under 1 second for retail transactions. The txid field in the Pix API is the canonical hard-match key — it is mandatory for merchant-initiated transactions (Pix Cobrança). Pix also generates a EndToEndId (E2EID) in the format Exxxxxxxxxxxxxxxxxx that appears on both payer and receiver statements. The E2EID is your primary reconciliation key; the txid is secondary. At 3 billion monthly transactions (Banco Central data, 2024), Pix is the highest-volume instant rail globally — Brazilian operations must treat it as the primary rail, not an edge case.
UPI (India). Operated by NPCI. Settles in under 30 seconds. Every UPI transaction generates a UPI transaction reference number (UPI TxnID) that is present on both sides of the transaction. The key reconciliation challenge for UPI is the dispute lifecycle: NPCI’s complaint system (UDIR) has mandatory response SLAs that differ from card scheme chargeback windows — disputes must be responded to within 24 hours of filing, not 30-120 days. Build your break management workflow with UPI-specific SLA rules.
Chargebacks, disputes, refunds, retries — the messy cases
The three messiest cases in production reconciliation are chargebacks, cross-period refunds, and idempotent retries. All three require explicit data modelling to avoid double-counting or phantom breaks.
Chargebacks arrive as an unexpected debit from the acquirer, weeks or months after the original settlement. Model them as a three-event sequence: DISPUTE_OPENED (customer files claim), CHARGEBACK_POSTED (acquirer debits your account), CHARGEBACK_RESOLVED (won, lost, or settled). The CHARGEBACK_POSTED event creates a new reconciliation record with parent_transaction_id pointing to the original settlement. The matching engine must look back N days (scheme-specific: 120 for Visa, up to 120 for Mastercard) to find the parent. If the original settlement is outside your hot storage window, the system must query cold storage before declaring a break.
Cross-period refunds are refunds where the original transaction settled in a prior reporting period. Never reverse the original ledger posting. Instead, post a contra-entry in the current period with a parent_transaction_id reference. The reconciliation record for the refund is matched against its own external settlement event (the refund credit on the acquirer statement), not against the original. The original settlement remains matched and closed. This is the only approach that produces consistent period-end balances without restatements.
Idempotent retries happen when a PSP retries a failed webhook delivery or when your ingestion layer processes the same settlement file twice (common with SFTP-based feeds that don’t have delivery guarantees). The idempotency_key field in the canonical model is your defence: before inserting a new record, the ingestion layer checks whether a record with the same idempotency_key already exists. If it does, the event is dropped silently. This must happen at the database level with a unique constraint, not only in application code, to survive concurrent processing.
Partial captures require graph-based matching as described above. The additional complexity is that partial captures may arrive out of order — the second capture may settle before the first if shipments are fulfilled from different warehouses. Design the graph matcher to be commutative: the result must be the same regardless of which capture arrives first.
Metrics that matter
Track these eight metrics in your reconciliation dashboard. All others are vanity.
Match rate — percentage of transactions auto-matched within the SLA window. Target: >99.2% for card and bank-transfer rails. Below 97% indicates a systematic data quality problem that no amount of matching sophistication will fix.
Time-to-match p50 / p99 — median and 99th percentile latency from settlement event to confirmed match. Target p50 <90 seconds, p99 <5 minutes for SEPA Instant and FedNow rails. Card rails (which settle on a T+1/T+2 schedule) have inherently higher p99 but should still surface breaks within 60 minutes of settlement file receipt.
Break aging — age distribution of open breaks, bucketed into <1h, 1-24h, 24-72h, >72h. Breaks in the >72h bucket are your financial reporting risk. Any break in that bucket at month-end should trigger immediate review.
Auto-resolve rate — percentage of breaks resolved by workflow automation without human intervention. Target >75%. If below 50%, your break management rules are too conservative or your canonical model is producing too many ambiguous matches.
Manual review minutes per 1,000 transactions — total analyst time divided by transaction volume. Benchmark: <2 minutes per 1K transactions for a mature system. New systems typically start at 8-15 minutes and improve as matching rules are tuned.
Financial accuracy — sum of matched amounts versus sum of all expected settlement amounts, measured at period end. This number should be 100.000% ±0.001%. Any variance beyond that is an accounting error, not a reconciliation metric.
Float misallocation — total value of transactions in PENDING status beyond their expected settlement window. Measured in currency, not count. This is the number your CFO cares about; everything else is engineering.
False positive rate — percentage of confirmed matches subsequently found to be incorrect (identified during audit). Target <0.1%. False positives are worse than unmatched items because they produce silent accounting errors.
Build vs buy
| Dimension | Build in-house | Buy (Modern Treasury, Fragment, Trovata, Kyriba) |
|---|---|---|
| Time to production | 9-18 months | 6-10 weeks |
| Upfront cost | $400K-$1.2M (team + infra) | $0-$50K implementation |
| Ongoing cost at 1M tx/mo | $15K-$30K/mo infra + team | $8K-$25K/mo SaaS fees |
| Multi-bank connectivity | Build each connector | Included (50-200 banks) |
| Customisation | Full control | Limited by vendor model |
| Proprietary matching logic | Possible | Not possible |
| Compliance audit support | Your responsibility | Vendor-supported |
| Scaling beyond 10M tx/mo | Your architecture | Verify with vendor |
When to build in-house: transaction volume >2M/month; matching logic is a competitive moat (e.g., proprietary merchant fingerprinting); you have a dedicated data engineering team of 2+; your settlement model has irreducible complexity (e.g., multiple acquirer relationships with custom settlement windows); you are operating in a jurisdiction not covered by SaaS vendors (some LATAM and APAC markets).
When to buy: you are under 2M monthly transactions; time-to-market is constrained; you lack data engineering capacity; multi-bank connectivity is a requirement you do not want to build and maintain; your reconciliation model maps cleanly to a standard double-entry ledger.
The hybrid pattern — the most common choice at mid-market scale — is to buy rail connectors (bank API access, PSP normalisation) from a vendor like Modern Treasury or Treasury Prime, and build the matching engine and break management workflow in-house. This eliminates 60-70% of the integration work while preserving control over the matching logic that differentiates your product.
Compliance and audit requirements
PCI-DSS (v4.0): Reconciliation systems that process cardholder data must implement segregation of duties between the team that processes transactions and the team that performs reconciliation (Requirement 6.4). Audit logs must be retained for 12 months minimum, with 3 months immediately available online (Requirement 10.7). The immutable audit log in Layer 6 of the reference architecture satisfies this requirement if implemented with object-lock storage.
SOX (Section 404): Public companies must demonstrate that financial controls — including reconciliation — are effective. This means documented procedures, evidence of exceptions reviewed, and management sign-off on period-end reconciliation. Your break management workflow must produce a signed-off exception report at each period end. Temporal’s or Camunda’s workflow history provides this audit trail automatically.
ESMA regulatory reporting (EMIR, MiFID II transaction reporting for EU firms handling derivatives or structured products): Reconciliation must be performed on T+1 for all reportable transactions. Real-time reconciliation satisfies this trivially; batch reconciliation creates compliance risk if the batch fails or runs late.
Common pitfalls
Storing FX rates retrospectively. FX rates change between transaction initiation and settlement. Always record the settlement FX rate at the time of settlement; never recompute it later.
Treating the PSP webhook as the source of truth. Webhooks can fail, retry, or be delivered out of order. The settlement file (daily or via API polling) is authoritative; webhooks are early signals for faster matching. Build a reconciliation process that works without webhooks and uses them only to accelerate matching.
Single-stage matching only. Implementing only hard matching leaves 15-30% of volume unmatched because IDs are missing or inconsistent in bank feeds. A cascade of strategies is mandatory in production.
Shared idempotency key namespace. If two different source systems can generate the same idempotency key for different transactions (e.g., both using order_id without a source prefix), you will silently drop legitimate transactions. Namespace keys by source: {source}:{order_id}.
Not modelling refunds as first-class events. Treating a refund as a negative transaction that reverses the original creates period-end accounting chaos. Refunds are separate events with their own settlement lifecycle.
Break aging without escalation rules. A break queue without SLA-based escalation becomes a graveyard. Define maximum ages per break category and alert on violations.
Manual period-end close process. If your period-end close requires a manual reconciliation step that takes more than 4 hours, you do not have a real-time recon system — you have a faster batch system. A true real-time system should allow a soft close at any point in the period with <0.01% open items.
Ignoring acquirer file format changes. Acquirers change their settlement file formats with minimal notice. Your ingestion layer must have format validation, alerting on schema drift, and a rollback path for malformed files. At least one major acquirer changes their format quarterly.
Sources
- EUR-Lex — PSD2 Directive (EU) 2015/2366 — Payment Services in the Internal Market
- European Payments Council — SEPA Instant Credit Transfer Scheme Rulebook
- EBA CLEARING — RT1: Instant Payment Infrastructure
- Banco de España — Sistemas de pago y estadísticas de liquidación
- Nacha — ACH Network Rules and Operations 2024
- ISO — ISO 20022 Financial Messaging Standard
- PCI Security Standards Council — PCI-DSS v4.0: Payment Card Industry Data Security Standard
- EUR-Lex — SEPA Instant Payment Regulation (EU) 2024/886
Working with abemon on payment reconciliation
Reconciliation infrastructure is an area where the gap between “works in demo” and “works under production load” is large. The edge cases — cross-period refunds, chargeback chains, multi-currency captures — only appear at scale, and by then the cost of retrofitting the data model is high.
The data engineering team at abemon has designed and delivered reconciliation pipelines for payment processors, B2B SaaS companies with usage-based billing, and marketplaces handling mixed payment rails across multiple jurisdictions. Our engagements typically start with a 2-week architecture review — assessing your current reconciliation process, identifying the highest-cost failure modes, and producing a phased implementation plan.
If you are evaluating whether to build or buy, or if your existing batch reconciliation system is generating more than 2% unmatched items per day, contact us for an initial assessment. We also offer a structured consulting engagement for finance leaders who need to quantify the cost of their current reconciliation gaps before committing to infrastructure investment.
For further reading on the streaming infrastructure that underpins real-time reconciliation, see our practical guide to real-time data pipelines.
Frequently asked questions
- Why isn't daily batch reconciliation enough?
- Batch recon detects discrepancies 24-72 hours after they occur. By then, refunds have been processed, customers have escalated, and float has been mis-allocated. The ACH Network's 2024 operational report shows that 68% of reconciliation disputes that reach manual review could have been auto-resolved within 5 minutes of transaction settlement if detected in real time. At scale — say 500K daily transactions — a 1-hour detection lag generates an average $40K-$120K float misallocation per day.
- What's a realistic match rate for real-time recon?
- A well-designed system achieves >99.2% auto-match rate within 5 minutes of settlement for card and bank-transfer rails. BNPL and crypto rails typically land at 97-98.5% due to settlement model variability. The remaining unmatched items — roughly 0.5-2% — go into a break-management queue, not into manual review automatically; good workflow tooling resolves 60-80% of those without human intervention.
- How do I handle refunds that cross reconciliation periods?
- Model refunds as first-class events with a parent_transaction_id reference and a separate settlement_date. Never reverse the original transaction in the ledger — append a contra-entry. This preserves the audit trail and makes cross-period recon deterministic: the refund event is matched against the original by ID in the matching engine, regardless of which calendar day each settled.
- Build in-house or buy a platform like Modern Treasury?
- Buy if you're under 2M monthly transactions, lack dedicated data engineering capacity, or need multi-bank connectivity out of the box — Modern Treasury, Fragment, and Trovata all reduce time-to-production from 12+ months to 6-8 weeks. Build in-house when your transaction model has irreducible complexity (e.g., split captures across multiple acquirers, proprietary settlement windows) or when reconciliation logic is a core competitive moat. A hybrid approach — buy the rail connectors, build the matching engine — is the most common production pattern for mid-market fintechs.
- How does SEPA Instant change reconciliation?
- SEPA Instant settles in under 10 seconds, 24/7/365, which means there is no batch window and no business-day fence. Your recon pipeline must handle settlement events at any hour, including nights and weekends. The 10-second settlement SLA also removes the typical 2-hour buffer that batch systems exploit to absorb timing differences. EBA CLEARING's RT1 scheme data shows peak volumes at 09:00-10:00 CET on Mondays — design for 3-5x your average throughput at those windows.
- What's the canonical transaction model you recommend?
- Fourteen fields are the minimum: transaction_id (UUIDv7 for sortability), external_id, rail, direction, gross_amount, currency, net_amount, fee_amount, fx_rate, merchant_id, merchant_name, settled_at, initiated_at, and status. Add parent_transaction_id for refunds and captures, and idempotency_key for retry safety. The model should be immutable once persisted — amendments are new records with a supersedes_id reference.
- How do I reconcile cross-currency transactions with variable FX spreads?
- Store three amount fields: gross_amount in the originating currency, net_amount in the settlement currency, and fx_rate at time of settlement. Never compute FX retrospectively — rates at T+1 will differ from T+0 settlement rates. For reporting, fix a reference rate (e.g., ECB daily rate) per calendar date and store both the actual settlement rate and the reference rate separately. This lets you compute FX variance as a discrete line item rather than burying it in unexplained breaks.
- How do chargebacks affect reconciliation timing?
- Chargebacks introduce a delayed debit — typically 5-120 days after the original transaction — that must be matched back to the original authorization and settlement. Model them as a three-phase event: dispute_opened, chargeback_posted, and chargeback_resolved. The chargeback_posted event creates a reconciliation break against the original settlement; resolution closes it. Scheme-specific windows (Visa: 120 days, Mastercard: 45-120 days) must be reflected in your break-aging rules to avoid false escalations.
Sources
- EUR-Lex — PSD2 Directive (EU) 2015/2366 — Payment Services in the Internal Market
- European Payments Council — SEPA Instant Credit Transfer Scheme — EPC Rulebook
- EBA CLEARING — EBA CLEARING RT1 — Instant Payment Infrastructure
- Banco de España — Banco de España — Sistemas de pago y estadísticas de liquidación
- Nacha — Nacha ACH Network 2024 Rules and Operations
- ISO — ISO 20022 Financial Messaging Standard
- PCI Security Standards Council — PCI-DSS v4.0 — Payment Card Industry Data Security Standard
- EUR-Lex — SEPA Instant Payment Regulation (EU) 2024/886