GH GambleHub

PSP გადახდისა და ანგარიშების შერწყმა

TL; DR

Crash არის თქვენი მენეჯერისა და მოვლენების ყოველდღიური ავტომატიზირებული შეკრება (aut/capture/refund/payout) PSP/შეძენის/ბანკების ანგარიშებით. წარმატების გასაღები: მონაცემთა ერთიანი მოდელი, დეტერმინისტული შედარების გასაღებები, მკაცრი idempotence, თანხის ტოლერანტობა/FX/დრო, DLQ რიგები საკამათო შემთხვევებისთვის და ავტო კორექტირების ფლეიბუკები. KPI: Recon Mismatch Rate↓, Aging of Unreconciled↓, Auto-match%↑.

1) რატომ და რას ვამოწმებთ

მიზნები: შემოსავლისა და საკომისიოს დადასტურება, დუბლირების/დაკარგვის დადგენა, დღის და ვალუტების სწორი პასტირება, რეგულირების კონტროლი, აუდიტის/რეგულატორის შესაბამისობა.

შერწყმის ობიექტები:
  • Deposits: `auth → capture → settle`
  • Refunds: full/partial, სტატუსი და თანხები
  • Payouts/Withdrawals: გამავალი გადახდები მეთოდებით
  • Fees & Adjustments: PSP კომისიები, ინტერჩეინგის სქემები, კორექტირება
  • Chargebacks/Disputes: თქვენი ინიციატივის გარეთ
  • FX/კონვერტაცია: კურსები, გავრცელება, ფიქსაციის მომენტი

2) მონაცემთა წყაროები

Internal Events (თქვენი): მოვლენების ავტობუსი/Kafka, 'payments _ flat', 'refunds', 'payouts', თქვენი Ledger.

PSP Reports (SFTP/API/webhook dump):
  • Transactions (ოპერაციული ამონაწერები)
  • Settlements/Batches (დანართები T + N)
  • Fees/Statements (საკომისიო, კორექტირება)
  • Chargebacks/Disputes
  • Payouts/OCT/RTP/SEPA რეესტრები
  • Bank Statements: MT940/CSV/ISO20022 CAMT, შენატანი.
💡 საცავი: landing raw და normalized - matched. ყველა შემომავალი ფაილი - საკონტროლო თანხით და ვერსიით.

3) შედარების გასაღებები

პრიორიტეტული გასაღების ხე (სიზუსტის შემცირება):

1. provider _ txid provider _ txid (უნიკალური ID PSP)

2. idempotency _ key/merchant _ reference (თუ PSP სტაბილურია)

3. (amount, currency, timestamp_bucket, last4/bin, auth_code)

4. Fuzzy ფენა: ± ტოლერანელები ჯამში/დროში, BIN/issuer country, status family

რეკომენდაციები:
  • შეინახეთ ორივე: 'payment _ id' და 'provider _ txid'.
  • partial/refund- ისთვის - დაამატეთ 'sequence _ index' ან 'refund _ line _ id'.
  • Для payouts — `payout_batch_id + line_id`.
  • FX- სთვის - 'exec _ id' (კონვერტაცია) და კურსის წყარო.

4) მონაცემთა მოდელი (ნორმალიზებული ფენა)

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) შერიგების პროცესი (ETL/ორკესტრი)

1. Ingest: ჩვენ ვიღებთ მოხსენებებს PSP (SFTP/API), ვადაგადაცილებული სქემა/ხელმოწერა, შეინახეთ 'raw' - ში.
2. Normalize: mappim ველი ერთიანი ფორმატით (currency ISO, decimals, taimson UTC).
3. Match: ალგორითმი ტოლერანტული გასაღებების ხის შედარების შესახებ.
4. Post-match: ჩვენ ვქმნით diff (შეუსაბამობებს) და journal entries ლეჯერის/კორექტირებისთვის.
5. Settle: შეკერილი 'PSP _ SETTLEMENT' - BANK '(ანგარიშზე ჩარიცხვა), მიმოფანტეთ დღეების/ბრძოლების გასწვრივ.
6. ანგარიში: დაშბორდი, ალერტა; სადავოა DLQ- ში ხელით ანალიზზე/მანქანის რეპლიკაში.

Idempotence: თითოეული ფაილისთვის/გვერდისთვის - 'ingest _ id'. განმეორებითი დატვირთვა არ ცვლის შედეგს.

