GH GambleHub

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ı.
💡 Anbar: landing → raw → normalized → matched. Bütün daxil olan fayllar - nəzarət məbləğləri və versiyası ilə.

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)

Diff növüTəsvirFəaliyyət
MISSING_INTERNALPSP-də var, bizdə yoxdurOrphan case yaradın, webhooks/retrajları yoxlayın
MISSING_PSPBiz var, PSP yoxdurStatus/təkrarlama yoxlayın, əlaqə PSP
AMOUNT_MISMATCHMəbləğlər fərqlənir> toleransAvtomatik korreksiya/jurnal, lazım olduqda eskalasiya
FEE_MISMATCHKomissiyalar fərqlidirPSP-ni «həqiqət» (policy) kimi qəbul edin və ya kredit note tələb edin
STATUS_DRIFTCAPTURE bizdə, AUTH PSP-dəWebhook capture/settlement
DUPLICATEDubli sətirləriDedup 'provider _ txid/idempotency _ key'
FX_DRIFTKurslar fərqlənirRəsmi mənbəni təyin et, P & L-ni düzəlt
REFUND_OVERRefund > capturedTəcili blok, əl təhlili, əks düzəliş jurnalı

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 ↓.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.