Payment profile KPI: auth, capture, refund
TL; DR
The payment loop is measured as a funnel: 'Attempt → Auth → Capture → Settle/Refund'. Key metrics are not only Approval Rate, but also pure AR (after anti-fraud and 3DS), capture success, time to write-off/enrollment, cost/FX, idempotency errors and quality of returns (TtR and rate). The one who holds AR ↑, TtW ↓, Cost/GGR ↓ wins, against Disputes ↓, without breaking risk profile.
1) Dictionary of stages and events
Attempt - payment attempt (initiation).
Auth - authorization (bank/wallet/rails confirmed the possibility of write-off).
Capture - actual write-off (full/partial).
Settle - clearing and settlements.
Refund - return (full/partial), 'TtR = time to refund credit'.
Void - undo to capture (if supported).
3DS/Step-up - friction on authorization.
Soft Decline/Hard Decline - recoverable/unrecoverable failures.
2) KPI hierarchy (target tree)
Upper level
Gross Approval Rate (AR_gross) = Auth/Attempt
Net Approval Rate (AR_net) = Captured/Attempt
Cost/GGR = (Fees + FX + Ops)/GGR
TTW/TtC: Time-to-Wallet, TtC (capture) p95
Refund Health: Refund Rate, TtR p95, Refund Error Rate
Intermediate level
3DS Challenge Share, Frictionless Share, Abandon on 3DS
Soft Decline Recovery Rate (Retray/Smart Routing)
Partial Capture Share, Capture Latency
Refund to Source %, Duplicate/Idempotency Incidents
Lower level (diagnostics)
Errors by codes (ISO/rail), p95 API latency, SLA webhooks, share of 'Do Not Honor', 'Insufficient Funds', 'Suspected Fraud', 'System Error'.
3) Formulas (exact definitions)
3. 1 Authorization
`AR_gross = Auth_Approved / Auth_Attempted`
`AR_clean = Auth_Approved / (Auth_Attempted - Fraud_Preblocked - User_Abandon_3DS)`
`3DS_Challenge_Share = 3DS_Challenge / 3DS_Total`
`3DS_Frictionless_Share = 3DS_Frictionless / 3DS_Total`
`Abandon_on_3DS = 3DS_Started - 3DS_Completed`
Sections are required: 'BIN × country', 'provider × method', 'device/os', 'ticket _ size' (for example, ≤€50, €50-200,> €200).
3. 2 Capture
`Capture_Success = Captured_Tx / Capture_Attempted_Tx`
`Net_Conversion = Captured_Tx / Auth_Attempted_Tx` (= AR_net)
`Partial_Capture_Share = Partial_Captures / Captured_Tx`
`Capture_Latency_p95 = p95(capture_timestamp - auth_timestamp)`
`Void_Rate = Voids / Auth_Approved`
3. 3 Cost and FX
`Cost_per_Tx = Fee_fixed + AmountFee_pct + FX_Spread`
`Cost/GGR = ΣCost / GGR`
`Net_Revenue = GGR - ΣCost - Fraud_Loss - Disputes_Cost`
3. 4 Refunds
`Refund_Rate = Refunded_Tx / Captured_Tx`
`Refund_Amount_Ratio = Refunded_Amount / Captured_Amount`
`TtR_p95 = p95(refund_credit_at - refund_initiated_at)`
`Refund_Error_Rate = Refund_Failed / Refund_Attempted`
`Refund_to_Source_% = Refund_to_Original_Method / Total_Refunds`
'Double _ Refund _ Incidents' - idempotent collision counter (must = 0)
4) Goals/benchmarks (customizable for a specific portfolio)
AR_gross: 3DS2 cards - 82-92% (BIN/country), A2A - 90% + (initiation), vouchers - 95% + (redeem).
Capture_Success: 98. 5% + (with live webhooks and retreats).
TtC p95: ≤ 5 min (cards with auto-capture), ≤ 90 sec (instant A2A/RTP).
Refund Error: < 0. 3%; TtR p95: ≤ T + 1 bank. day (cards), ≤ 60 sec (instant rails).
Refund_to_Source%: ≥ 95% (where rails are supported).
Idempotency Incidents: = 0; Webhook SLA: ≥ 99. 9%, p95 < 3 c.
(Not "market benchmarks," but practical target corridors for internal SLOs.)
5) Segmentation and attribution
Consider KPIs in the context: 'country', 'method _ group', 'provider', 'BIN', 'device/os', 'ticket _ size', 'risk _ segment', 'kyc _ tier', 'affiliate', 'new _ vs _ returning'.
Cohort AR: AR by first-payment cohort (D0/D7/D30).
Route AR: AR on 'PSP_A→PSP_B failover' routes.
Risk-aware AR: AR by risk segment (after step-up).
BIN-heatmap: vulnerable issuers → separate retray/3DS rules.
6) Data model (flat layer for BI)
Minimum "event-flat":
payment_id, user_id, country, provider, method_code, action(deposit/refund),
attempt_ts, auth_status, auth_code, auth_ts,
three_ds(flow, started_ts, completed_ts, challenge_flag),
capture_status, capture_amount, capture_ts, partial_flag,
refund_status, refund_amount, refund_initiated_ts, refund_credit_ts,
fees_fixed, fees_pct, fx_spread, currency, amount,
risk_segment, kyc_tier, bin, asn, device_os, ticket_bucket
Key - idempotent 'payment _ key' to the stage and 'idempotency _ key' to the refund.
7) SQL slices (example)
7. 1 Daily AR and Capture
sql
WITH base AS (
SELECT
DATE_TRUNC('day', attempt_ts) d,
country, provider, method_code,
COUNT() FILTER (WHERE auth_status='ATTEMPTED') AS auth_attempted,
COUNT() FILTER (WHERE auth_status='APPROVED') AS auth_approved,
COUNT() FILTER (WHERE capture_status='CAPTURED') AS captured_tx
FROM payments_flat
WHERE action='deposit'
GROUP BY 1,2,3,4
)
SELECT d, country, provider, method_code,
auth_approved::decimal / NULLIF(auth_attempted,0) AS ar_gross,
captured_tx::decimal / NULLIF(auth_attempted,0) AS ar_net
FROM base;
7. 2 Refund health
sql
SELECT
DATE_TRUNC('day', refund_initiated_ts) d,
country, provider, method_code,
COUNT() FILTER (WHERE refund_status='ATTEMPTED') AS refund_attempted,
COUNT() FILTER (WHERE refund_status='SUCCESS') AS refund_success,
PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY EXTRACT(EPOCH FROM (refund_credit_ts - refund_initiated_ts))) AS ttr_p95_sec
FROM payments_flat
WHERE action='refund'
GROUP BY 1,2,3,4;
7. 3 3DS friction
sql
SELECT country, provider,
COUNT() FILTER (WHERE three_ds.flow IS NOT NULL) AS three_ds_total,
COUNT() FILTER (WHERE three_ds.challenge_flag) AS three_ds_challenge,
COUNT() FILTER (WHERE three_ds.flow='FRICTIONLESS') AS three_ds_frictionless
FROM payments_flat
WHERE action='deposit'
GROUP BY 1,2;
8) Dashboard (required widgets)
1. Funnel: Attempt → Auth → Capture (absolute and conversions).
2. AR heatmap: по `country×provider` и `BIN×country`.
3. 3DS Quality: Challenge/Frictionless/Abandon.
4. Capture Latency p50/p95 и Webhook SLA.
5. Refund Health: Refund Rate, TtR p95, Refund Error, Refund_to_Source %.
6. Cost/GGR: by methods and providers.
7. Alerts panel: top codes of failures, AR/latency degradation.
9) SLOs, alerts and playbooks
SLO/Alerts (example):- 'AR_gross↓> 3 pp to 7-day median' → ALERT P1 (check BIN/provider/ASN).
- 'Capture _ Success <98% (hourly) 'or' Webhook p95> 5 c '→ ALERT P1 (PSP Retray/Incident).
- 'TtR _ p95> target'by methods instant → ALERT P2 (check queue/limits).
- `Refund_Error_Rate > 0. 5% 'or'Double _ Refund> 0' → ALERT P0 (automatic refand freeze, manual check).
- BIN degradation: include an alternative acquirer, increase the proportion of 3DS-challenge for BIN, retray with 'ECI' parameters.
- System Soft Declines: smart routing → PSP_B, limit retry to N, change 3DS policy.
- Capture delays: force retrays, verifying the signing of webhooks, increased TTL idempotency.
- Refund errors: enable idempotent keys, limit parallel partial-refund, manual QA for duplicates.
10) Risk and compliance management in KPIs
Report AR_clean after removing 'Fraud _ Preblocked' and 'Abandon _ 3DS' - this is your operational AR, do not mix with the anti-fraud effect.
Refund_to_Source% - key regulatory KPI; fix exceptions as comp-approved.
Dispute/Chargeback Rate bind to captured_amount, not attempts.
11) Frequent errors
Summation of different bases (attempt vs auth vs capture) in one fraction.
Lack of segmentation by 'ticket _ size' → false conclusions by AR.
Missing 'User Abandon' on 3DS → "artificially" low AR.
No'idempotency _ key'on refund → doubles/financial losses.
Mixing payout and refund in the same TtW/TtR metric.
12) Implementation checklist
- Agreed event schema and unified KPI definitions.
- Heatmap by BIN/country and routing by provider.
- 3DS friction and abandon dashboard.
- SLA webhooks, retrays, idempotency (auth/capture/refund).
- Reporting by Refund Health and Refund_to_Source%.
- AR, Capture_Success, TtR degradation alerts, refund errors.
- Monthly R&O Review: Cost/GGR, Disputes, FX Spreads, Provider-SLA.
13) Summary
A strong payment loop is a transparent funnel with the correct base for each share, strict event discipline, segmentation and automatic playbooks. The correct KPI turn payment infrastructure into growth lever: AR_net ↑, TtC/TtR ↓, Cost/GGR ↓, Disputes ↓, at the invariable or improved safety.