$data=json_decode(file_get_contents("php://input"),true); /* 1 Verify merchant 2 Check transaction 3 Check refundable balance 4 Call Fincra API 5 Save refund 6 Update transaction 7 Send webhook 8 Email customer 9 Return JSON */ Refund Timeline Under Transaction Details add Refund History ──────────────────── Requested 10 Jul Processing 10 Jul Completed 10 Jul If multiple refunds Refund #1 ₦20,000 Completed Refund #2 ₦15,000 Pending Refund Receipt Every refund generates Refund Receipt Original Transaction Refund Reference Amount Refunded Reason Provider Status Date Processed By Merchant Notifications Show Refund Requested Refund Processing Refund Successful Refund Failed inside Notifications. Email Customer receives Refund Completed Amount Reference Expected Arrival Support Contact Webhook Merchants receive { "event":"refund.success", "transaction_id":"...", "refund_reference":"...", "amount":"25000", "currency":"NGN" } Provider Integration Layer Because BSTPay supports multiple processors, avoid embedding provider logic directly in refund.php. A cleaner production architecture is: Transaction │ ▼ Refund Service │ ├── FincraRefundProvider ├── FlutterwaveRefundProvider ├── SquadRefundProvider ├── ManualRefundProvider └── Future Providers The refund service decides which provider to call based on the original transaction. This keeps your refund workflow consistent even as you add or replace payment partners. Next Batch (Batch 7) We'll build the Advanced Transaction Filters & Saved Views, including: Multi-field filtering (amount, customer, provider, country, card BIN, currency, payment method, settlement status) Saved filter presets Merchant-specific custom views Search chips Export filtered results Server-side pagination and sorting Fast MySQL query builder for production-scale transaction volumes.