GH GambleHub

PSP ödemelerinin ve raporlarının uzlaştırılması

TL; DR

Mutabakat, defter ve etkinliklerinizin (auth/capture/refund/payout) PSP/acquirer/bank raporları ile günlük otomatik olarak birleştirilmesidir. Başarının anahtarı: tek bir veri modeli, deterministik eşleştirme anahtarları, sıkı idempotency, toplam/FX/zaman toleransları, tartışmalı durumlar için DLQ kuyruğu ve otomatik düzeltme oyun kitapları. KPI: Recon Uyumsuzluk Rate↓, Unreconciled↓ Yaşlanma, Otomatik match%↑.

1) Neden ve neyi kontrol ediyoruz

Hedefler: gelir ve komisyonların onaylanması, yinelenen/zarar tespiti, günlere ve para birimlerine göre doğru yerleşim, kaynağa geri ödeme kontrolü, denetim/düzenleyiciye uygunluk.

Uzlaşma nesneleri:
  • Para yatırma: 'auth> capture - settle'
  • Geri ödemeler: tam/kısmi, durumlar ve tutarlar
  • Ödemeler/Para Çekme: Giden Yöntem Ödemeleri
  • Ücretler ve Ayarlamalar: PSP ücretleri, değişim planları, düzeltmeler
  • Ters ibrazlar/Anlaşmazlıklar: Girişiminizin Ötesinde
  • FX/Dönüşümler: oranlar, spreadler, sabitleme noktası

2) Veri kaynakları

Dahili Etkinlikler: etkinlik otobüsü/Kafka, 'payments _ flat', 'return', 'payments', sizin Defteriniz.

PSP Raporları (SFTP/API/webhook dökümü):
  • İşlemler (operasyonel tablolar)
  • Yerleşimler/Partiler
  • Ücretler/Beyanlar
  • Ters ibrazlar/Anlaşmazlıklar
  • Ödemeler/OCT/RTP/SEPA kayıtları
  • Banka Dekontları: CAMT MT940/CSV/ISO20022, credit lift.
💡 Depolama: İniş, ham, normalleştirilmiş, eşleşti. Tüm gelen dosyalar - sağlama toplamları ve sürümlerle.

3) Eşleşen anahtarlar

Öncelik anahtar ağacı (doğrulukta inen):

1. provider_txid ↔ provider_txid (benzersiz PSP Kimliği)

2. idempotency_key/ merchant_reference (PSP'de kararlıysa)

3. (miktar, para birimi, timestamp_bucket, last4/bin, auth_code)

4. Bulanık katman: Toplam/zamana göre ± toleranslar, BIN/veren ülke, durum ailesi

Öneriler:
  • Hem 'payment _ id'hem de' provider _ txid 'tutun.
  • Kısmi/geri ödeme için, 'sequence _ index' veya 'refund _ line _ id' ekleyin.
  • Для ödemeler - 'payout _ batch _ id + line_id'.
  • FX için - 'exec _ id' (dönüşüm) ve oranın kaynağı.

4) Veri modeli (normalize edilmiş katman)

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) Uzlaşma süreci (ETL/orkestrasyon)

1. Ingest: PSP raporlarını (SFTP/API) alıyoruz, şemayı/imzaları doğruluyoruz, 'ham'olarak kaydediyoruz.
2. Normalize: alanın birleşik biçime mappim (para birimi ISO, ondalık, UTC saat dilimi).
3. Eşleşme: Anahtar ağacı toleranslarla eşleştirmek için algoritma.
4. Maç sonrası: defter/düzeltmeler için form diff (tutarsızlıklar) ve günlük girişleri.
5. Yerleşme: dikiş 'PSP _ SETTLEMENT ↔ BANK' (hesaba kredi), gün/toplu olarak dağılım.
6. Rapor: pano, uyarılar; Manuel ayrıştırma/otomatik yeniden oynatma için DLQ'da tartışmalı.