6) ტოლერანსები და წესები

დრო: '± 15 წუთი' გარიგებისთვის, '± 1 დნმ' ასლებისთვის.
თანხა: '0. 01 'საბაზო ვალუტა ან' 10 bps 'FX/fee განსხვავებებისთვის.
FX: ჩვენ ვუშვებთ განსხვავებას ბანკთან, თუ კურსის წყარო განსხვავებულია; ჩაწერეთ 'fx _ src'.
Partial/Multiple: თანხა partial/refund ხაზების გასწვრივ უნდა იყოს ტოლი შიდა დარჩენილი.

7) შეუსაბამობის დამუშავება

ტიპი diffაღწერამოქმედება
MISSING_INTERNALPSP- ში არის, ჩვენ არ გვაქვსorphan case- ის შექმნა, webhooks/retrai შემოწმება
MISSING_PSPჩვენ გვაქვს PSP არასტატუსის/გამეორების შემოწმება, PSP კონტაქტი
AMOUNT_MISMATCHთანხები განსხვავდება> ტოლერანტულიავტოკორექცია/ჟურნალი, ესკალაცია საჭიროების შემთხვევაში
FEE_MISMATCHსაკომისიო განსხვავებულიამიიღეთ PSP, როგორც „ჭეშმარიტება“ ან მოითხოვეთ credit note
STATUS_DRIFTCAPTURE ჩვენთან, AUTH PSPშეამოწმეთ ვებჰუკები capture/settlement
DUPLICATEხაზების დუბლებიდედაპაპი 'provider _ txid/idempotency _ key'
FX_DRIFTკურსები განსხვავდებამიუთითეთ ოფიციალური წყარო, შეცვალეთ P&L
REFUND_OVERRefund > capturedგადაუდებელი განყოფილება, სახელმძღვანელო ანალიზი, საპირისპირო კორექტირების ჟურნალი

8) Ledger & Accounting (გაყვანილობა)

Capture: `DR Accounts Receivable / CR Revenue` и `DR Cash (upon settle) / CR Accounts Receivable`

Fee: `DR Fees / CR Cash or Payable`

Refund: საპირისპირო გაყვანილობა პარტიული პროპორციულად

Chargeback: ცალკეული ანგარიშები და სარეზერვო დავები

FX reval: AR/ქეშის ნარჩენების ყოველდღიური გადაფასება 'fx _ src _ policy' კურსით

9) KPI და მიზნები

Auto-match% = ავტომატურად შესადარებელი ხაზები/ყველა სტრიქონი (მიზანი 95%)

Recon Mismatch Rate = diff სტრიქონები/ყველა სტრიქონი (1-2%)

Unreconciled Aging: p50/p95 დღე DLQ- ში (p95-3 დღე)

Settlement Timeliness: D- დღეს შეკერილი ბრძოლების წილი (99% ევრო)

Fee Accuracy: პროვაიდერების კომისიების განსხვავებები (0 ევრო). ბრუნვის 1%)

Duplicate/Orphan Incidents: ცდილობს 0

10) SQL ნაჭრები

10. 1 ძირითადი შედარება 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) რელსების/კეისრების მახასიათებლები

ბარათები: განსხვავებები 'auth' და 'capture' შორის, გვიანდელი 'settlement' კორექტირება, interchange/სქემური fee - ცალკეული ხაზები.
A2A/Open Banking/RTP: მყისიერი დადასტურება, მაგრამ შესაძლებელია „რევერსული“; შეამოწმეთ 'payout' და ზარები.
საფულეები: ხშირად იდეალური 'provider _ txid', სწრაფი 'refund'; მიჰყევით ფე ხაზებს.
ვაუჩერები: არ არსებობს სიმეტრიული რეფუნდი - სწორად ასახეთ პოლიტიკაში და მოხსენებებში.
კრიპტო: on-chain hash, provider _ txid; ჩამორთმეული N; ქსელის საკომისიო და შესაძლო გადასახადები; კურსი - კონვერტაციის დროს.

12) ოპერაციული ფლეიბუკები

