> ## Documentation Index
> Fetch the complete documentation index at: https://docs.standalonetech.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Wallet Withdrawal

> Let customers cash out their TeraWallet balance to PayPal, Stripe, Razorpay, Paystack, Cashfree or bank transfer, with admin approval and per-gateway fees.

The Withdrawal module turns store credit into real-world payouts. Customers request a withdrawal
from their account, and you approve or reject it — manually or automatically — paid out through one
of six gateways.

## Supported payout gateways

| Gateway | Notes |
| - | - |
| **PayPal** | Payouts API. Loads for any store currency. See the [PayPal setup guide](/terawallet-pro/paypal-withdrawal). |
| **Stripe** | Stripe Transfers. Loads for any currency. Supports asynchronous webhook updates. See the [Stripe setup guide](/terawallet-pro/stripe-withdrawal). |
| **BACS** (Bank Transfer) | Manual bank transfer; you mark requests paid after sending. Loads for any currency. See the [BACS setup guide](/terawallet-pro/bacs-withdrawal). |
| **Razorpay** (RazorpayX) | `INR` only. See the [Razorpay setup guide](/terawallet-pro/razorpay-withdrawal). |
| **Cashfree** | Payouts v2 API. `INR` only. See the [Cashfree setup guide](/terawallet-pro/cashfree-withdrawal). |
| **Paystack** | `NGN`, `GHS`, `ZAR`, `KES`, `USD`, `EUR`, `GBP`. See the [Paystack setup guide](/terawallet-pro/paystack-withdrawal). |

Currency-incompatible gateways are hidden automatically. Developers can register custom gateways via
the `woo_wallet_withdrawal_payment_gateways` filter — see [Pro Hooks](/terawallet-pro/hooks).

## Admin setup

Go to **TeraWallet → Settings → Withdrawal** and configure:

* **Enable Withdrawal** — master switch for the module.
* **Approval Mode** — approve requests manually, or auto-approve and pay out immediately.
* **Minimum / Maximum Withdrawal** — bounds for a single request.
* **Enable logging** — write per-gateway debug logs (surfaced on each withdrawal screen).
* **Per-gateway options** — enable each gateway, enter its API credentials, and set its processing
  fee (see below).

### Processing fees (per gateway)

Each gateway has its own fee, configured with **Enable Processing Fee**, **Fee Type** and **Fee
Amount**:

* **Fee Type**: `percent`, `fixed`, or `percent + fixed` (a percentage plus a flat **Fixed
  Component**).
* The fee is **deducted from the payout**, not added to the debit: the wallet is debited the
  **requested** amount, and the gateway pays out `amount − fee`.

<Note>
  Fees are configured strictly per gateway. The old global "gateway charge" options were removed in
  Pro 1.0.4 in favor of this per-gateway model.
</Note>

## Customer experience

1. The customer opens **My Account → Wallet** and goes to the **Withdrawal** tab.
2. First time only: they save a **Payment Settings** profile (e.g. PayPal email, bank details)
   for their chosen gateway.
3. They enter an amount (within your min/max and their available balance) and submit the request.
4. They receive a **request submitted** email, and **approval** or **rejection** emails as the
   request progresses.

The wallet is debited the requested amount when the request is submitted. A request then moves through
**pending → approved (paid)** or **rejected**. On approval the payout is sent; on rejection the debit is
reversed and the balance is restored. Idempotency keys ensure re-approving a request can never pay twice.

## Managing requests

Withdrawal requests are stored as their own admin list. For each request you can:

* **Approve** or **Reject** it (rejection reverses the debit made at submission, restoring the customer's balance).
* Add **notes** — private (staff-only) or customer-visible, like WooCommerce order notes.
* Review **per-withdrawal gateway logs** when logging is enabled.

### Asynchronous payout webhooks

Stripe, PayPal, Razorpay, Cashfree and Paystack can report final payout status back via signed
webhooks under the `terawallet/v1` REST namespace (Stripe's endpoint is
`/wp-json/terawallet/v1/stripe/webhook`). Signatures are verified and replays are rejected. Set the
gateway's webhook secret in its settings to enable this.

<Tip>
  Use **BACS** for manual bank transfers where you pay out by hand and simply mark the request
  approved once the transfer is sent.
</Tip>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.