Est.

Webhook vs Polling for Real-Time Cross-Border Payment Status

ISO 20022 now makes webhook payloads rich enough to automate what polling could never catch in time.

Staff Writer · · 12 min read
Cover illustration for “Webhook vs Polling for Real-Time Cross-Border Payment Status”
Payments infrastructure, APIs and reconciliation · September 16, 2026 · 12 min read · 2,618 words

ISO 20022 didn't just tidy up payment messaging, it decided what a status update is even allowed to say. That distinction is the real subject of this piece: not whether to poll or wait for a webhook, but what kind of data flows through either channel now that the underlying message format has changed, and how a serious platform builds around both without pretending one of them is optional. Cross-border payments run through wildly different rails at wildly different speeds, and status tracking has to make sense of all of it inside the same dashboard. Get the architecture wrong, and the cost appears as a missed fraud window or a reconciliation entry nobody can explain.

The trouble starts with timing. A SWIFT wire routes through correspondent banks and can take two to five business days, passing through as many as three intermediaries before it lands, according to Lightspark. Brazil's PIX, India's UPI, Mexico's SPEI, the UK's Faster Payments, and Europe's SEPA Instant Credit Transfer settle in under ten seconds. So one payments platform might have a transaction stuck in "pending" for six hours while another clears before the sender's confirmation email even sends. Status tracking has to handle both realities on the same rails, often in the same customer-facing screen.

None of this is purely a speed problem, either. Different rails report status in different formats, on different schedules, using different fields. That fragmentation, not just latency, is the actual environment polling and webhooks have to work in. Get the format wrong and speed doesn't save you.

How ISO 20022 changed what payment status data contains

On November 22, 2025, the coexistence period between MT messages and ISO 20022 for cross-border payments, run under the CBPR+ program, came to an end. ISO 20022 is now the standard messaging format for cross-border payments globally, according to SWIFT. That's not a cosmetic update. It changes what a status update actually contains, and by extension, what a webhook payload or a polling response can tell a downstream system without a person reading it and typing something into a ticket.

Legacy ACH formats allow 10 characters for a payment description, barely enough for a cryptic reference code. ISO 20022 supports up to 140 characters of structured remittance data per transaction, a dramatic expansion over the 10-character limit of legacy ACH formats. A webhook payload that says "TXN4471" leaves a human to go dig through logs. One that carries purpose codes and a real reference ID lets a reconciliation system match it on its own, no ticket required.

SWIFT reports that 89% of payments on its network now reach the beneficiary bank within an hour. That's the actual detection target: a sub-hour state change, not a multi-day wait, and it raises the cost of any polling interval that isn't tight enough to catch it in time.

The CPMI-FSB monitoring survey, published by the BIS, shows what banks actually use their payment APIs for. Accessing transaction data leads, cited by 73% of Fast Payment Systems and 66% of RTGS systems. Receiving and managing transaction notifications also ranks as a leading use case, cited by 64% of FPS. Notification delivery, the exact job a webhook does, is already a mainstream production function. Nobody's pitching it as a novelty anymore.

ISO 20022 payloads now carry enough structured detail to drive automated compliance checks, reconciliation, and fraud review on their own. Miss one of those events, or catch it late, and it costs more today than it did under the old formats, simply because there's more riding on that single message.

Polling works but becomes a liability at payment scale

Polling is the older pattern, and the simpler one. A client fires repeated HTTP requests at a status endpoint on a fixed interval, asking "anything new?" The endpoint says no almost every time, and the client asks again a few seconds later. That's the whole mechanism.

Polling still earns its place in a few situations, and here's an honest look at which ones. Air-gapped or offline systems that can't accept inbound connections need it, full stop. Banking environments with strict firewall rules that block inbound HTTP callbacks fall into the same bucket, as do legacy internal networks with no way to push events out. Low-frequency checks, an hourly reconciliation run instead of per-transaction monitoring, are a reasonable fit too, and so are systems tracking events rare enough that a persistent webhook endpoint isn't worth standing up.

Outside those cases, polling is the wrong default, and the math says so plainly. Industry analysis estimates a typical polling loop has a useful-hit rate around 1.5%, meaning about 98.5% of requests come back empty and get thrown away. Poll every five seconds across 10,000 active transactions, and the status endpoint has to absorb up to 2,000 requests per second, provisioned around the clock whether anything happened or not, capacity paid for mostly to sit idle. That's infrastructure spend paying for silence.

The latency ceiling is fixed by whatever interval gets picked. A 30-second polling loop means a payment-settled event can sit undetected for up to 30 seconds. Tighten the interval to five or ten seconds and the delay shrinks, but the wasted requests multiply right along with it, the tradeoff doesn't go away, it just moves. Plaid's payment documentation lists polling only as a fallback for when webhooks are unavailable or badly delayed.

