Operator guideEN

Transactions / Withdrawals

Action-heavy payout queue with filters, status controls, postponed payout handling, provider payload modals, timing columns, and CSV export.

How to use this guide

Start with the main guide

Follow the explanation and examples first. Extra definitions and formulas are available below when you need them.

What This Surface Shows

Transactions / Withdrawals is the operator queue for customer withdrawal requests. Use it to review payout requests, filter the queue, open provider request or response details, and act on postponed withdrawals when your permissions allow it.

This page is action-heavy. It is not only a history table: some rows can be moved back to Pending, approved, or rejected from this queue.

How To Read It

The grid combines player identity, provider, transaction id, amount, status, payout method, wallet balances, update time, review timing, PSP processing timing, and user tags.

The most important workflow columns are:

  • Status shows the current withdrawal request status.
  • Action can show To Pending for rows currently in APPROVE_REQUESTED.
  • Approve and Reject icons appear only for postponed rows and only when the operator has the matching permission.
  • Provider Req opens stored postponed provider/request payload data when it exists.
  • Provider Resp opens available provider response, status message, rejection reason, and provider context.

User tags appear twice in the wide grid. Both tag blocks behave the same way: clicking a tag copies it into Search by tag and reloads the queue.

Filters That Change The Queue

The filter form affects the table and CSV export:

  • Search player searches by player identity text through the backend email/name search helper.
  • Search provider is a case-insensitive contains match against payment provider.
  • Status narrows by withdrawal status; All is sent as no status filter.
  • Search by tag is a case-insensitive contains match over user tags.
  • Date start and Date end bound the withdrawal request creation-time window.

Actions

To Pending

To Pending appears only for rows whose status is APPROVE_REQUESTED. After confirmation, CRM asks the backend to change that withdrawal request to PENDING.

The backend only accepts the APPROVE_REQUESTED -> PENDING transition for this action. On success it sets the request as postponed and writes the submitted reason, or the default reason, into the status message.

Current backend behavior does not clear postponedResumeParams during this transition. If older notes say the stored postponed request payload is cleared, treat those notes as stale.

Approve Postponed Withdrawal

The approve icon appears only on postponed rows when the operator has Withdrawals / Approve.

The page first checks the current merchant balance by dividing the row amount by the current exchange rate for the row currency. That rate comes from the currencies list loaded for the page; it is not the rate stored when the withdrawal was created. A missing or zero current rate, a non-positive amount, or an unavailable merchant balance leaves the row on the warning icon and does not fire the approval call.

The server performs the final merchant-balance check again, forwards an allowed approval to the configured payout endpoint, and records the admin actor and action time on success. It also converts the stored withdrawal amount, but selects the current exchange rate by the player's current account currency rather than by the withdrawal row currency used on the page. If those currencies differ, a rate changes between the separate reads, or merchant balance changes before the server check, the preview and final result can disagree; the server result is final. If provider approval fails, the server stores the provider failure reason in the withdrawal status message when available.

The current server flow starts a best-effort Withdrawal Approved activity write before it tests the final balance and does not wait for that write to finish. An approval attempt rejected by the server balance gate can therefore still leave an approval activity even though no provider approval was sent. Use the withdrawal status and provider outcome, not that activity alone, to decide whether the payout was approved.

Reject Postponed Withdrawal

The reject icon appears only on postponed rows when the operator has Withdrawals / Reject.

The rejection dialog starts with Withdrawal verification failed and provides these fixed choices:

  • Withdrawal verification failed
  • Payment details are invalid
  • KYC verification required
  • Wagering requirements not met
  • Add Custom Reason

Add Custom Reason reveals a required multiline field. Leading and trailing spaces are removed, and Reject Withdrawal stays disabled while the trimmed custom reason is empty. The dialog tells the operator that the player will see the submitted reason in withdrawal history.

Canceling or closing the dialog does not reset its local reason fields. If the same row component remains mounted, reopening it can show the previously selected option and custom text. On success, the rejection is forwarded to the configured payout endpoint and the admin actor, action time, and exact submitted reason are recorded.

Timing Columns

Risk Review Time (Created -> Decision) is the duration from withdrawal request creation to the latest approval or rejection decision activity when that evidence exists.

PSP Processing Time (Sent -> Completed) is the duration from payout-send evidence to a successful terminal withdrawal update when the required evidence exists.

Blank timing cells mean the backend did not find enough evidence for that duration. They do not by themselves mean the withdrawal was never reviewed or processed.

Export Behavior

Download CSV exports the current withdrawal query when the visible list has at least one row. It uses the active filters and removes normal visible-page pagination for the export request.

The CSV can include source response fields that are not rendered as visible table columns.

Common Questions

Why do some rows have action icons and others do not?

The row must be in the required state and the operator must have the required permission. Postponed approval and rejection controls are intentionally not shown for normal non-postponed rows.

Does opening Provider Req or Provider Resp change anything?

No. Both are read-only inspection actions. They open payload details that already exist on the row.

Why does clicking a tag immediately change the queue?