Idempotence: her dosya/sayfa için - 'ingest _ id'. Yeniden yükleme sonucu değiştirmez.

6) Toleranslar ve kurallar

Süre: İşlemler için '± 15 dakika', uzlaşma için '± 1 gün'.
Miktar: '≤ 0. FX/ücret farkları için 01 'temel para birimi veya' ≤ 10 bps '.
FX: Döviz kurunun kaynağı farklıysa bankayla tutarsızlığa izin veriyoruz; fix 'fx _ src'.
Kısmi/Çoklu: Kısmi/geri ödeme hatlarının toplamı iç bakiyeye eşit olmalıdır.

7) Diff taksonomisi

Diff türüAçıklamaEylem
MISSING_INTERNALPSP var, biz yokYetim vaka oluştur, webhooks/retrays kontrol et
MISSING_PSPBiz yaptık, PSP yapmadıDurumu kontrol edin/tekrarlayın, PSP kontağı
AMOUNT_MISMATCHMiktarlar değişir> toleransOtomatik düzeltme/Günlük, Gerektiğinde Yükselt
FEE_MISMATCHKomisyonlar farklıPSP'yi "doğru" (politika) olarak kabul edin veya kredi notu isteyin
STATUS_DRIFTBizimle YAKALAMA, PSP ile AUTHYakalama/yerleşim webhook'larını kontrol edin
DUPLICATEYinelenen çizgiler'Provider _ txid/idempotency _ key'ile Dedup
FX_DRIFTKurslar farklılaşıyorResmi kaynağı ayarla, P&L'yi ayarla
REFUND_OVERGeri ödeme> yakalandıAcil ünite, manuel ayrıştırma, ters düzeltme günlüğü

8) Defter ve Muhasebe

Yakalama: 'DR Hesapları Alacak/CR Geliri' и 'DR Nakit (anlaşma üzerine )/CR Hesapları Alacak'

Ücret: 'DR Ücretleri/CR Nakit veya Ödeme'

Geri ödeme: ters ilanlar pro rata kısmi

Ters ibraz: ayrı hesaplar ve anlaşmazlıklar için rezerv

FX reval: AR/önbellek bakiyesinin günlük yeniden değerlemesi 'fx _ src _ policy'

9) KPI'lar ve hedefler

Otomatik eşleşme % = otomatik eşleşme çizgileri/tüm çizgiler (hedef ≥ %95)

Keşif Uyumsuzluk Oranı = diff çizgileri/tüm çizgiler (≤ %1-2)

Kaplanmamış Yaşlanma: DLQ'da p50/p95 gün (p95 ≤ 3 gün)

Yerleşim Süresi: D-day bank ile dikilen partilerin oranı (≥ %99)

Ücret Doğruluğu: sağlayıcı ücreti tutarsızlıkları (≤ 0. Cironun %1'i)

Yinelenen/Yetim Olayları: Hedef 0

10) SQL dilimleri

10. 1 Temel provider_txid eşleştirme

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 Banka ↔ ödeme

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 Yaşlanma 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) Raylar/kılıflar üzerindeki özellikler

Haritalar: 'auth've' capture 'arasındaki farklar, geç' yerleşim 'ayarlamaları, değişim/devre ücreti - ayrı hatlar.
A2A/Open Bankacılık/RTP: Anlık onaylar, ancak 'tersine' mümkün; 'ödeme've iadeleri kontrol edin.
Cüzdanlar: genellikle mükemmel 'provider _ txid', hızlı 'geri ödeme'; Ücret hatlarına dikkat et.
Kuponlar: simetrik geri ödeme yok - politika ve raporlarda doğru şekilde yansıtın.
Kripto: zincirleme hash ↔ provider_txid; Onaylar N; Ağ komisyonlarının ve olası indirimlerin muhasebeleştirilmesi; Döviz kuru - dönüşüm sırasında.

12) Operasyonel oyun kitapları

