# FPX payments

Learn about FPX, a common payment method in Malaysia.

Financial Process Exchange (FPX) is a Malaysia-based payment method that allows customers to pay online using their bank credentials. PayNet operates FPX in partnership with participating Malaysian financial institutions.
Payment method family: Bank redirects
Usability: Single-use
Access type: Instant provisional access
Payment confirmation timing: Immediate
Settlement timing: Up to 5 business days (T+5)
Pricing: https://stripe.com/en-my/pricing/local-payment-methods#fpx
## Eligibility and availability 

### Account eligibility
Business location: MY
Account type: ✓ Merchant, ✓ Platform or marketplace (Connect)
Business model: ✓ B2B, ✓ B2C
To process FPX payments and receive payouts, businesses must provide their Business Registration Number (BRN).

Your account might be reviewed after activation to confirm eligibility. While FPX doesn’t enforce any additional website requirements, make sure that you provide a website that meets the [Stripe account activation requirements](https://support.stripe.com/questions/business-website-for-account-activation-faq). You can contact [Stripe support](https://support.stripe.com/) to appeal any FPX capability restrictions.

This payment method doesn’t have any MCC requirements.

Stripe accounts in the following countries can accept FPX payments that settle in a supported currency.

APAC: MY

Customers in the following countries can use FPX.

APAC: MY

### Payment support
Customer location: MY
Presentment currency: MYR
Geographic coverage: ✓ Domestic, ✗ Crossborder
Transaction limits: Minimum amount: 1.00 MYR (B2C), 2.00 MYR (B2B); Maximum amount: 30,000.00 MYR (B2C), 1,000,000.00 MYR (B2B)
## Capabilities 
Recurring payments: ✗ Not supported

Payment authorizations:
  ✗ Extended authorizations
  ✗ Flexible extended authorizations
  ✗ Incremental authorizations
  ✗ Decremental authorizations
  ✗ Re-authorizations

Payment captures:
  ✗ Manual capture
  ✗ Partial capture
  ✗ Multi-capture
  ✗ Over-capture

Refunds:
  ✓ Partial refunds
  ✓ Full refunds
  Submission window: 180 days
  Processing time: Normally up to 14 days, but can take up to 6 weeks

Disputes:
  ✗ Partial disputes
  ✗ Full disputes
### Refunds 

You can issue a full or partial refund for an FPX payment within 180 days of the original payment through the [Dashboard](https://dashboard.stripe.com/payments) or [Refunds API](https://docs.stripe.com/api/refunds/create.md). FPX refunds are asynchronous and normally take up to 14 days to complete, but can take up to 6 weeks. You can’t cancel an FPX refund after submitting it.

#### Refund process 

FPX refunds are always processed as a separate credit to the customer’s bank account. Unlike card payments, they’re never issued as a reversal. The refund won’t be explicitly labeled as a refund on the customer’s bank statement. Instead, it appears as a credit referencing the original payment’s statement descriptor. We recommend notifying your customer when you issue a refund so they can identify the incoming credit.

#### Tracking refunds 

To check a refund’s status, open the payment in the [Dashboard](https://dashboard.stripe.com/payments) and click **View details** on the refund entry. You can also [retrieve the Refund object](https://docs.stripe.com/api/refunds/retrieve.md) and check its `status` field.

Stripe notifies you of the final status through a `refund.updated` or `refund.failed` *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) event. [Verify webhook signatures](https://docs.stripe.com/webhooks.md#verify-events) to confirm that events came from Stripe. You can also use Stripe’s [public IP addresses](https://docs.stripe.com/ips.md) for network allowlisting. When a refund succeeds, the [Refund object](https://docs.stripe.com/api/refunds/object.md) status changes to `succeeded`. If the refund fails, the status changes to `failed` and Stripe returns the amount to your Stripe balance. You must refund the customer using another method.

### Disputes 

FPX requires customers to authenticate payments directly with their bank, which reduces the risk of fraud and unrecognized transactions. As a result, FPX doesn’t support the standard dispute process—customers can’t file a chargeback through their bank, and funds are never withdrawn from your Stripe balance because of a dispute.

If a customer contacts their bank about a payment made with FPX, the bank directs them back to you. You can then issue a full or partial refund.

## Stripe product support 
Checkout UIs:
  ✓ Full page (Recommended)
  ✓ Payment Links
  ✓ Embedded form
  ✓ Payment Element
  ✗ Express Checkout Element
  ✗ Payment Method Messaging Element
  ✓ In-app payments

Products:
  ✗ Managed Payments
  ✓ Billing
  ✓ Invoicing
  ✗ Customer Portal
  ✓ Radar
  ✗ Terminal
  ✓ Connect

APIs:
  ✓ Checkout Sessions (Recommended)
  ✓ Payment Intents
  ✗ Payment Intents with setup_future_usage
  ✗ Setup Intents
  ✗ Off-session payments

1. Only supports send_invoice collection method.
### Mobile Payment Sheet 

FPX supports iOS and Android Payment Sheet for B2C transactions only.

### Sample integration 

View the FPX [sample on GitHub](https://github.com/stripe-samples/accept-a-payment).

## Customer experience 

#### 1. Select FPX

The customer selects FPX and chooses their bank on the merchant's payment page.

#### 2. Go to online banking

The customer is redirected in their browser to their bank's authorization surface. On mobile, FPX might redirect the customer to their banking app.

#### 3. Authorize the payment

The customer signs in and completes their bank's authorization process, which varies by bank.

#### 4. Return to the merchant

After authorization, the customer automatically returns to the merchant's page.

#### 5. Complete the payment

A B2C payment immediately displays as successful. A B2B payment initially displays as pending while confirmation is processed asynchronously, then displays as successful after confirmation.

### Statement descriptors 

When a customer pays with FPX, their bank statement displays the FPX seller ID, seller description (the business name), and seller order number.

Set `statement_descriptor` to control the seller order number for an individual payment. If you don’t provide a payment-level descriptor, Stripe uses the account-level statement descriptor. The `statement_descriptor_suffix` parameter applies only to card payments.

For Connect destination charges without `on_behalf_of`, Stripe uses the platform’s statement descriptor. For direct charges and charges that use `on_behalf_of`, Stripe uses the connected account’s statement descriptor. Learn more about [statement descriptors with Connect](https://docs.stripe.com/connect/statement-descriptors.md).

To reconcile an FPX payment with PayNet records, retrieve the PaymentIntent with `latest_charge` expanded and read `latest_charge.payment_method_details.fpx.transaction_id`.

## Enable FPX 

If you use Stripe front-end products, enable FPX in your [payment method settings](https://dashboard.stripe.com/settings/payment_methods). Stripe automatically determines which payment methods are most relevant to each customer.

If your integration lists payment methods manually, learn how to [configure FPX as a payment method](https://docs.stripe.com/payments/fpx/accept-a-payment.md).