Tags are treated as an investigation shortcut. Clicking a tag writes that value into Search by tag and submits the filter form.

Known Caveats

  • To Pending sets the request as postponed but does not currently clear stored postponed request payload data.
  • The frontend merchant-balance check for approval is only a usability gate; the backend check is authoritative.
  • The rejection dialog initially selects Withdrawal verification failed; use the more specific fixed option or a clear custom reason when that default is not accurate.
  • Closing the rejection dialog does not clear the selected option or custom text while the row remains mounted.
  • Timing columns depend on backend evidence from activities/history. Missing evidence renders a blank duration.
  • The CSV export scope follows the query filters but can include fields that the visible table does not show.
More details

Definitions and formulas

Open only the section you need. The relevant section opens automatically when you request help for a specific item on screen.

Calculations11 topicsOpen details

Status = All

Shows withdrawals without applying a specific status filter.

Formula
Frontend stores the All option as `-`; the list hook omits the status query parameter when that value is selected, so the backend receives no status condition.

Search player

Narrows withdrawal rows by player identity text.

Formula
Backend applies the shared email/name search helper to the submitted search text.

Search provider

Narrows withdrawal rows by payment provider text.

Formula
Case-insensitive contains match against withdrawal payment provider.

Search by tag

Narrows withdrawal rows by user tags.

Formula
Lowercase contains match over text values stored in the user's tags array. Clicking a visible tag chip writes the clicked tag into this filter and submits the queue.

Date start / Date end

Limits the withdrawal queue by request creation time.

Formula
Frontend sends `startDate` and `endDate`; backend applies the date window to withdrawal request creation time in the read query.

CSV export scope

Exported rows match the current Withdrawals query but are not limited to the visible page.

Formula
The export request reuses the active filters with `csvDownload=true`. Backend switches to the CSV branch and removes normal pagination for the exported dataset.
Output
Filename: Withdrawals.csv | Visible Button Rule: Frontend disables export when the visible list is empty.

Risk Review Time (Created -> Decision)

Time from withdrawal request creation to the latest approval or rejection decision activity.

Formula
If a latest approval/rejection decision activity exists for the withdrawal, backend returns `decision_activity.created_at - withdraw_request.created_at`, floored at zero seconds and formatted as `H:MM:SS`; otherwise the cell is blank.

PSP Processing Time (Sent -> Completed)

Time from payout-send evidence to successful terminal completion evidence.

Formula
If the withdrawal is in a successful terminal status and backend finds payout-send evidence from manual approval activity or automatic-withdrawal history, backend returns `withdraw_request.updated_at - send_evidence.created_at`, floored at zero seconds and formatted as `H:MM:SS`; otherwise the cell is blank.

To Pending

Moves an Approve Requested withdrawal request back into Pending review.

Formula
Frontend sends target status `PENDING` for an `APPROVE_REQUESTED` row. Backend maps those labels to numeric statuses and accepts only `APPROVE_REQUESTED -> PENDING` for this flow.
Side Effects
Sets `postponed=true`., Writes the submitted reason, or default text, into the status message., Does not currently clear `postponedResumeParams`.

Approve postponed withdrawal

Resumes a postponed payout when permission, row state, and balance checks allow it.

Formula
Frontend computes `row amount / current currencies-list exchange rate`, subtracts that value from the current merchant-balance response, and exposes Approve only when the result is at least zero. Backend recomputes merchant balance, loads the withdrawal and current user, converts the stored withdrawal amount as `withdrawal amount / current exchange rate for the user's current currency`, and subtracts that converted value before forwarding payout approval to the configured user-backend approval endpoint.
Currency Basis
Source Amount: Withdrawal row `amount` in the row `currencyCode`. | Frontend Reporting Basis: The frontend names the converted value EUR and uses the current merchant-balance response as the comparison basis. | Frontend Rate Source: Current `exchangeRate` for the row currency from the currencies list loaded by the page. | Frontend Rate Timing: Current page-load/request value; no historical withdrawal-time rate is read for this preview. | Frontend Rounding Boundary: Decimal division and subtraction have no explicit rounding before comparison; merchant balance is returned rounded to 2 decimals. | Missing Rate Behavior: A missing or zero rate, non-positive amount, or unavailable/falsy merchant balance keeps the sentinel result below zero and prevents the approval call. | Backend Original Currency Source: Current `users.currency_code` for the withdrawal owner; this is not read from the withdrawal row `currencyCode` used by the page preview. | Backend Rate Source: Current `currencies.exchange_rate` row joined by the user's current currency code. | Backend Rate Timing: Current backend-query value; no historical withdrawal-time or transaction-stored conversion rate is used. | Backend Basis: Current merchant-balance snapshot rounded to 2 decimals minus `stored withdrawal amount / current user-currency exchange rate`. | Backend Rounding Boundary: The SQL division and Decimal subtraction have no explicit rounding before the greater-than-or-equal-to-zero comparison. | Backend Missing Rate Behavior: The backend query has no explicit missing/zero-rate fallback; a missing joined currency row or invalid division prevents a successful approval check rather than silently using rate 1. | Comparison Caveat: The page keys the rate by withdrawal row currency, while the backend keys it by the user's current currency. Different currencies, rate snapshots, or merchant-balance snapshots can make the two gates disagree. | Refund Reversal Handling: No separate refund, reversal, or FX remeasurement branch exists in the approval gate; the merchant-balance snapshot reflects its own current wallet and banking-status query.
Side Effects
Starts a non-awaited, best-effort withdrawal-approved activity write before the backend balance branch, so even a below-zero balance result can leave that activity., Persists provider failure reason into withdrawal status message when the approval call fails with a reason., Records admin actor and actioned timestamp on successful backend/provider approval.

