Filters:
PSP Deposits
—
CRM Deposits
—
PSP Refunds
—
CRM Refunds
—
Net Volume
—
Approval Ratio
—
Pending
—
Excluded from ratio
Deposit Gap
—
PSP − CRM
Refund Gap
—
PSP − CRM refunds
Deposit & refund trend — last 14 days
PSP Deposits
CRM Deposits
Refunds
Top countries (CRM KYC)
Payment category split
Card / Local / Crypto
Card
Local
Crypto
Top decline reasons
Top PSPs by volume
PSP Deposits
—
CRM Deposits
—
BridgerPay Approved
—
Manual Deposits
—
Transaction Count
—
PSP approved + declined
Approval Ratio
—
Excl. pending
Avg Deposit Size
—
PSP approved only
Deposit trend
PSP received
CRM credited
BridgerPay
Manual
Deposits by PSP
Deposits by country (CRM KYC)
Deposits by continent
Transaction log
Showing 0 of 0
| Order ID | Client | Amount | PSP | Category | Country | PSP Status | Orch Status | CRM Status | Final Status | Time (UTC) |
|---|
PSP REFUNDS
—
Awaiting data import
CRM REFUNDS
—
Awaiting data import
REFUND COUNT
—
Awaiting data import
AVG REFUND
—
Awaiting data import
REFUND GAP
—
PSP − CRM refunds
Refund trend — PSP vs CRM (14 days)
PSP refunds
CRM refunds
Ratio %
Refunds by PSP
Refund log
Showing 0 of 0
| Order ID | Client ID | Amount | PSP | Category | PSP Refund Status | CRM Refund Status | Initiated |
|---|
Deposit reconciliation — PSP vs CRM
PSP vs CRM deposits
PSP total—
CRM total—
Gap—
PSP vs CRM refunds
PSP refunds—
CRM refunds—
Gap—
Exception summary
Reconciled—
Missing CRM credits—
Overcredited in CRM—
Orch failures—
Amount mismatches—
Expected FX diffs—
Other checks
Duplicates detected—
Currency mismatches—
Low-val mismatches (<$1)—
Missing CRM credits
0 records
| Order ID | Client ID | PSP Amount | CRM Amount | Gap | PSP | Category | Action |
|---|
PSP Approved – Orchestrator Failed
0 records
| Order ID | Client ID | Amount | PSP | PSP Status | Orch Status | CRM Status | Action |
|---|
Amount mismatches (≥$1.00)
0 records
| Order ID | Client ID | PSP Amount | CRM Amount | Delta | PSP | Category |
|---|
Overcredited in CRM
0 records
● CRM amount exceeds PSP amount for these orders — client may have been credited more than received. Investigate before any reversal.
| Order ID | Client ID | PSP Amount | CRM Amount | Overcharge | PSP | Category | Action |
|---|
Duplicate transactions detected
0 records
| Order ID | Client ID | Amount | PSP | Occurrence Count | Source |
|---|
Approval ratio by PSP — all payment categories
Approved / Declined / Pending by PSP
Approved
Declined
Pending
Performance by payment category
PSP performance summary
All PSPs
| PSP | Category | Total Volume | Approved Orders | Declined Orders | Approval % | Decline % | Pending |
|---|
TOTAL DECLINES
—
Awaiting data import
DECLINE RATE
—
Of total decided orders
TOP REASON
—
Awaiting data import
TOP CATEGORY
—
Awaiting data import
REROUTABLE (BIN BLOCKED)
—
Can fix via PSP rerouting
CLIENT / ISSUER SIDE
—
Cannot fix — outside our control
Decline reasons — standardized
Decline categories (high-level)
Declines by PSP
Decline trend by reason — last 14 days
Declines by country (top 6)
Decline log
Showing 0 of 0
| Order ID | Client | Amount | PSP | Category | Country | Code | Standardised Reason | Decline Category | Card | Last 4 | Card Issuer | Fixable | Recommended Action |
|---|
Live session metrics
SESSION STARTED
—
Tab open time
FILES UPLOADED
0
This session
ROWS IMPORTED
0
Across all sources
LAST UPLOAD
—
Most recent file
DATA STORAGE
sessionStorage
Clears on tab close
FX RATES
NGN 0.00065 · AED 0.2722
USDT 1:1 USD
Data completeness — current session
Session audit log
File upload history
0 events
| Time | Action | File | Entity | Schema | Rows Imported | Rows Rejected | Status |
|---|
| State | Condition | Required UI Behaviour | Not Allowed |
|---|---|---|---|
| Empty | No data imported for selected entity | Zero-value KPIs, no-data chart placeholders, guidance text | No PSP names, no percentages, no mock volumes |
| Partial | Some source families uploaded but not all | Show imported metrics only; data completeness warning | Do not fabricate missing metrics |
| Active | All required daily source families imported | Full metrics, charts, reconciliation, and alerts from actual data | No hardcoded fallback datasets |
| Error | Upload failed validation or parsing | Precise error reason by file, allow re-upload | Silent failure or fake success |
Phase 1 acceptance criteria — live status (v1.12 §24)
Source family completeness — current import state
PSP Deposits
Loaded
CRM Deposits
Loaded
BridgerPay
Not uploaded
CRM Refunds
Not uploaded
PSP Refunds
Not uploaded
Manual Credits
Optional
Approved PSP catalog — entity-aware (§5)
Minimum API contract — production backend (v1.9 §10)
| Endpoint | Method | Purpose | Response essentials |
|---|---|---|---|
| /api/upload/psp-deposits | POST | Batch upload PSP deposit files | batch_id, accepted_rows, rejected_rows, file_results, reject_log_url |
| /api/upload/psp-refunds | POST | Batch upload PSP refund files | same pattern as above |
| /api/upload/crm-deposits | POST | Upload CRM deposits file | same pattern as above |
| /api/upload/crm-refunds | POST | Upload CRM refunds file | same pattern as above |
| /api/upload/bridgerpay | POST | Upload BridgerPay report | same pattern as above |
| /api/upload/manual-credits | POST | Upload manual credit file | same pattern as above |
| /api/reject-log/{batch_id} | GET | Fetch row-level rejected records | grid-ready JSON and CSV download URL |
| /api/analytics/overview | GET | Fetch executive KPIs for entity/range | computed metrics only — no hardcoded values |
| /api/analytics/deposits | GET | Fetch deposit analytics and trends | entity-aware aggregates |
Database tables required — production (v1.9 §11)
| Table | Purpose | Notes |
|---|---|---|
| psp_deposits | Accepted PSP deposit rows | Entity-aware, source-aware. Financial source of truth. |
| psp_refunds | Accepted PSP refund rows | Entity-aware, source-aware. |
| crm_deposits | Accepted CRM deposit rows | Used for reconciliation and CRM KYC country analytics. |
| crm_refunds | Accepted CRM refund rows | Used for refund gap calculation. |
| bridgerpay_transactions | Accepted orchestrator rows | Used for approval ratio, cascade logic, decline analysis. |
| manual_credits | Manual CRM correction records | Closes CRM deposit gap after failed auto-credit. |
| upload_batches | One record per upload batch | batch_id, entity, status, uploaded_by, uploaded_at. |
| upload_files | One record per file in a batch | File-level accepted/rejected row counts. |
| reject_log | One record per rejected row | batch_id, file_name, row_number, column_name, raw_value, reject_reason. Required by v1.9. |
| analytics_daily | Pre-aggregated daily metrics | Optional. Improves dashboard load performance. |
Post-import refresh rules (v1.9 §13)
Success — full batch
Recompute affected analytics and refresh current page automatically.
User sees: "Import completed. Dashboard updated."
Success — partial (with rejects)
Store accepted rows, log rejects, refresh dashboard from accepted data only.
User sees: "Import completed with rejected rows. View rejects to review."
Failure — no rows stored
Do not change dashboard numbers. Show error state.
User sees: "Import failed. No data was stored."
Partial source coverage
Keep dashboard in Partial state and show source completeness warning.
User sees: "More source families required for full analytics."
Recommended production stack (v1.9 §17)
Frontend
Existing dashboard UI
Must call real APIs instead of in-memory simulation
Backend
Python FastAPI / Django
or Node.js Express / NestJS
Database
PostgreSQL
Recommended for structured financial + audit data
File Storage
Object storage or server FS
Retain original CSV files for audit traceability
Reject Export
Server-side CSV generation
Download reject report per batch for offline correction
Retention
12 months minimum
D/W/M/Q/rolling-12-month comparisons required
Live alert status — rule engine (§18)
Approval Ratio Alert
Current ratio 84.2% — within acceptable range.
Trigger: ratio < 60% → Warning Alert
Reconciliation Alert — ACTIVE
Deposit gap $12,340 exceeds threshold. Immediate review required.
Trigger: gap > $5,000 → Reconciliation Alert
Refund Spike Alert
Refund rate 6.7% — below 30% spike threshold.
Trigger: refund spike > 30% → Risk Alert
PSP Issue Alert — Watching
VirtualPay error rate 16% — approaching threshold. Monitor closely.
Trigger: PSP error rate > 10% → PSP Issue Alert
System health
Dashboard Load
1.8s
Within <3s requirement
Last CSV Ingestion
42s
Within <60s per 100k rows
Last Recon Job
1m 14s
Within <2min requirement
Data Retention
12 mo
Historical storage active
Validation Rejects
7
Rows rejected today
Active Alerts
2
Recon + PSP Issue
Processing pipeline architecture (§20)
01
CSV Upload
Operator uploads daily reports via dashboard
02
Validation Engine
Amount >0, non-empty IDs, valid currency, timestamp check
03
Normalization Layer
Status mapping, identifier unification, GMT+6 conversion
04
Database Storage
Rows stored in entity-scoped tables, dupes blocked
05
Aggregation Engine
KPIs, approval ratios, gaps, PSP stats recomputed
06
Dashboard Render
All pages refresh with new data automatically
Data validation rules (§19)
5 rules active
- ✓ Amount must be greater than 0
- ✓ merchantOrderId must not be empty
- ✓ Currency must match supported list (USD, EUR, GBP…)
- ✓ Timestamp must be present and parseable
- ✗ Invalid rows rejected before ingestion — not stored
Error detection rules (§17)
4 rules active
- ✗ Payment Failure — PSP approved, BridgerPay failed
- ↺ Retry Attempt — same merchantOrderId, multiple PSP txns
- ✗ Missing Credit — PSP success, CRM deposit absent
- ✗ Data Integrity Issue — refund exists, deposit missing
Data mapping matrix (§16)
| Source System | Source Field | Dashboard Field | Notes |
|---|---|---|---|
| BridgerPay | merchantOrderId | Transaction ID | Primary grouping key |
| PSP | transaction_id | PSP Transaction ID | Per-attempt reference |
| PSP | amount | Deposit Amount | Financial source of truth |
| PSP | currency | Currency | Must match supported list |
| PSP | status | PSP Status | Normalized to standard set |
| CRM | merchantOrderId | Transaction ID | Matched to PSP for reconciliation |
| CRM | deposit_amount | CRM Deposit Amount | Client ledger side |
| CRM | client_email | Client Email | KYC identity reference |
Access control model (§22)
4 roles
Admin
Full access
Payments Team
UploadDashboard
Finance
Dashboard view only
Compliance
Reporting access
Performance requirements (§21)
Audit log (§23)
Recent upload events
Showing 6 of 48
Timestamp (GMT+6)UserAction / FileEntity
2026-03-13 10:14:02ops.user1CSV Upload — confirmo_deposits_13mar.csvMauritius
2026-03-13 10:14:58ops.user1CSV Upload — b2binpay_deposits_13mar.csvMauritius
2026-03-13 10:15:44ops.user1CSV Upload — bridgerpay_mauritius_13mar.csvMauritius
2026-03-13 10:17:11ops.user1CSV Upload — crm_deposits_mau_13mar.csvMauritius
2026-03-13 10:21:05ops.user2CSV Upload — coinsbuy_deposits_13mar.csvComoros
2026-03-13 10:23:38ops.user2CSV Upload — manual_credits_13mar.csv 7 rows rejectedComoros
2026-03-13 10:30:00systemReconciliation job completed — gap detected, 8 missing CRM credits flaggedMauritius
Future roadmap (§24)
Phase 1 — Current
Manual CSV Dashboard
Daily CSV uploads, reconciliation, PSP analytics, decline analysis, alerting rules, audit logging.
Phase 2
API-Based Data Ingestion
Replace manual CSV with automated API pulls from PSP portals and BridgerPay. Reduce daily operator effort to zero for data collection.
Phase 3
Real-Time PSP Monitoring
Intraday streaming data, live approval ratio dashboards, real-time alerting on threshold breaches.
Phase 4
Automated Reconciliation
Auto-trigger manual credit workflows when missing CRM credits are detected. Reduce operational response time from hours to minutes.
Phase 5
AI Anomaly Detection & Smart PSP Routing
Machine learning models to flag unusual transaction patterns, fraud signals, and optimize PSP routing based on approval ratio history.
PSP source-wise validation rules — v1.8 (§8)
Visual system architecture — v1.10
PSP field mapping — source column → FNMarkets schema (v1.10)
Unified deposit schema — all PSPs normalize to this (v1.10)
Upload batch log — import history (§10)
Recent import batches
7 records
| Batch ID | Uploaded at | User | Entity | Source family | File name | Status | Total rows | Accepted | Rejected |
|---|