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

# WithdrawElement

> Collects a withdrawal amount and saved payout method, groups standard and instant delivery choices with live fees and arrival estimates, collects a new payout method when needed, and presents a confirmation screen before emitting the final withdrawal request.

<Info>**Upcoming** — generated from the latest merged element source; documents unreleased development. Use the channel picker at the top of the sidebar for the docs of a published release.</Info>

*In development — not yet part of a stable release.*

Belongs to the [`Wallet`](/elements/upcoming/wallet/overview) group. Render `<WithdrawElement />` inside it (React), or call `wallet.create('withdraw', { … })` on the handle (vanilla) — consumer props and `on<Event>` callbacks both go in the create options / JSX props.

<Note>This element can be mounted **inline** (`create`) or opened as a **modal** overlay (`createOverlay`).</Note>

## Preview

A live, interactive demo of this element with sample data:

<div data-whop-demo-shell style={{ position: "relative", minHeight: "320px", transition: "min-height 200ms ease" }}>
  <div data-whop-demo-skeleton style={{ position: "absolute", inset: "0", borderRadius: "12px", background: "rgba(140, 140, 140, 0.12)", pointerEvents: "none", transition: "opacity 200ms ease" }} />

  <div data-whop-demo-native="element:wallet/withdraw" data-whop-elements-version="" style={{ position: "relative" }} />
</div>

## Usage

<div data-whop-usage="wallet/withdraw">
  <CodeGroup>
    ```tsx React theme={null}
    import { WhopElements, Wallet, WithdrawElement } from "@whop/elements-react";
    import { loadWhop } from "@whop/elements";

    function Example() {
      return (
        <WhopElements elements={loadWhop()}>
          <Wallet /* options */>
            <WithdrawElement onAmountChanged={(payload) => console.log("amountChanged", payload)} onCountryChanged={(payload) => console.log("countryChanged", payload)} onSupportedMethodChanged={(payload) => console.log("supportedMethodChanged", payload)} onAddMethodRequested={(payload) => console.log("addMethodRequested", payload)} onMethodVerificationCompleted={(payload) => console.log("methodVerificationCompleted", payload)} onWithdrawalRequested={(payload) => console.log("withdrawalRequested", payload)} />
          </Wallet>
        </WhopElements>
      );
    }
    ```

    ```html Vanilla theme={null}
    <script src="https://js.whop.cloud/elements/amber/elements.js" data-whop-elements></script>
    <script type="module">
      const wallet = window.WhopElements().wallet.create({ /* options */ });
      wallet.create('withdraw', {
        onAmountChanged: (payload) => console.log("amountChanged", payload),
        onCountryChanged: (payload) => console.log("countryChanged", payload),
        onSupportedMethodChanged: (payload) => console.log("supportedMethodChanged", payload),
        onAddMethodRequested: (payload) => console.log("addMethodRequested", payload),
        onMethodVerificationCompleted: (payload) => console.log("methodVerificationCompleted", payload),
        onWithdrawalRequested: (payload) => console.log("withdrawalRequested", payload)
      }).mount('#wallet-withdraw');
    </script>
    ```
  </CodeGroup>
</div>

## Props

<ResponseField name="methods" type="WithdrawalMethod[]">
  Saved payout methods with quotes for the current amount. Defaults to `[]`.
</ResponseField>

<ResponseField name="availableBalance" type="number">
  Settled balance available to standard payout methods. Defaults to `0`.
</ResponseField>

<ResponseField name="pendingBalance" type="number">
  Pending balance that may be available to instant payout methods. Defaults to `0`.
</ResponseField>

<ResponseField name="payoutCountry" type="string">
  The payout account's ISO 3166-1 alpha-2 country. Defaults to `"US"`.
</ResponseField>

<ResponseField name="supportedMethods" type="WithdrawalSupportedMethod[]">
  Payout methods available to add in the selected country, including required fields. Defaults to `[]`.
</ResponseField>

<ResponseField name="supportedMethodsLoading" type="boolean">
  Whether supported payout methods are loading for the selected country. Defaults to `false`.
</ResponseField>

<ResponseField name="limits" type="WithdrawalLimits">
  Live standard and instant withdrawal limits. Defaults to `{"standard":{"maxAmount":0},"instant":{"maxAmount":0}}`.
</ResponseField>

<ResponseField name="loading" type="boolean">
  Whether payout methods and limits are loading. Defaults to `false`.
</ResponseField>

<ResponseField name="quoteLoading" type="boolean">
  Whether the current amount is being repriced. Defaults to `false`.
</ResponseField>

<ResponseField name="savingMethod" type="boolean">
  Whether a new payout method is being saved. Defaults to `false`.
</ResponseField>

<ResponseField name="submitting" type="boolean">
  Whether the confirmed withdrawal is being created. Defaults to `false`.
</ResponseField>

<ResponseField name="error" type="string">
  A host-side error to show inside the current screen. Defaults to `""`.
</ResponseField>

<ResponseField name="createdMethodId" type="string">
  The most recently created method, selected when it appears in methods. Defaults to `""`.
</ResponseField>

## Events

Pass a callback in the create options (or React prop) to receive these.

### `onAmountChanged`

The amount changed and should be repriced.

**Signature:** `((payload: { amount: number; }) => void)`

### `onCountryChanged`

The add-method country changed and supported methods should be refreshed.

**Signature:** `((payload: { country: string; }) => void)`

### `onSupportedMethodChanged`

A supported payout method was selected and its exact required fields should be loaded.

**Signature:** `((payload: { country: string; supportedPayoutMethodId: string; destinationCurrency: string; }) => void)`

### `onAddMethodRequested`

The payer submitted the dynamic add-payout-method form.

**Signature:** `((payload: WithdrawalCreateMethodInput) => void)`

### `onMethodVerificationCompleted`

The newly added payout method finished its verification step.

**Signature:** `((payload: Record<string, never>) => void)`

### `onWithdrawalRequested`

The payer confirmed the final withdrawal details. Create the withdrawal on receipt.

**Signature:** `((payload: WithdrawalRequest) => void)`

### `onLoaderStart`

Fired the moment the element's own loading skeleton has painted inside its frame — the earliest point a consumer-managed loading state can hand off without ever exposing a blank. Always precedes `onReady`; most consumers only need `onReady`.

**Signature:** `(() => void)`

### `onReady`

Fired once the element has booted and painted its first complete frame.

**Signature:** `(() => void)`

### `onError`

Fired when the element fails to load or crashes; the element shows its own error fallback. `message` is human-readable; framework refusals also carry `code` (e.g. `HOST_SOURCE_FAILED`, with `sourceKey` naming the failed hostState key) so hosts can switch on codes, never message text.

**Signature:** `((e: { message: string; code?: string | undefined; sourceKey?: string | undefined; }) => void)`

## Methods

Call these on the element handle — the return of `create` (vanilla) or the component `ref` (React).

### `mount`

Place the element on the page: appends its container to `target` (a CSS selector or an element) and starts loading. Nothing renders until this is called. React consumers never call it — the component mounts itself.

**Signature:** `(target: string | HTMLElement) => void`

### `destroy`

Remove the element from the page and release its frame and subscriptions. Safe to call more than once. React consumers never call it — unmounting the component does it.

**Signature:** `() => void`

### `update`

Change this element's consumer props after mount — it re-renders with the merged props. React consumers never call it — updating the JSX props does the same.

**Signature:** `(options: Partial<WithdrawElementProps>) => void`

## Styling

This element exposes no targetable class names. Use `appearance` (theme, accent color, variables) to restyle it.
