Skip to main content
The Payment Widget’s withdrawal flow handles the entire bank withdrawal in one session: the user picks the origin Uphold account, selects or adds a bank account, enters the amount, reviews a live quote with the expected processing time, confirms the transaction and sees its status — all without your backend creating a quote or the transaction. The Widget supports FPS (GBP) for UK users, and ACH and FedNow / RTP (USD) for US users. When a US bank account supports both, the user picks the network — standard ACH or instant FedNow / RTP.
If you need to build the amount entry and review screens yourself, see the select flow guides for FPS and ACH and FedNow / RTP instead. To compare all flows, see Flows.

Prerequisites

  • The user has completed onboarding and has the required capabilities enabled.
  • The Payment Widget is set up in your frontend. See Installation and setup.
  • @uphold/enterprise-payment-widget-web-sdk is on version 0.19.0 or later.
  • For FPS, the user has a linked bank account. FPS bank accounts are linked automatically after the user’s first FPS deposit. For ACH, the user can add one in the Widget.

Walkthrough


Complete the withdrawal in the widget

The widget session takes the user from account and bank account selection through the amount, quote and confirmation.

Create a widget session

Call Create widget session to start the withdrawal flow. No data is required — the widget gathers everything from the user. Use options to customize the Widget’s theme and layout, as well as the flow itself. See the example here and the SDK reference for all available options. By default, the end-to-end flows offer both card and bank. To offer bank only, set paymentMethods to bank:
Withdrawals can be sourced from any account. If the origin account is not in the bank’s currency, the balance is converted at the time of the transaction using Uphold’s prevailing rate. The response contains a session object with a url field that loads the widget. Return response.session to your frontend as is.

Set up the widget

Both examples above are for web applications — either creating the iframe yourself or letting the SDK do it. For native apps using a WebView, see Native apps with the Web SDK for the SDK’s native-bundling pattern, or Setup without the SDK for the no-SDK approach that loads the session url directly as the WebView’s top-level page.

Handle the complete event

The complete event fires when the user closes the terminal status screen. Its value is the authorization result — the transaction plus what triggered the completion, the same as for card withdrawals.
ACH withdrawals can take up to 2 business days to settle, so complete will often have trigger.reason set to max-retries-reached with the transaction still processing. Rely on webhooks for the final status.
complete is only emitted once the user closes the status screen. A user who abandons the widget there leaves a real transaction behind that your app never hears about. Treat webhooks as the source of truth and complete as a UX signal.

Handle cancellations

The cancel event fires when the user closes the widget before confirming. No transaction exists at that point.

Handle errors

The Payment Widget handles most errors internally. For unrecoverable errors, the widget fires an error event. It is the host application’s responsibility to handle these events, present an error message to the user, and unmount the widget.
The widget recovers from quote and transaction failures internally by returning the user to the review screen with an appropriate action — change the amount, change the payment method, or try again. Insufficient balance is handled this way rather than as an error event.

Monitor for settlement

Bank withdrawal transactions remain in processing while the payout settles. Monitor until the transaction reaches a terminal state.

Sample transaction

In a successful FPS withdrawal, the origin is the user’s account and the destination is the external-account representing the user’s bank. The transaction status is initially processing and updates to completed once the transfer settles.

Notify the user

Display an in-app confirmation when the transaction is completed, and send an email if applicable.
You now support end-to-end bank withdrawals via the Payment Widget.