PSP ödənişlərinin və hesabatlarının müqayisəsi
TL; DR
Yoxlama - PSP/ekvayer/bank hesabatları ilə ledcerinizin və hadisələrin (auth/capture/refund/payout) gündəlik avtomatlaşdırılmış bağlanmasıdır. Uğurun açarı: vahid data modeli, determinant uyğunlaşma açarları, ciddi idempotentlik ,/FX/vaxt məbləğləri üzrə tolerans, mübahisəli hallar üçün DLQ növbəsi və avtomobil korreksiyası playbukları. KPI: Recon Mismatch Rate↓, Aging of Unreconciled↓, Auto-match%↑.
1) Nə üçün və nəyi yoxlayırıq
Məqsədlər: gəlir və komissiyaların təsdiqi, dublların/itkilərin aşkarlanması, günlər və valyutalar üzrə düzgün settlement, refund-to-source nəzarəti, audit/tənzimləyiciyə uyğunluq.
Müqayisə obyektləri:- Deposits: `auth → capture → settle`
- Refunds: full/partial, statuslar və məbləğlər
- Payouts/Withdrawals: metodlara görə gedən ödənişlər
- Fees & Adjustments: PSP komissiyaları, interchange sxemləri, düzəlişlər
- Chargebacks/Disputes: Sizin təşəbbüsünüz xaricində
- FX/Konvertasiyalar: kurslar, spreadlər, fiksasiya anı
2) Məlumat mənbələri
Internal Events (sizin): hadisə şini/Kafka, 'payments _ flat', 'refunds', 'payouts', sizin Ledger.
PSP Reports (SFTP/API/webhook dump):- Transactions (əməliyyat çıxarışları)
- Settlements/Batches (hesablaşmalar T + N)
- Fees/Statements (komissiyalar, düzəlişlər)
- Chargebacks/Disputes
- Payouts/OCT/RTP/SEPA reyestrləri
- Bank Statements: CAMT MT940/CSV/ISO20022, ödənişlərin qaldırılması.
3) Müqayisə açarları (matching keys)
Prioritet açar ağacı (dəqiqliyin azalması ilə):1. provider_txid provider_txid (unikal PSP ID)
2. idempotency_key/ merchant_reference (PSP-də sabitdirsə)
3. (amount, currency, timestamp_bucket, last4/bin, auth_code)
4. Fuzzy-qat: ± tolerans cəmi/vaxt, BIN/issuer country, status family
Tövsiyələr:- Hər ikisini saxlayın: 'payment _ id' və 'provider _ txid'.
- partial/refund üçün - 'sequence _ index' və ya 'refund _ line _ id' əlavə edin.
- Для payouts — `payout_batch_id + line_id`.
- FX üçün - 'exec _ id' (konvertasiya) və kurs mənbəyi.
4) Data modeli (normallaşdırılmış qat)
json
{
"source": "INTERNAL PSP_TX PSP_SETTLEMENT BANK",
"provider": "Acquirer_A",
"payment_id": "pay_123",
"provider_txid": "psp_tx_789",
"kind": "AUTH CAPTURE REFUND PAYOUT FEE SETTLEMENT CHARGEBACK",
"sequence": 0,
"amount": 100. 00,
"currency": "EUR",
"fee_amount": 1. 20,
"fx_rate": 1. 0000,
"fx_src": "PSP ECB BANK",
"status": "APPROVED CAPTURED SUCCESS FAILED SETTLED",
"event_ts": "2025-11-03T12:00:00Z",
"settlement_date": "2025-11-05",
"account": "PSP_MERCHANT_CARD_A",
"matching_keys": {
"provider_txid": "psp_tx_789",
"merchant_ref": "mr_456",
"idem_key": "idem_abc"
},
"hash_row": "sha256(...)"
}
5) Yoxlama prosesi (ETL/orkestr)
1. Ingest: PSP (SFTP/API) hesabatlarını götürün, sxemi/imzaları təsdiqləyin, 'raw' -da saxlayın.
2. Normalize: vahid formata (currency ISO, decimals, UTC tayms) sahə mappimi.
3. Match: ağac açarlarının toleranslarla müqayisə alqoritmi.
4. Post-match: ledger/korreksiyalar üçün diff (uyğunsuzluqlar) və journal entries formalaşdırmaq.
5. Settle: 'PSP _ SETTLEMENT BANK' (hesaba köçürmələr) tikirik, günlərə/batçlara səpələyirik.
6. Report: daşbord, alertlər; DLQ-da əl təhlili/avtomobil oyunu üçün mübahisəli.
İdempotentlik: hər bir fayl/səhifə üçün - 'ingest _ id'. Təkrar yükləmə nəticəni dəyişdirmir.
6) Tolerans (tolerances) və qaydalar
Vaxt: əməliyyatlar üçün '± 15 dəq', settlement üçün '± 1 gün'.
Məbləğ: '≤ 0. 01 'əsas valyuta və ya' ≤ 10 bps 'FX/fee fərqləri üçün.
FX: məzənnə mənbəyi fərqli olduqda bankla uyğunsuzluğa yol veririk; 'fx _ src' yazın.
Partial/Multiple: partial/refund xətləri üzrə məbləğ daxili qalığa bərabər olmalıdır.
7) Uyğunsuzluqların emalı (diff taxonomy)
8) Ledger & Accounting
Capture: `DR Accounts Receivable / CR Revenue` и `DR Cash (upon settle) / CR Accounts Receivable`
Fee: `DR Fees / CR Cash or Payable`
Refund: partial proporsional əks naqillər
Chargeback: fərdi hesablar və mübahisələr üçün ehtiyat
FX reval: «fx _ src _ policy» məzənnəsi ilə AR/cache qalığının gündəlik yenidən qiymətləndirilməsi
9) KPI və məqsədlər
Auto-match% = avtomatik olaraq müqayisə olunan sətirlər/bütün sətirlər (hədəf ≥ 95%)
Recon Mismatch Rate = diff-sətirlər/bütün sətirlər (≤ 1-2%)
Aging of Unreconciled: p50/p95 gün DLQ (p95 ≤ 3 gün)
Settlement Timeliness: bank D-gün ilə tikilmiş batches payı (≥ 99%)
Fee Accuracy: Provayderlər üzrə komissiya fərqləri (≤ 0. 1% dövriyyə)
Duplicate/Orphan Incidents: 0 üçün çalışır
10) SQL dilimləri
10. 1 Əsas müqayisə provider_txid
sql
WITH i AS (
SELECT provider, provider_txid, kind, amount, currency, event_ts
FROM internal_norm
),
p AS (
SELECT provider, provider_txid, kind, amount, currency, event_ts
FROM psp_norm
)
SELECT
COALESCE(i. provider_txid, p. provider_txid) AS txid,
COALESCE(i. provider, p. provider) AS provider,
i.kind AS kind_internal, p. kind AS kind_psp,
i.amount AS amount_internal, p. amount AS amount_psp,
i.currency, p. currency,
CASE
WHEN i.provider_txid IS NULL THEN 'MISSING_INTERNAL'
WHEN p. provider_txid IS NULL THEN 'MISSING_PSP'
WHEN ABS(i. amount - p. amount) > 0. 01 THEN 'AMOUNT_MISMATCH'
ELSE 'MATCHED'
END AS recon_status
FROM i
FULL OUTER JOIN p USING (provider, provider_txid);
10. 2 Settlement ↔ Bank
sql
SELECT s. settlement_date, s. batch_id, s. currency,
s. amount_settled, b. amount_bank,
(b. amount_bank - s. amount_settled) AS diff
FROM psp_settlements s
LEFT JOIN bank_statements b
ON b. value_date = s. settlement_date
AND b. currency = s. currency
AND ABS(b. amount_bank - s. amount_settled) <= 0. 5;
10. 3 Aging DLQ
sql
SELECT diff_type,
COUNT() AS cnt,
PERCENTILE_CONT(0. 5) WITHIN GROUP (ORDER BY AGE(NOW(), created_at)) AS p50_age,
PERCENTILE_CONT(0. 95) WITHIN GROUP (ORDER BY AGE(NOW(), created_at)) AS p95_age
FROM recon_dlq
GROUP BY diff_type
ORDER BY cnt DESC;
11) Rels/keys xüsusiyyətləri
Xəritələr: 'auth' və 'capture' arasındakı fərqlər, gec 'settlement' düzəlişlər, intercheynj/sxem fee - ayrı xətlərlə.
A2A/Open Banking/RTP: ani təsdiqlər, lakin mümkündür 'reversal'; 'payout' və geri qaytarmaları yoxlayın.
Cüzdanlar: çox vaxt mükəmməl 'provider _ txid', sürətli 'refund'; fee xətlərini izləyin.
Kuponlar: simmetrik refund yoxdur - siyasət və hesabatlarda düzgün əks etdirin.
Kriptovalyutası: on-chain hash provider_txid; N konfirmaları; şəbəkə komissiyalarının və mümkün rebeytlərin uçotu; kurs - konvertasiya zamanı.
12) Əməliyyat pleybukları
MISSING_INTERNAL sıçrayışı: vebhuk/retraj itkisini yoxlayın, ingestion-u təkrarlayın, API pollinqini açın.
AMOUNT_MISMATCH bir PSP var: dəyirmanları/ƏDV/fee-modeli müqayisə edin, tənzimləyici statement tələb edin.
Settlement bankla tikilmir: value date, bank komissiyası, T + N gecikmələrini yoxlayın; müvəqqəti olaraq «Suspense Account» qoyun.
Kütləvi REFUND_OVER: avtomatik refandların dərhal dayandırılması, idempotentlik auditi, əl korreksiyası.
FX_DRIFT: siyasi məzənnə mənbəyini (ECB/PSP/BANK) qeyd edin, P&L fərqlərini yenidən hesablayın.
13) Nəzarət və təhlükəsizlik
İdempotentlik ingestion: 'file _ id + checksum' və yükləmə jurnalı.
Giriş (RBAC) və 4 gözlü nəzarət: əl korreksiyaları/jurnal naqilləri.
Audit-trail: bütün matçlar/diflər/düzəlişlər - dəyişməz jurnalda.
Məlumat keyfiyyəti: sxemlər, məcburi sahələr, valyuta/skeylin validasiyası.
14) Daşbord və Alertlər
Widget: Auto-match%, Mismatch Rate, Aging DLQ, Settlement Timeliness, Fee Accuracy, Diff Top PSP, Diff tipli kart.
Alertlər:- 'Auto-match% <90%' provayder/gün → P1
- 'Aging p95> 3 gün' → P2
- `AMOUNT_MISMATCH spike` → P1
- 'Bank ≠ Settlement' məbləği/valyutası üzrə → P0
15) Test halları (UAT/Prod)
1. Eyni faylın yenidən yüklənməsi → 0 yan təsiri (idempotentlik).
2. Qismən refands (3 xətt) → məbləğ üst-üstə düşür, sequence matç.
3. FX-konvertasiya: tolerans daxilində kurs uyğunsuzluğu → düzgün match.
4. Dublikatlar hesabatda provider_txid → dedup və alert.
5. itkin webhook capture → polling qapalı gap, status hizalanır.
6. Settlement batch fee-line → Revenue/Fee/Net-də düzgün bölünmə.
16) Tez-tez səhvlər və qarşısını almaq üçün necə
Müqayisə bazalarının qarışması (compare 'attempt' vs 'capture') → eyni qranulyarlığı saxlayın.
No 'provider _ txid' log → matç dəqiqliyini itirir.
Ignor Taymzon → settlement tarixlərinə görə yerdəyişmə.
No DLQ/retrains → «əbədi» uyğunsuzluqlar.
Jurnal olmadan əl düzəlişləri → audit ilə uyğunsuzluq.
Qeyri-müəyyən tolerans → ya yenidən matç, ya da «hamısı DLQ».
17) Giriş yoxlama siyahısı
- Vahid normallaşdırma sxemi və PSP/metodları/hesabları
- Ağac açar müqayisə (txid → merchant_ref → fuzzy)
- Total/Time/FX tolerans, kurs mənbəyi siyasəti
- İdempotent ingestion, DLQ, retray, alert
- Settlement Bank, Suspense Account Siyasəti
- Dashboard KPI, maliyyə/audit üçün hesabat
- Playbook və SLA diff-cases təhlili
Xülasə
Uyğunlaşma mühəndislik intizamıdır: normallaşma, etibarlı açarlar, tolerans, avtomatik matçlar və şəffaf düzəlişlər. Bu kontur ilə siz gəlirləri və komissiyaları sabitləşdirir, «qara dəlikləri» minimuma endirir, dövrün bağlanmasını sürətləndirir və ağrısız auditdən keçirsiniz: Auto-match% ↑, Mismatch ↓, Aging ↓.