Reject postponed withdrawal

Rejects a postponed payout only after a non-empty reason is supplied.

Formula
Frontend requires a predefined reason or custom reason. Backend requires withdrawal id, user id, and non-empty rejection reason before forwarding payout rejection to the configured user-backend rejection endpoint.
Side Effects
Records admin actor and actioned timestamp., Stores the rejection reason on successful backend/provider rejection.
Notes3 topicsOpen details

Provider Req and Provider Resp are read-only modal calculations in the operator workflow; they assemble available row payloads and do not mutate the payout.

Approval and rejection controls are row-state and permission gated.

Backend timing values depend on available activity/history evidence; blank timing cells are expected when evidence is absent.

Columns20 topicsOpen details

User Tags

User tags joined from the player record and rendered at the beginning of the row for quick risk/KYC scanning.

Caveat
Clicking a tag writes that tag into Search by tag and submits the list.

Id

Withdrawal request identifier.

Email

Player email attached to the withdrawal request; clicking it opens the player profile.

Name

Player name stored on the withdrawal request.

Provider

Payment provider selected for the withdrawal.

Transaction

Linked payment/transaction identifier when available.

Amount

Withdrawal amount in the row currency.

Data Type
amount

Status

Human-readable withdrawal status.

Action

Shows To Pending only for `APPROVE_REQUESTED` rows.

Method

Resolved payment method for the withdrawal row.

Approve icon

Permission-gated postponed payout approval control.

Caveat
When merchant balance would go below zero, the control shows an insufficient-balance warning icon instead of firing approval.

Balance Before

Wallet balance before the linked withdrawal transaction.

Data Type
amount

Balance After

Wallet balance after the linked withdrawal transaction.

Data Type
amount

Reject icon

Permission-gated postponed payout rejection control.

Caveat
Rejection requires a non-empty reason.

Updated

Last update timestamp rendered by the frontend date-time formatter.

Risk Review Time (Created -> Decision)

Duration from withdrawal request creation to the latest approval/rejection decision activity when evidence exists.

Caveat
Blank means the backend did not find the required decision activity evidence.

PSP Processing Time (Sent -> Completed)

Duration from payout send trigger evidence to successful terminal withdrawal update when evidence exists.

Caveat
Blank means the backend did not find the required PSP-send and terminal completion evidence.

User Tags

The same user-tag chip block appears again near the right side of the grid for wide-table review.

Caveat
It has the same click-to-filter behavior as the first User Tags column.

Provider Req

Opens the postponed request payload modal when provider request/postponement data exists.

Provider Resp

Opens provider response details assembled from available response, status message, rejection reason, and provider fields.

Filters6 topicsOpen details

Search player

Searches withdrawal rows by player identity text.

Type
text
Match Behavior
Backend applies the shared email/name search helper.
Affects
table rows, CSV export

Search provider

Narrows the queue by payment provider text.

Type
text
Match Behavior
Case-insensitive contains match against payment provider.
Affects
table rows, CSV export

Status

Narrows the queue by withdrawal request status.

Type
select
Options
All, Pending, Approved, Canceled, Rejected, Approve Requested
Caveat
Frontend value `All` is sent as no status filter.
Affects
table rows, CSV export

Search by tag

Narrows the queue by user tag text.

Type
text
Match Behavior
Case-insensitive contains match across user tags.
Affects
table rows, CSV export

Date start

Start of the withdrawal request creation-time window.

Type
date
Affects
table rows, CSV export

Date end

End of the withdrawal request creation-time window.

Type
date
Affects
table rows, CSV export
More help

Related pages

Transactions / Banking

Filterable banking transaction dashboard with weekly summary cards, backend stats charts, CSV export, and a detailed ledger-style table.

Transactions / Casino

Game transaction dashboard with real-time list mode, monthly analytics mode, filterable table, and a dedicated transaction detail route.

Transactions / Casino Transaction Detail

Read-only detail page for a single casino transaction identified by `casinoTransactionId`.

Transactions / Failed Deposit

Triage grid for failed deposit rows, provider failure reasons, normalized error groups, raw detail inspection, and CSV export.

Transactions / Failed Deposit Error Groups

Configuration surface for creating, editing, importing, exporting, and assigning failed-deposit error groups and their reasons.

Transactions / KYC

Action-heavy KYC document queue exposed under the transactions area for document review, verification, re-request, download, and third-party checks.