Manage Withdrawals
Access prerequisites
- Permission (module):
viewWithdrawals(to view the listing). The approve/reject actions also require theapproveWithdrawalandcancelWithdrawalmodules. - License/Feature:
WITHDRAWAL_HANDLING. The Digital Bank tab (internal fiat withdrawal) only appears when theDIGITAL_BANKINGfeature is also enabled. - Menu container: GENERAL → Operations group
What it is / when to use
Central screen for approving withdrawals requested by users. Requests are separated by destination type in tabs: Fiduciary (FIAT — external bank withdrawal), Digital Bank (INTERNAL_FIAT — internal transfer between digital accounts) and Bitcoin/ETH (on-chain crypto). The operator reviews the request data (destination account, PIX key, wallet address and token-specific custom fields), approves — which triggers the actual outflow of funds — or rejects, returning the reserved amount.
Prerequisites
- Permission:
viewWithdrawalsto view;approveWithdrawal/cancelWithdrawalto act (dual permission — CPM enum + dynamic module in DB). - License/Feature:
WITHDRAWAL_HANDLINGenabled;DIGITAL_BANKINGfor the Digital Bank tab. - Dependencies on other screens: the target user must be
APPROVED(KYC) and have a reserved balance. Withdrawals from wallets in fundraising state (IN_CAPTATION) are blocked by the reservation itself. Actions can only be taken on requests that are Pending.
Step by step
- Go to the Operations → Manage withdrawals menu.
- Choose the destination tab: Fiduciary, Digital Bank or Bitcoin/ETH (the selected tab is stored in the session).
- Filter by status (All, Approved, Cancelled, Pending) and search by name.
- Click the details (info) icon to open the modal with all request data, including token-specific custom fields and masked sensitive values.
- Approve to release the funds or reject to return the amount to the wallet. Confirm in the bottom-sheet.
Filters and columns
| Filter/Column | What it shows | Data source |
|---|---|---|
| Tab (type) | FIAT / INTERNAL_FIAT / BTC-ETH | type of the request; tab persisted in MANAGE_WITHDRAWAL_TABLETYPE |
| Search | Local filter by requester name | name |
| Status | Pending / Approved / Cancelled / All | status |
| Date | Date of the request | when (ordered DESC) |
| ID / Identifier | Request ID and CPF/CNPJ/passport | id / identifier (resolved by userId) |
| Amount | Requested amount | amount (BigNumber) |
| Status | Request state | status |
Details modal
Shows: name, amount + unit, bank, branch, account, PIX key, identifier, status, date and the list of custom fields defined by the token. Fields marked as secure appear masked (••••••); booleans become Yes/No; dates are formatted. These fields come from the token's withdrawal_custom_fields schema and are revalidated on the backend (type, regex, ranges, select options).
Actions and modals
- Approve: confirmation bottom-sheet →
updateWithdrawal(id, 'APPROVED'). The backend (FMS – Withdrawal) executes the actual outflow of funds (bank transfer, internal transfer or on-chain broadcast depending on the type). The page reloads. - Reject: bottom-sheet →
updateWithdrawal(id, 'CANCELLED'). Returns the reserved amount to the user's wallet. - Open user: navigates to the user's details by email.
- Help guide (auto_stories): opens the screen troubleshooting modal.
Business rules / cautions
Attention
- Approve/reject is only available for requests that are Pending.
- The Digital Bank tab depends on the
DIGITAL_BANKINGfeature; without it, only Fiduciary and Bitcoin/ETH appear. - Check the custom fields (e.g.: external wallet address, PIX key) before approving — they carry the actual destination of the funds.
Irreversible
- Approving triggers the actual outflow of funds (bank transfer / on-chain). Once confirmed, there is no rollback — an on-chain send or a bank transfer cannot be undone by the platform.
- Financial values: treated as BigNumber — no rounding; verify the decimal places of the token/currency.
- Idempotency: the withdrawal settlement in FinLib is idempotent by
externalId. If the backend returnsE00021"already processed" (e.g.: retry after timeout/crash), the withdrawal has already been processed — treat it as success, do not resend. - Status APPROVED: the target user must be
APPROVED.
Examples
Scenario 1 — Fiduciary withdrawal (FIAT) via PIX to an external bank
- Fiduciary tab, status Pending.
- Open the details and verify name, amount, bank, branch, account and PIX key.
- Compare the account holder's name with the user's (prevents withdrawal to third parties).
- Approve → FMS triggers the external bank transfer. Result: status becomes
APPROVED, the amount leaves the house and the reservation is consumed.
Scenario 2 — Internal withdrawal between digital accounts (Digital Bank)
- Digital Bank tab (requires
DIGITAL_BANKING). - The destination is another digital account in the ecosystem — there is no external bank transfer.
- Approve → FMS performs the internal
INTERNAL_FIATtransfer. Immediate settlement, no banking window.
Scenario 3 — Crypto withdrawal (BTC/ETH) with address in a custom field
- Bitcoin/ETH tab.
- In the details, the destination wallet address appears in the custom fields defined by the token (validated by regex in the token schema).
- Check the address carefully — on-chain sends are final.
- Approve → on-chain broadcast. If there is a retry and the backend returns
E00021, the transaction has already been sent; do not resend.