Surge in MISSING_INTERNAL: webhook/retray kayıplarını kontrol edin, yenilerini alın, API yoklamasını etkinleştirin.
bir PSP'den AMOUNT_MISMATCH: yuvarlama/KDV/ücret modelini karşılaştırın, bir düzeltme bildirimi isteyin.
Uzlaşma bankaya bağlanmaz: çek değeri tarihi, banka ücretleri, T + N gecikmeleri; Geçici olarak "Suspense Hesabı'na koyun.
Kütle REFUND_OVER: anında stop otomatik refandlar, idempotency denetimi, manuel düzeltme.
FX_DRIFT: döviz kuru kaynağının (ECB/PSP/BANK) politikasını düzeltin, P&L farklarını yeniden hesaplayın.

13) Kontrol ve güvenlik

Yutmanın idempotansı: 'file _ id + checksum've indirme geçmişi.
Erişim (RBAC) ve 4-göz kontrolü: manuel düzeltmeler/günlük girişleri için.
Denetim izi: tüm eşleşmeler/differs/düzeltmeler - değiştirilemez bir günlükte.
Veri kalitesi: şemalar, zorunlu alanlar, para birimi/ölçek doğrulaması.

14) Gösterge tablosu ve uyarılar

Widget'lar: Otomatik eşleşme %, Uyumsuzluk Oranı, Yaşlanma DLQ, Yerleşim Zamanlaması, Ücret Doğruluğu, diff tarafından üst PSP, diff tipi harita.

Uyarılar:
  • 'Otomatik eşleşme % <%90' sağlayıcıya/güne göre> P1
  • 'Yaşlanma p95> 3 gün' P2
  • 'TUTAR _ UYUŞMAZLIK ani' - P1
  • Miktar/para birimi ile 'Bank≠Settlement' - P0

15) Test Durumları (UAT/Prod)

1. Aynı dosyanın yeniden yüklenmesi - 0 yan etki (idempotency).
2. Kısmi refandlar (3 satır) - miktar eşleşir, sıraya göre eşleşir.
3. FX dönüşümü: tolerans içinde döviz kuru tutarsızlığı - doğru eşleşme.
4. Rapordaki yinelenen provider_txid - dedup ve uyarı.
5. Eksik webhook yakalama - oylama boşluğu kapattı, durum hizalandı.
6. Ücret çizgisine sahip yerleşim partisi - Gelir/Ücret/Net'te doğru arıza.

16) Sık yapılan hatalar ve nasıl önleneceği

'Girişim' vs 'yakalama' karşılaştırın - aynı granülerliği tutun.
^ günlüğünde 'provider _ txid' olmaması maçın doğruluğunu kaybeder.
Zaman dilimini yoksaymak - yerleşim tarihleriyle dengelemek.
DLQ/retras - "ebedi" tutarsızlıklar yoktur.
Günlük olmadan manuel düzenlemeler - denetimde tutarsızlık.
Bulanık toleranslar - ya bir yeniden eşleşme ya da "hepsi DLQ'da".

17) Uygulama kontrol listesi

  • Birleşik normalleştirme şeması ve PSP/yöntem/hesap dizinleri
  • Mapping Key Tree (txid merchant_ref bulanık)
  • Miktar/Zaman Toleransları/FX, Ders Kaynak Politikası
  • Idempotent yutma, DLQ, retrai, uyarılar
  • Settlement↔Bank Uzlaşma, Suspense Hesap Politikası
  • Gösterge tablosu KPI, finansal/denetim raporlama
  • Playbooks ve SLA ayrıştırma diff durumları

Özet

Uzlaşma bir mühendislik disiplinidir: normalleştirme, güvenilir anahtarlar, toleranslar, otomatik eşleşmeler ve şeffaf düzeltmeler. Böyle bir konturla, gelir ve komisyonları stabilize eder,'kara delikleri "en aza indirir, periyot kapanmasını hızlandırır ve acı çekmeden denetlenir: Otomatik match%↑, Mismatch↓, Aging↓.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.