# GoPay payments

Learn about GoPay, a digital wallet popular in Indonesia.

GoPay is a digital wallet popular in Indonesia. Customers use the GoPay or the Gojek app to authorize GoPay payments. On mobile, customers are redirected to the GoPay or the Gojek app. On desktop, customers scan a QR code with the GoPay or the Gojek app.
Payment method family: Wallets
Usability: Reusable
Access type: Approval required
Payment confirmation timing: Immediate
Settlement timing: Up to 4 business days (T+4)
## Eligibility and availability 

### Account eligibility
Business location: ID, SG, US
Account type: ✓ Merchant, ✗ Platform or marketplace (Connect)
Business model: ✓ B2B, ✓ B2C
Your account might be reviewed after activation to confirm eligibility. While GoPay 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 GoPay capability restrictions.

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

AMER: [Preview] US

APAC: [Preview] ID, [Preview] SG

Customers in the following countries can use GoPay.

APAC: [Preview] ID

### Payment support
Customer location: ID
Presentment currency: IDR
Geographic coverage: ✓ Domestic, ✓ Crossborder
Transaction limits: Minimum amount: 0.50 USD (or equivalent in IDR)

Maximum amount: 20,000,000.00 IDR
> Indonesia doesn’t use cents because of inflation. Therefore, all prices must end in .00 (that is, don’t use prices such as 10,000.95 IDR).

### Customer transaction limits 

Customers with an unverified GoPay account can pay up to 2,000,000 IDR per transaction. Customers with a verified GoPay account can pay up to 20,000,000 IDR per transaction.

## Capabilities 
Recurring payments: ✓ 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

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

You can request a refund for a one-time GoPay payment within 45 days of the original payment. For the initial payment that saves GoPay and subsequent payments made with that saved payment method, you can request a refund within 180 days. If the customer scanned the payment QR code with an app other than Gojek, the refund fails when requested more than 7 days after the original payment. GoPay supports full, partial, and multiple partial refunds, up to the original payment amount. Refunds usually complete within a few minutes, but can take up to 20 days. You can’t cancel a GoPay refund after you submit it.

#### Refund process 

Stripe submits the refund to GoPay. The refund remains pending while GoPay processes it, and Stripe updates the Refund object when GoPay reports the final result.

#### 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 

GoPay doesn’t support the standard dispute process—customers can’t file a chargeback, and funds are never withdrawn from your Stripe balance because of a dispute.

If a customer has a concern about a GoPay payment, they need to contact you directly. You can then issue a full or partial refund.

### Mandates 

GoPay recurring payments use an account link between the customer’s GoPay account and your business. The resulting multi-use mandate permits variable-amount off-session payments until you revoke it by detaching the saved PaymentMethod or the customer revokes it by unlinking your business in the GoPay or the Gojek app.

#### What customers authorize 

The customer authorizes you to save their GoPay account and initiate future off-session payments. The authorization doesn’t have an intrinsic expiration and remains active until you or the customer revokes it.

#### Collect mandates 

Stripe redirects the customer to our payment partner, where they enter the phone number associated with their GoPay account and authorize the account link in the GoPay or the Gojek app. A PaymentIntent with `setup_future_usage` uses the merchant-set purchase amount as the initial payment. A SetupIntent creates a 1 IDR payment that is refunded immediately. After the customer successfully links their account, Stripe creates an active Mandate and attaches a reusable GoPay PaymentMethod to the Customer.

#### Manage mandates 

Use the [Mandate API](https://docs.stripe.com/api/mandates/retrieve.md) to retrieve the GoPay Mandate. The saved GoPay PaymentMethod is visible on the Customer in the Dashboard. Reuse that existing PaymentMethod for future off-session payments; attempting to link the same phone number to the same business again can fail on the partner-hosted page.

#### Cancel mandates 

To revoke the authorization, [detach the saved PaymentMethod](https://docs.stripe.com/api/payment_methods/detach.md). The customer can also unlink your business in the GoPay or the Gojek app. Stripe sends a [mandate.updated](https://docs.stripe.com/api/events/types.md#event_types-mandate.updated) event when the authorization becomes inactive. Future payments using the inactive Mandate fail.

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

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 one-time payments.
## Customer experience 

#### 1. Select GoPay

The customer selects GoPay at checkout.

#### 2. Open the GoPay or the Gojek app

On mobile, the customer is redirected to the GoPay or the Gojek app. On desktop, the payment page displays a QR code that the customer scans using the GoPay or the Gojek app.

#### 3. Authorize the payment

The customer has 15 minutes to authorize the payment in the GoPay or the Gojek app.

#### 4. Complete the payment

Stripe immediately reports the final result. Mobile flows automatically return the customer to your return URL. Desktop QR payments complete while the payment page remains open.

### Save GoPay for future payments 

To save GoPay, Stripe redirects the customer to our payment partner. The customer enters their GoPay phone number, completes OTP or PIN account linking in the GoPay or the Gojek app, and authorizes the initial payment. A PaymentIntent with `setup_future_usage` uses the merchant-set purchase amount. A SetupIntent creates a 1 IDR payment that is refunded immediately. After a successful setup, Stripe creates an active GoPay Mandate and attaches a reusable PaymentMethod to the Customer.

### Statement descriptors 

GoPay payments display your Stripe account’s business name on the customer’s statement. Use a business name that customers recognize to reduce confusion and payment inquiries.

GoPay doesn’t support customized [statement descriptors](https://docs.stripe.com/get-started/account/statement-descriptors.md). Any value you provide in [statement_descriptor](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-statement_descriptor) is ignored.

## Enable GoPay 

If you use Stripe front-end products, enable GoPay 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 GoPay as a payment method](https://docs.stripe.com/payments/gopay/accept-a-payment.md).