Cross-border payments make the case worse, not better. When a transaction can legitimately sit in "processing" for hours while it clears correspondent bank hops, the polling loop has to keep running the entire time, still mostly asking a question with no new answer. The 1.5% useful-hit-rate problem doesn't level off as settlement windows stretch out. It compounds.

Diagram: Polling vs. Webhooks: The Efficiency Gap. Visualizes: Visualize the stark contrast between polling and webhooks across two key dimensions: request waste and detection latency.

How webhooks work across a cross-border payment lifecycle

Webhooks flip the model on its head. Instead of the client asking for status, the payment provider fires an HTTP POST to a pre-configured endpoint the instant a state changes. The client's system receives it, processes it, and sends back a 200 to confirm receipt. No asking required, no idle loop running in the background.

A cross-border payment typically moves through a defined sequence: initiated, pending (sitting in a correspondent banking queue), processing (cleared by an intermediary), then completed or failed, with refunds, disputes, or chargebacks as later branches. Each transition becomes a discrete webhook event, a JSON payload carrying a transaction ID, event type, status, timestamp, and whatever transaction detail the provider decides to include.

JP Morgan's developer documentation gives a concrete example: subscribing to webhooks through its developer portal triggers HTTP POST requests for FX payout events, including TRANSACTION_COMPLETED for successful payouts and TRANSACTION_FAILED for failures, specifically for cross-border FX transactions. According to Routable, webhooks cut API call volume by 95% compared to polling on high-volume disbursement runs, and failures surface the instant they happen instead of waiting for the next poll cycle.

Lightspark's Grid product routes payments across 65 countries using local instant rails, PIX, SEPA Instant, UPI, FedNow, Faster Payments, SPEI, and RTP among them, with webhook-driven lifecycle tracking at every transition. For a provider spanning that many rails, the webhook layer is core infrastructure. It's the thing holding the entire tracking system together.

The advantage is most visible in variable-latency corridors. A payment to a PIX recipient in Brazil might settle in under ten seconds. The same platform's payment through a SWIFT corridor might take hours. A webhook fires the moment either one changes state. A polling loop, on the other hand, has to be tuned to the slowest corridor in the mix, or it misses the fast ones.

The engineering requirements a webhook implementation demands

Webhooks kill the need for constant polling, but they hand back their own list of requirements, and skipping any one of them tends to show up as a production incident rather than a comment in code review.

Idempotency comes first, and it isn't optional. Providers generally guarantee at-least-once delivery, not exactly-once. Most providers document this explicitly: delivery is guaranteed, but occasional duplicate deliveries will happen. A handler that isn't built to expect duplicates can process the same capture event twice, triggering a duplicate payout or a reconciliation entry that's now double-counted. The fix is simple: log the event_id the first time it shows up, and reject any repeat of that same event_id before it touches business logic. Ordering isn't guaranteed either. Out-of-order delivery is a known reality: a real sequence might arrive as FAILED, then PENDING, then SUCCESS, out of the order the events actually happened. Handlers need to update state only on SUCCESS and ignore stale FAILED events that show up after the fact.

Retry logic matters just as much. If a merchant's endpoint returns anything besides a 2xx response, or times out, the provider retries, usually with exponential backoff so it isn't hammering an endpoint that's already struggling. Stripe retries failed webhook deliveries for up to three days using this pattern. The fix on the receiving end: return a 200 immediately on receipt, before any processing logic runs, so a slow database write doesn't cause a timeout that triggers a retry that never needed to happen.

Security is the part teams underestimate, consistently. A webhook endpoint is a public URL, and any server on the internet can send it a POST request. The standard defense is HMAC-SHA256 signature verification: the provider signs the payload with a shared secret, the receiver recomputes that hash and rejects anything that doesn't match. IP allowlisting of the provider's known outbound ranges adds a second layer on top. Skip both, and the endpoint is open to payload spoofing, where an attacker pretends to be the provider, and payload tampering, where a legitimate message gets altered mid-transit.

Monitoring gets treated as optional until the day it isn't. PXP points out that missed webhooks carry asymmetric risk in cross-border payments: if a chargeback notification never arrives because the endpoint was down, the dispute response window can lapse before anyone on the team even knows a dispute exists. Webhook event logs with delivery status and manual retry, which providers like PXP offer, aren't a convenience at that point. They're the only thing standing between a missed event and a lost dispute. Schema versioning rounds this out: providers change webhook payload formats over time, and teams need to track changelog notices and test against new schemas before they hit production, not after something breaks in it.

A hybrid architecture resolves the gaps left by either approach alone

Even a well-built webhook system has one failure mode it can't close on its own: if the merchant's endpoint is down when the event fires, and every retry attempt runs out before the endpoint comes back up, that event is gone for good. Signature verification and idempotency logic cannot recover an event that never arrived. That's the argument for treating webhooks as necessary but not sufficient, and it's why a reconciliation layer has to sit underneath the webhook system rather than being treated as a nice finishing touch.

