Observability for Payments Systems
How to set up payments observability: OpenTelemetry signals, payments SLIs like approval rate and settlement lag, SLOs, error budgets, and PCI Req 10.
Instrument your payments stack with unified metrics, logs, and traces through OpenTelemetry, then define payments-specific SLIs: authorization rate, end-to-end latency, provider and webhook delivery success, settlement lag, and reconciliation break rate. Attach SLOs and error budgets to each, key traces by payment intent, and alert on money-movement anomalies rather than host metrics.
Instrument your payments stack with unified metrics, logs, and traces through OpenTelemetry, then define payments-specific SLIs — authorization rate, end-to-end latency, provider and webhook delivery success, settlement lag, and reconciliation break rate. Attach SLOs and error budgets to each, key traces by payment intent, and alert on money-movement anomalies rather than host metrics.
Generic application performance monitoring tells you the API is up and CPU is calm. It does not tell you that approval rates dropped four points on one card scheme, that a provider silently stopped sending webhooks, or that yesterday’s settlement file left forty transactions unmatched. Observability for money movement is a different discipline: the signals you watch, the SLIs you define, and the anomalies you alert on all follow the money, not the machine.
What does observability mean for a payments system specifically?
Observability for payments means you can answer, from telemetry alone, whether money moved correctly and on time. That requires the three standard signals — metrics, logs, and traces — plus a fourth practice most APM setups omit: continuous reconciliation. The difference from generic monitoring is the questions you ask, not the tooling you buy.
A web service is healthy when it returns 200s quickly. A payments service can return 200s all day while quietly declining more authorizations, delaying settlement, or accumulating reconciliation breaks. None of those surface as errors in an HTTP dashboard. They surface as business anomalies: a drop in approval rate, a widening gap between capture and settlement, ledger entries with no matching bank record.
So the first design decision is to instrument the domain, not just the runtime. Every payment carries state — created, authorized, captured, settled, reconciled — and each transition is an event worth measuring. Build on top of a correct ledger; observability tells you when reality and the ledger disagree. If your ledger design is still unsettled, start with how to architect a ledger, because you cannot observe money movement you cannot record cleanly.
Which telemetry signals do you need, and how do you unify them?
You need all three signals — metrics for trends and alerting, logs for forensic detail, traces for causality across services — and you unify them with OpenTelemetry so a single payment can be followed from one signal to the next. OpenTelemetry is a vendor-neutral standard for generating and collecting telemetry, which keeps you free of any one backend.
The OpenTelemetry project describes itself as “a collection of APIs, SDKs, and tools” used to “instrument, generate, collect, and export telemetry data (metrics, logs, and traces)” (OpenTelemetry docs). The practical payoff for payments is correlation. When approval rate dips, you want to jump from the metric to the traces of the failing authorizations, and from a trace span to the structured log line that records the provider’s decline code — without stitching identifiers by hand.
Metrics, logs, and traces, mapped to money movement
- Metrics are aggregates over time: authorization success rate, latency percentiles, webhook delivery lag, settlement lag. These drive dashboards and alerts. Keep cardinality controlled — dimension by scheme, provider, currency, and result, not by cardholder.
- Logs are the per-event record: one structured entry per state transition, carrying the decline reason, provider reference, and correlation ids. This is your forensic layer and, for card data, your audit trail.
- Traces are the causal chain: a single request fanned across your API, risk checks, provider calls, and webhook handlers, tied together by one trace id so you can see where latency or failure entered.
One correlation key across all three
Propagate a single identifier — the payment intent id, and where relevant the idempotency key — as a span attribute and a log field on every hop. OpenTelemetry’s context propagation carries the trace context automatically; you add the business key so a support question (“what happened to payment X?”) resolves to exactly one trace and its logs. Idempotency keys are already central to safe retries, covered in webhooks and idempotency in payments; reusing that key as a telemetry attribute costs nothing and pays off in every investigation.
What are the payments-specific SLIs you should track?
Track the indicators that measure whether money moved: authorization approval rate, end-to-end payment latency, provider and webhook delivery success and lag, settlement or clearing lag, and reconciliation break rate. Each maps to a customer-visible or money-critical outcome, and each deserves an explicit target and alert threshold rather than a glance at a graph.
Here is a concrete starting set. Treat the targets as illustrative; calibrate them to your schemes, corridors, and providers.
| SLI | What it measures | Example target / alert |
|---|---|---|
| Authorization approval rate | Approved ÷ attempted authorizations, per scheme and provider | Alert if any scheme drops >3 points below its trailing 7-day baseline |
| End-to-end payment latency | Time from intent creation to captured/confirmed | p99 < 2.5s; page if p99 > 5s for 5 min |
| Webhook delivery success and lag | Inbound provider events acknowledged 2xx, and age at receipt | >99.9% acknowledged; alert if p95 event lag > 60s |
| Settlement / clearing lag | Time from capture to funds settled per corridor | Alert if settlement for a batch exceeds its expected window |
| Reconciliation break rate | Ledger entries with no matching provider/bank record | Alert if unresolved breaks > 0.1% of daily volume or any break ages > 24h |
Why these, and not CPU
Every row is a leading indicator of a customer or finance problem. A falling approval rate is lost revenue, often a routing or configuration regression. Rising webhook lag means your view of payment state is going stale. A settlement window breach is cash that has not arrived. Reconciliation breaks mean something, somewhere, disagrees about money. Host metrics matter for capacity, but they are not how you learn that money stopped moving.
How do you define SLOs and error budgets for money movement?
An SLO is a target for an SLI over a window; the error budget is the allowed shortfall, and it converts reliability into a number you can spend. Google’s SRE practice frames SLOs as “a target level for the reliability of your service” and defines the error budget as “1 minus the SLO,” the acceptable rate of failure over a period.
The Google SRE book states the principle directly: “if you have an availability SLO of 99.9%, then your error budget is 0.1%,” and that budget is “the maximum amount of time that a service can be unavailable” — or, generalized, the maximum rate of SLI failure — before you stop shipping features and fix reliability (Google SRE — Service Level Objectives).
For payments, apply this per SLI rather than to a single blended uptime:
- Pick the window deliberately. A 30-day rolling window suits approval rate and latency. Reconciliation is better measured daily, because a break that lingers across close is a finance problem, not a reliability rounding error.
- Set the SLO from customer impact, not vanity. If approval-rate degradation costs revenue linearly, a tighter SLO is justified; do not set 99.99% everywhere because it sounds rigorous.
- Spend the budget as a signal. Burning approval-rate budget fast is a release gate: stop rolling out routing changes and investigate. This is the entire point of a budget — it turns “the graph looks bad” into a policy.
- Alert on burn rate, not just breaches. A fast burn deserves a page; a slow burn deserves a ticket. Multi-window burn-rate alerting keeps you from paging on noise.
How does distributed tracing follow one payment across services and providers?
Distributed tracing follows a payment by propagating one trace context and one business key — the payment intent id — across every service and provider call, so the full lifecycle becomes a single trace. You add spans at each hop: risk evaluation, provider authorization, capture, webhook handling. The result is a causal timeline you can read end to end.
The reason payments need this more than most systems is the fan-out. A single payment can touch your API, a fraud check, one or more providers, an idempotency store, and several asynchronous webhook handlers that arrive minutes apart. Without a shared key, those are unrelated log lines; with the payment intent id on every span and log, they are one story.
Keying traces by intent and idempotency key
- Set the payment intent id as a span attribute at creation and propagate it on every downstream call, including outbound provider requests where you control the metadata.
- Record the idempotency key on the authorization span so a retried charge links to its original attempt rather than appearing as a second, unrelated payment.
- Carry both ids into webhook-handler spans, so an event that lands much later attaches to the same trace as the request that triggered it.
- Add provider references (the acquirer’s transaction id) as attributes, so a dispute investigation can cross from your trace to the provider’s records.
This tracing discipline is part of the broader integration checklist we keep for anyone wiring up a provider — see the embedded payments integration checklist for where instrumentation fits alongside idempotency, retries, and reconciliation.
How do you satisfy PCI DSS logging without leaking card data?
PCI DSS Requirement 10 obliges you to log and monitor all access to system components and cardholder data and to keep audit trails that reconstruct events. You satisfy it by emitting structured, tamper-evident logs for every access and state change — while never writing the full PAN, CVV, or track data into any log. Mask or tokenize before anything is emitted.
Requirement 10 of the PCI DSS is, in the standard’s own framing, to “log and monitor all access to system components and cardholder data” (PCI Security Standards Council). Observability and this requirement pull in the same direction: both want a complete, queryable record of what happened. The tension is only about content, and the rule is simple — sensitive authentication data must never persist.
What to log, and what to mask
- Log the event, not the secret. Record that an authorization occurred, its result, the provider decline code, timestamps, and the acting identity. Never record CVV or track data at all; these must not be stored after authorization.
- Mask the PAN. If a card number must appear for support, show it truncated (first six / last four at most). Prefer a token or a surrogate reference everywhere else so raw PANs never enter your telemetry pipeline.
- Protect the audit trail. Requirement 10 expects trails that cannot be silently altered. Ship logs to append-only, access-controlled storage with synchronized time, and restrict who can read them.
- Keep scope in mind. The cleanest way to avoid logging card data is to never handle it — tokenize at the edge. Scope decisions compound here; we walk through them in PCI DSS scope for a fintech MVP.
Getting logging and tracing right end to end is core platform work; if you want a second pair of hands on it, our platform engineering practice does exactly this.
Why is reconciliation an observability practice, not just a finance task?
Reconciliation is the only signal that compares your record of money against an external authority — the provider’s report, the bank statement — so it is the ground-truth health check for correctness. Treat break rate as a first-class SLI, emit it continuously, and alert on drift. A rising break count is an incident, not a month-end chore.
Most outages you can survive; a slow, unnoticed divergence between your ledger and reality you cannot. Reconciliation catches the failures no request-level metric can see: a webhook you acknowledged but processed wrong, a capture that never settled, a duplicate that skewed a balance. Running it as observability means:
- Reconcile on a tight cadence, not only at close. Intraday reconciliation shrinks the window in which a break can compound.
- Emit break counts and ages as metrics, so the trend is visible on the same dashboards as latency and approval rate.
- Alert on drift, both absolute (breaks over a threshold) and directional (breaks climbing for N intervals).
- Trace each break to its payment using the intent id, so investigation starts from a full trace rather than a spreadsheet row.
Key takeaways
- Observability for payments follows the money, not the machine: instrument domain state transitions, not just HTTP status and host metrics.
- Unify metrics, logs, and traces with OpenTelemetry and correlate them with one business key — the payment intent id, reused from your idempotency key.
- Track payments-specific SLIs: approval rate, end-to-end latency, webhook delivery success and lag, settlement lag, and reconciliation break rate.
- Give each SLI an SLO and error budget; per the Google SRE book, a 99.9% SLO yields a 0.1% error budget you spend as a release gate.
- Satisfy PCI DSS Requirement 10 with complete audit trails while masking the PAN and never logging CVV or track data.
- Run reconciliation as continuous observability: break rate is an SLI, and drift is an incident.
Talk to us
If you are standing up payments observability — or you have APM but no view of approval rates, settlement lag, or reconciliation breaks — we can help you design the signals and instrument them. Talk to us.
Frequently asked questions
What is payments observability and how is it different from APM?
Payments observability lets you answer, from telemetry alone, whether money moved correctly and on time. Generic APM watches uptime, latency, and host metrics. Payments observability instruments domain state transitions and business SLIs like approval rate and settlement lag, because a service can return 200s while quietly declining more authorizations or accumulating reconciliation breaks.
Which SLIs matter most for a payments system?
Track authorization approval rate per scheme and provider, end-to-end payment latency, webhook delivery success and lag, settlement or clearing lag, and reconciliation break rate. Each maps to a customer-visible or money-critical outcome. Give every one an explicit target and alert threshold rather than reading it off a dashboard by eye.
How do error budgets apply to payments reliability?
An error budget is the allowed shortfall against an SLO. The Google SRE book states that a 99.9% SLO gives a 0.1% error budget, the maximum failure you tolerate before halting feature work. In payments, apply budgets per SLI: burning approval-rate budget fast is a release gate to stop routing changes and investigate.
How do you trace a single payment across services and providers?
Propagate one trace context plus a business key, the payment intent id, across every service and provider call, adding spans at each hop. Record the idempotency key so a retried charge links to its original attempt, and carry both ids into webhook handlers so a late event attaches to the same trace as the request that triggered it.
What does PCI DSS Requirement 10 mean for logging?
Requirement 10 obliges you to log and monitor all access to system components and cardholder data and keep audit trails that reconstruct events. Satisfy it with structured, append-only, time-synchronized logs of every access and state change, while never writing the full PAN, CVV, or track data. Mask the PAN and tokenize before anything is emitted.
Why treat reconciliation as an observability practice?
Reconciliation is the only signal that compares your record of money against an external authority like the bank statement, so it is the ground-truth check for correctness. Emit break count and age as metrics, reconcile intraday rather than only at close, and alert on drift. A rising break count is an incident, not a month-end chore.
Published by FinWeb · July 20, 2026