MISSING _ INTERNTERAL- ის ზრდა: შეამოწმეთ ვებჰუკების/რეტრაინების დაკარგვა, შეამოწმეთ ინვესტიცია, ჩართეთ API ნახევარი.
AMOUNT _ MISMATCH ერთი PSP- სგან: შეადარეთ დამრგვალება/დღგ/fee მოდელი, მოითხოვეთ მაკორექტირებელი პასაჟი.
Settlement არ არის შეკერილი ბანკთან: შეამოწმეთ დავალიანება, საბანკო კომისიები, შეფერხებები T + N; დროებით განთავსება Suspense Account- ში.
მასობრივი REFUND _ OVER: რეფანდების დაუყოვნებლივი გაჩერება, იდემპოტენტურობის აუდიტი, სახელმძღვანელო კორექტირება.
FX _ DRIFT: დაფიქსირდეს კურსის წყაროს პოლიტიკა (ECB/PSP/BANK), გამოითვალოს P&L განსხვავება.

13) კონტროლი და უსაფრთხოება

Idempotention ingestion: 'file _ id + checksum' და ჩამოტვირთვის ჟურნალი.
წვდომა (RBAC) და 4 - თვალის კონტროლი: სახელმძღვანელო კორექტირებაზე/ჟურნალის გაყვანილობაზე.
აუდიტის ბილიკი: ყველა მატჩი/დიფა/კორექტირება უცვლელი ჟურნალია.
მონაცემთა ხარისხი: სქემები, სავალდებულო ველები, ვალუტების/სკეიტის შესაბამისობა.

14) დაშბორდი და ალერტა

ვიჯეტები: Auto-match%, Mismatch Rate, Aging DLQ, Settlement Timeliness, Fee Accuracy, ტოპ PSP დიფები, diff ტიპის რუკა.

ალერტა:
  • 'auto-match% <90%' პროვაიდერის/დღის მიხედვით P1
  • 'Aging p95> 3 dn' P2
  • `AMOUNT_MISMATCH spike` → P1
  • 'Bank' Settlement 'ოდენობით/ვალუტით P0

15) ტესტის შემთხვევები (UAT/UAT)

1. იგივე ფაილის განმეორებითი ჩატვირთვა - 0 გვერდითი მოვლენა (idempotence).
2. ნაწილობრივი რეფანდები (3 სტრიქონი) - თანხა ემთხვევა, sequence მატჩი.
3. FX კონვერტაცია: კურსის შეუსაბამობა ტოლერანსში - სწორი match.
4. provider _ txid დუბლიკატები მოხსენებაში არის დედაპი და ალერტი.
5. დაკარგული webhook capture- მა დახურა gap, სტატუსი გაათანაბრა.
6. Settlement batch fee ხაზით - სწორი დაშლა Revenue/Fee/Net.

16) ხშირი შეცდომები და როგორ ავარიდოთ თავი?

შედარების ბაზების ნაზავი (compare 'attempt' vs 'capture') - შეინარჩუნეთ იგივე მარცვალი.
„provider _ txid“ - ის არარსებობა მატჩის სიზუსტე იკარგება.
Timson- ის უგულებელყოფა settlement თარიღების მიხედვით.
არ არსებობს DLQ/retrais - „მარადიული“ განსხვავებები.
სახელმძღვანელო რედაქტორები ჟურნალის გარეშე - აუდიტის გარეშე.
უცნაური ტოლერანტები - ან წინა მატჩი, ან „ყველაფერი DLQ- ში“.

17) განხორციელების შემოწმების სია

  • ნორმალიზაციის ერთიანი სქემა და PSP/მეთოდები/ანგარიშები
  • შედარების გასაღების ხე (txid - merchant _ ref - fuzzy)
  • ტოლერანსი ჯამში/დროში/FX, კურსის წყაროს პოლიტიკა
  • Idempotent ingestion, DLQ, retrai, alerty
  • Settlement-Bank- ის შერიგება, Suspense Account პოლიტიკა
  • დაშბორდ KPI, ანგარიშები ფინანსების/აუდიტის შესახებ
  • Playbooks და SLA diff შემთხვევების ანალიზი

რეზიუმე

შერჩევა არის საინჟინრო დისციპლინა: ნორმალიზაცია, საიმედო გასაღებები, ტოლერანტობა, ავტომატური მატჩები და გამჭვირვალე კორექტირება. ასეთი კონტურით, თქვენ სტაბილიზირებთ შემოსავალს და საკომისიოს, მინიმუმამდე დაიყვანთ „შავი ხვრელები“, დააჩქარეთ პერიოდის დახურვა და გაიარეთ აუდიტი ტკივილის გარეშე: Auto-match%, Mismatch, Aging.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

Telegram
@Gamble_GC
ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.