The pattern that's taken hold treats webhooks as the primary channel, firing on every state transition and driving the operational workflow in real time, with scheduled reconciliation polling running as a safety net beneath it. That reconciliation check might run hourly, at end of day, or once per settlement window, catching whatever the webhook system failed to deliver. Plaid frames polling explicitly as a fallback, for when webhooks are unavailable or running significantly behind. PXP recommends a periodic API poll or a batch file comparison for the same reason: to catch the events that slipped through despite every retry.

The case for this hybrid only gets stronger as the rail landscape fragments further. RTP now covers more than 1,000 banks and over 70% of US demand deposit accounts, and FedNow has surpassed 1,500 participating institutions. These rails don't talk to each other, and each one carries its own webhook event schema and its own settlement confirmation format. A reconciliation polling layer sitting above all of them is what turns that mess into one consistent view instead of five inconsistent ones.

Surprisingly, the reconciliation poll in a hybrid system doesn't need to be aggressive at all. Once webhooks handle the real-time layer, polling once per settlement window replaces polling every few seconds, which collapses that 1.5% useful-hit-rate problem down to something manageable. The poll only exists to catch exceptions. It's no longer carrying the tracking load.

Stablecoins complicate the picture further. Stripe's $1.1 billion acquisition of Bridge in early 2025 brought stablecoin settlement, including USDC and Bridge's own USDB, into production use. Stablecoin rails settle in seconds and throw off their own on-chain confirmation events, distinct from anything SWIFT or a domestic instant-payment rail produces. A platform running SWIFT corridors and stablecoin rails side by side needs a notification layer built to normalize events across both, which is really the same rail-agnostic argument, just extended to a newer settlement type.

Where a given system lands on the polling-to-webhook spectrum comes down to a short set of conditions, and getting this wrong is usually where the incident postmortems start. High volume, latency-sensitive, with an endpoint that can accept inbound traffic: webhooks as primary, reconciliation polling underneath. Firewall-restricted or air-gapped: polling alone, tuned to whatever detection delay the business can tolerate. A SWIFT corridor with a multi-hour or multi-day settlement window: webhooks on every state transition, plus a polling check at the end of the expected window as confirmation. A platform running instant rails alongside SWIFT uses webhooks as the primary layer, a rail-agnostic event handler underneath, and scheduled reconciliation running across every corridor at once.

Webhook and notification infrastructure in a payment API platform

Picking a payment platform's notification setup is a decision whose integration costs compound over time. It's a bet that compounds every quarter the platform stays in production, and the wrong bet doesn't announce itself until volume is already high enough to hurt.

Start with event coverage. Does the provider fire a webhook for every meaningful state, initiated, pending, processing, completed, failed, refunded, disputed, chargeback, or only the terminal ones? A platform that only notifies on completion leaves a blind spot for everything before it, which happens to be exactly where fraud review and compliance checks need to be looking.

Delivery reliability comes next. Most production systems offer at-least-once delivery, not exactly-once, so idempotency has to live at the application layer no matter what the provider promises on paper. Ask how transparent the retry policy actually is: what's the maximum retry window, what's the backoff schedule, and is there a dashboard showing delivery status with a manual retry option when something fails silently in the background.

Security defaults matter more than they get credit for. HMAC-SHA256 payload signing should be standard from day one, not a premium add-on bolted on later, and IP allowlisting support matters a great deal for any team operating inside a bank's firewall rules.

Multi-rail normalization is where a lot of platforms quietly fall short. A provider routing across PIX, UPI, SEPA Instant, FedNow, and SWIFT ought to hand back one consistent event schema no matter which rail actually moved the money. Otherwise engineering teams end up rebuilding the same normalization logic once per corridor, which is exactly the duplicated work a decent platform exists to prevent in the first place.

Reconciliation support has to sit alongside the webhook system, not stand in for it. Batch file exports, a periodic status endpoint, or ERP sync (Routable, for instance, cites 99.8% accuracy on its bi-directional ERP sync) all function as the backstop a hybrid architecture depends on. Check schema versioning discipline before signing anything: a provider that changes webhook payload structure without a version number or a changelog notice will eventually break a production handler with zero warning.

Sources

  1. Real-Time Payments API Guide March 2026 | Routable
  2. Real-Time Payments API: Your Guide to Instant Global Transactions
  3. API Payment Platforms for Developers (July 2026) | Routable | Routable
  4. Webhook in Payments: Definition, How It Works | PXP
  5. Payments (Europe)
  6. 5 Best Global Payout APIs (May 2026)
  7. bipconsulting.us

More in Payments infrastructure, APIs and reconciliation