Capabilities & Constraints
- Flow type: Redirect to bank or bank switch; result confirmed by webhook.
- Capture model: Direct capture only (no separate auth/capture).
- Customer experience: Bank login → approve payment → redirect/return.
- Settlement: According to the connected provider/bank switch.
- Refunds: Supported by many providers after capture (rules vary; see matrix below). No “reversal”/void once bank has posted the debit.
- Retries: If abandoned/expired, create a new charge with a new
Idempotency-Key.
Typical Use Cases
- E-commerce checkout where card conversion is low
- High-trust domestic bank rails (e.g., Malaysia FPX-style, SG pay-by-bank)
- Desktop/mobile flows where redirect is acceptable
1. Create a Charge
Initiate the payment by creating a charge in your system with the transaction details.
2. Redirect the Customer
Use the
return_url from Monxa to send the customer to their bank app.3. Customer Approves at Bank App
The customer confirms the transaction by entering their PIN/OTP or using biometric authentication in their bank app.
4. Handle Webhooks
Once the e-wallet provider processes the payment, Monxa sends a webhook notification to update your system with the final status.
Supported Channels
- 🇲🇾 Malaysia
- 🇹🇭 Thailand
Payment Flow
Status Lifecycle
Field Reference
Step 1: Create a Charge
Create a charge with a bank-redirectchannel_code. Include a return_url (required) to bring the customer back to your site/app.
Request Example : Malaysia - FPX-like switch)
Request Example : Malaysia - FPX-like switch)
Response Example
Response Example
Why pending? The payment is not approved yet. Final state is delivered via webhook after the customer completes at their bank.
Step 2: Redirect the Customer
Send the customer toactions.redirect_url.
- Web: Perform a 302 redirect or render a “Continue to your bank” button linking to
redirect_url. - Mobile: Open in external browser or in-app webview. Handle the
return_urlto resume your flow.
Step 3: Customer Approves at Bank
The customer authenticates with their bank and approves the payment. The bank/switch posts the result back to Monxa.- If successful → funds are captured and status becomes
succeeded. - If rejected/canceled → status becomes
failed. - If not completed in time → status becomes
expired.
Step 4: Handle Webhooks & Update Payment Status
Sample Webhook (charge.succeeded)
Sample Webhook (charge.succeeded)
Sample Webhook (charge.failed)
Sample Webhook (charge.failed)
Implementation Tips
- UI: Always show a “Continue to your bank” CTA and a fallback “Try another method.”
- Timeouts: Respect
actions.expires_at; show session countdowns to reduce abandonment. - Mobile deep-linking: Some providers return app deep links; handle gracefully with browser fallback.
- Reconciliation: Store
charge.id,reference_id, bankbank_code(if present), and webhook timestamps.