Withdrawal Troubleshooting
About This Page
What: Common exceptions during withdrawal — organized by "what symptom the user/ops sees", with troubleshooting paths and resolution methods Audience: Operations staff handling withdrawal issues, product managers understanding exception flows Prerequisites: Withdrawal LifecycleReading time: 4 minutes Owner: Withdrawal Operations Lead
Key Takeaway: Withdrawal exceptions are quickly located by error codes — BST callback timeout, channel cannot be auto-selected (method=null), BST authorization exception, and balance freeze failure are the four most common problem categories.
Quick Lookup by Error Code/Status Code
| Error Code/Status | Meaning | Jump To |
|---|---|---|
Callback code -5 | CMB/CMBC BST timeout | Scenario 2 § BST Callback |
Callback code -6 | CMB/CMBC BST rejection | Scenario 2 § BST Callback |
Airstar PENDING timeout | Airstar polling timeout | Scenario 2 § Airstar Polling |
Airstar FAILED | Airstar instruction failed | Scenario 2 § Airstar Polling |
Airstar REFUNDED | BST deposit refund | Scenario 8 |
method = null | System cannot auto-select channel | Scenario 1 § Confirm Stuck |
| Mandate ≠ OPEN | BST authorization exception | Scenario 7 |
| 140630xxx | Airstar error codes | Withdrawal Data Dictionary |
| Freeze type=2 (CASH_OUT) | Withdrawal freeze | Scenario 6 |
| Task status=5 | Withdrawal reversed | Scenario 5 |
Complete error codes → Unified Error Code Center
Quick Diagnosis: User Says "Money Hasn't Arrived"
When receiving user feedback "I submitted a withdrawal but money hasn't arrived in my bank card", troubleshoot in this order:
Most "money hasn't arrived" cases are due to the approval flow still being in progress — especially for non-BST channel withdrawals, which require ops to manually operate multiple steps.
Scenario One: Approval Stuck at a Step
Symptom: Withdrawal task status is "Processing" but has not advanced to the next step for a long time.
| Stuck At | Possible Cause | Resolution |
|---|---|---|
| Audit | High-risk review queued | Check risk control flag reason, click NEXT after review passes |
| Confirm | Ops has not processed in time / bank card info needs confirmation | Verify bank card status, confirm channel then click NEXT |
| Remittance | Auto-withdrawal conditions not met / ops has not manually triggered | Check 6 auto-withdrawal conditions, manually click to execute transfer |
Most common reason Confirm is stuck: method = null (system cannot auto-select channel). Ops needs to manually select an appropriate withdrawal channel (online banking / FPS / manual, etc.) based on the user's bank card, then advance to Remittance.
Scenario Two: Bank Callback Failed
Symptom: Remittance has already executed startTransfer(), but the bank callback result is not success.
CMB / CMBC BST Callback Exception
| Callback Code | Meaning | System Handling | Ops Action |
|---|---|---|---|
| -5 | Timeout | Automatically switch to backup exit_server for retry | Usually no intervention needed, wait for retry result |
| -6 | Bank rejection | Mark as failed | Contact bank to confirm rejection reason, may need to switch channel for re-withdrawal |
BST timeout (-5) is usually network jitter — the system will automatically try the backup server. If retry also fails, ops needs to manually confirm bank-side status: has the money already been sent out?
Airstar BST Polling Exception
Airstar does not use real-time callback but system polling for results, so the exception pattern differs:
| Exception | Trigger Condition | System Handling | Ops Action |
|---|---|---|---|
| Polling timeout | Still PENDING after AsbBstTransfer 10 polls | Enters SyncAsbBstWithdraw 2-hour fallback sync | Wait, monitor alerts |
| Sync timeout | Still PENDING after 2-hour sync window ends | Mark abnormal | Manually query Airstar API to confirm bank-side status |
| Instruction failed | Airstar returns FAILED | Release frozen funds | Check 140630xxx error code to identify cause |
Key difference: CMB/CMBC "-5 timeout" typically recovers in seconds (switches to backup server); Airstar polling timeout may require up to 2 hours + manual intervention.
Airstar error codes → Withdrawal Data Dictionary § Airstar Error Codes
Online Banking / FPS Callback Exception
Online banking and FPS channel async callback cycles may be longer. If there's no callback for a long time:
- Check transaction status on bank side
- Confirm whether the withdrawal instruction was successfully sent
- Contact bank to verify if necessary
Scenario Three: Auto-Withdrawal Conditions Not Met
Symptom: BST channel withdrawal, Remittance step did not auto-execute, requires manual operation.
Any one of the 6 auto-withdrawal conditions not being met causes the system to degrade to manual mode. Common situations:
| Unmet Condition | Manifestation | Resolution |
|---|---|---|
| Amount exceeds limit | Large withdrawal did not auto-execute | Ops confirms amount is reasonable then manually triggers |
| Over 10 per day | Same user multiple withdrawals on same day | Confirm not abnormal activity then manually trigger |
| Auto switch turned off | Auto-withdrawal for a currency is closed | Check auto_settings table, confirm if it needs to be reopened |
| Insufficient balance | Available balance less than withdrawal amount | Notify user of insufficient balance |
This Is Not a Fault
Auto-withdrawal conditions not being met is a normal safety mechanism, not a system fault. Ops can manually execute after confirmation.
Scenario Four: Withdrawal Blocked by Risk Control
Symptom: User is rejected when initiating withdrawal in App, or withdrawal task entered the Audit step.
Blacklist Hit
hk-withdraw-blacklist-go checks whether the withdrawal target account is on the blacklist. Withdrawals hitting the blacklist are directly rejected and no withdrawal task is created.
Ops handling:
- Confirm blacklist hit reason
- If it's a false positive, contact risk control team to update blacklist
- User needs to re-initiate withdrawal
High-Risk Flag
When a user account is flagged as high-risk by risk control, withdrawal gets an extra Audit review step. This is not a rejection — after review passes, withdrawal proceeds normally.
Scenario Five: Post-Withdrawal Reversal
Symptom: Withdrawal already completed (status=Completed), but funds need to be recovered.
Reversal is a low-frequency but high-impact operation. Possible trigger reasons:
| Reason | Description |
|---|---|
| Bank return | Bank returned the already remitted funds |
| Erroneous withdrawal | Ops discovered withdrawal info was wrong (e.g., wrong user) |
| Post-hoc risk control intercept | Risk control discovered anomaly after withdrawal completed |
Reversal flow:
- Ops initiates reversal in OA (action: REVERSE)
- System checks current status — only "Completed" tasks can be reversed
- Execute reversal: Update task status to "Reversed" (5)
- SBA executes reverse fund operation
- Notify user withdrawal has been reversed
After reversal, task status becomes 5 (REVERSE).
Scenario Six: User Cannot Initiate Withdrawal
Symptom: User gets an error or cannot submit when clicking withdrawal in App.
| Cause | User Sees | Error Code | Resolution |
|---|---|---|---|
| Account frozen | "Account abnormal, cannot withdraw" | — | Check freeze type (CASH_OUT=2), contact relevant team to unfreeze |
| Withdrawal restriction (risk control) | "Your account is temporarily unable to withdraw" | 140670003 | Check if there's a withdrawal restriction flag |
| Blacklist | "Account restricted from withdrawing funds" | — | Confirm blacklist reason, contact risk control team |
| Invalid bank card | "Bank card does not exist" | 140670002 | Guide user to re-bind bank card |
| Insufficient balance | "Securities account balance insufficient" | 140670005 | Funds may be frozen (currency exchange, fund, etc.) |
| Negative equity | "Account has outstanding debt" | 140670004 | User must clear debt before withdrawal |
| GDCA not completed | "GDCA not completed" | 140670009 | Guide user to complete GDCA certification |
| NSS questionnaire not completed | "NSS questionnaire not completed" | 140670008 | Guide user to complete NSS questionnaire |
| Dormant account | "Dormant accounts do not support withdrawal" | 140670006 | User must reactivate account first |
| Online account opening deposit threshold not met | "Card binding requires transfer >= HKD 10,000" | 140670011 | Guide user to deposit to meet threshold first |
| Bank account not authenticated | "Bank account has not passed authentication" | — | Guide user to complete bank authentication |
| Airstar BST not authorized | "BST not authorized" | — | Bank-initiated withdrawal scenario only, guide authorization |
| Mainland bank card | "Withdrawal to mainland China bank accounts not supported" | — | Guide user to use Hong Kong bank card |
| A-share Connect CNH restriction | "CNH only supports withdrawal to Hong Kong banks" | — | Select Hong Kong bank account for withdrawal |
| Margin withdrawable insufficient | "Exceeds cash withdrawable amount" | — | Confirm margin requirement |
| Payoneer restriction | "Payoneer accounts do not support withdrawal" | — | Select another bank card |
| Securities account does not exist | "Securities account not opened/closed" | 140670007 | Guide user to open account |
Freeze type quick reference → Withdrawal Rules Manual § Freeze Types Pre-check error codes → Withdrawal Data Dictionary § Pre-check Error Codes
Scenario Seven: BST Authorization Exception
Symptom: User cannot withdraw through BST channel, or withdrawal stuck at Confirm step with prompt "BST authorization status abnormal".
This type of exception mainly affects the Airstar BST channel (Mandate model); CMB/CMBC's traditional agreement model rarely has this issue.
| Exception | Symptom | Possible Cause | Resolution |
|---|---|---|---|
| Authorization timeout | Mandate stuck at PROCESSING for a long time | Bank processing delay or communication disruption | Wait for bank processing; query Airstar API manually after timeout |
| Authorization failed | Mandate becomes FAIL | User info verification failed / bank risk control | Check 140630xxx error code, guide user to re-authorize |
| Authorization cancelled | Mandate becomes CANCEL | User cancelled on bank side | Confirm user intent, re-initiate authorization if needed |
| Partial market failure | Some of 3 markets bound successfully | Configuration issue for a specific market's BST setup | Check failed market configuration, manually supplement binding |
| Status out of sync | Bank already cancelled but moomoo still OPEN | Sync callback lost | Manually query Airstar API to sync latest status |
Authorization Exception vs Withdrawal Exception
Authorization exception blocks all subsequent deposits/withdrawals (because Mandate is not OPEN), while withdrawal exception only affects a single transaction. When authorization exception is discovered, prioritize resolving it to avoid affecting more transactions.
Mandate status codes → Withdrawal Data Dictionary § BST Authorization Status Codes
Scenario Eight: BST Deposit Refund (REFUNDED)
Symptom: BST deposit already showed successful arrival, but subsequently funds were returned by bank.
This is an exception status unique to Airstar BST — REFUNDED. CMB/CMBC BST deposits do not have a refund mechanism.
Trigger conditions:
- Bank discovers transaction anomaly post-hoc (e.g., compliance issue) and initiates refund
- Bank risk control system post-hoc intercept
System behavior:
- Receives REFUNDED status from Airstar API
- System triggers reversal: reverses funds already credited to securities account
- Updates deposit record status
- Triggers alert notification to ops
Ops action:
- Confirm refund reason (check error info returned by Airstar API)
- Verify user securities account balance has been correctly rolled back
- Notify user and explain the reason
- If re-deposit is needed, guide user to initiate a new deposit operation
REFUNDED ≠ Deposit Failed
Deposit failed (FAILED) means the bank rejected the deposit instruction and funds never arrived. REFUNDED means the deposit already succeeded then the bank returned the money — the system needs to perform a reversal operation, which is more complex than handling a normal failure.
Things You Must Never Do During Withdrawal Troubleshooting
- Do not execute reversal on "Processing" status tasks — funds may be in transit on bank side, forcing reversal will cause fund status inconsistency
- Do not re-trigger
startTransfer()after BST's 15:55 daily cutoff — will cause duplicate withdrawal next day - Do not manually modify task status codes in the database to bypass approval steps — breaks audit trail, violates internal control requirements
- Do not immediately reject a task when bank callback code is -5 (timeout) — system will auto-retry, most recover in seconds
Troubleshooting by Channel
Above is organized by "symptom"; this section supplements with common faults categorized by "withdrawal channel". For all 12 method codes and their corresponding channels see Bank Capability Matrix § Withdrawal Method Code Mapping.
BST Withdrawal (method=auto_bs) — Detailed Runbook
Runbook: BST Withdrawal Not Arrived
Trigger: Customer reports BST withdrawal shows "Completed" but funds have not arrived in bank account
Minute 1 — Confirm status:
- CRM withdrawal task → Check task status field and bank callback result
- CMB/CMBC: Callback code = -5 (timeout) → System auto-switches to backup server, wait for retry result
- CMB/CMBC: Callback code = -6 (rejection) → Bank explicitly rejected, check rejection reason
- Airstar: Status = PENDING → Polling in progress, wait for
AsbBstTransferto complete (max 10 times)
Minute 5 — Deep investigation: 5. Airstar polling exhausted 10 attempts still PENDING → Enters SyncAsbBstWithdraw 2-hour fallback window, do not manually intervene at this point 6. Airstar returns FAILED → Check 140630xxx error code → Release frozen funds → Notify user 7. CMB/CMBC retry also failed → Confirm whether funds have been sent out on bank side (critical!)
Minute 15 — Escalation: 8. Airstar 2-hour fallback window ended still no callback → Critical alert, manually query Airstar API to confirm actual bank-side status 9. CMB/CMBC confirmed funds sent but system not updated → Contact bank liaison + notify tech ops to manually sync status
BOC FTS Withdrawal (method=boc / boc_fps / tele_transfer)
| Exception | Possible Cause | Resolution |
|---|---|---|
| FTS file not delivered | SFTP connection error or S14 file generation failed | Check bochk_relay logs, confirm SFTP connectivity |
| Status no update for a long time | S16 receipt file not returned | Manually log into BOC FTS system to query, confirm file status |
| Status F (failed) | Payee info incorrect or account abnormal | Check error description, contact BOC to confirm then correct info and re-withdraw |
| Status R (returned) | Bank returned already remitted funds | Confirm return reason, correct payee info if needed and re-initiate |
| Status C (cancelled) | Withdrawal cancelled | Confirm cancellation source (system/ops/bank), re-initiate if needed |
| FPS exclusion bank hit | Receiving bank on FPS exclusion list | Switch to boc (same-bank) or tele_transfer (cross-border) channel |
CGB FPS API (method=cgb_fps_api)
| Exception | Possible Cause | Resolution |
|---|---|---|
| Status code judgment error | 2063 and 2065 have reversed meanings for same status code | Confirm message type before judging → CGB Status Code Reversal |
| Batch degraded to single | 2064 batch send failed | System auto-splits into 2063 single transactions, check degradation logs |
| SIGN_ERROR | Signature or verification failed | Check signing key configuration, confirm if CGB side has changed keys |
| A012 duplicate reference number | Request ID duplicated | Confirm if it's a duplicate send, cannot retry |
| A014 system busy | Bank side under high load | System auto-retries, wait for recovery if persistent failure |
| UNKNOWN status | Batch result cannot be confirmed | Requires manual login to CGB system to query and confirm |
Corporate Online Banking Withdrawal (method=hase / hsbc)
| Exception | Possible Cause | Resolution |
|---|---|---|
| Long time without operation | Ops has not logged into online banking to execute transfer in time | Check ops schedule, confirm if Remittance step has been triggered |
| Online banking session timeout | Bank online banking login expired | Re-login to online banking, continue operation |
| Transfer rejected by bank | Amount exceeds limit or payee info incorrect | Verify bank-side limits and payee info, correct and re-operate |
Standard Chartered FPS (method=sc)
| Exception | Possible Cause | Resolution |
|---|---|---|
| Webhook not received | SCB push delayed or endpoint unavailable | Proactively call Payment Status API to query actual status |
| FAILED status | FPS transfer failed | Check reason code, switch channel if necessary → SCB Status Codes |
| RETURNED status | Bank returned transfer | Confirm return reason, correct payee info then re-withdraw |
| JWT authentication failed | Token expired (only 30 seconds valid) | Check server NTP clock sync |
EWB Wire (method=ewb)
| Exception | Possible Cause | Resolution |
|---|---|---|
| Long arrival time | Cross-border wire typically 1-3 business days | Wait normally, contact EWB to confirm if exceeds 3 days |
| Transfer returned | Payee info incorrect (SWIFT code/account number etc.) | Verify payee info then re-initiate |
CHATS/RTGS (method=chats_rtgs)
| Exception | Possible Cause | Resolution |
|---|---|---|
| Clearing delay | CHATS system has fixed daily clearing windows | Wait within clearing time, defer to next business day for off-hours |
| Amount not fully arrived | Clearing fee deduction | Normal, inform user that bank clearing may incur fees |
Manual Withdrawal (method=manual)
| Exception | Possible Cause | Resolution |
|---|---|---|
| Long time in processing | Ops has not manually operated ICBC online banking | Check scheduling and task assignment, manually complete transfer |
| Transfer failed | ICBC account insufficient balance or payee info incorrect | Verify then re-operate |
Operations Tools Checklist
| Tool | Purpose | Required Permission |
|---|---|---|
| Withdrawal task list | View/filter all withdrawal tasks | — |
| Audit review | High-risk withdrawal review | PERMISSION_CASH_TASKS_OUT_AUDIT |
| Confirm | Confirm bank card and channel | PERMISSION_CASH_TASKS_OUT_CONFIRM |
| Remittance | Execute withdrawal transfer | PERMISSION_CASH_TASKS_OUT_REMIT |
| Reversal | Reverse completed withdrawal | — |
| Follow-up | Mark task as being followed up | — |
| Transfer | Transfer task to another ops staff | — |
| Mandate status query | Query BST authorization status (Airstar) | — |
| BST polling status | View Airstar polling progress and results | — |
Monitoring and Alerts
The system monitors withdrawal exceptions through the following mechanisms:
| Monitoring Item | Method | Alert Condition | Alert Channel |
|---|---|---|---|
| Queue event backlog | Cron check every minute | Pending event count exceeds threshold | Feishu alert |
| BST polling timeout | Airstar SyncAsbBstWithdraw fallback | Still PENDING after 2-hour window | Feishu alert |
| Auto-withdrawal balance low | Checked during autoOut() deduction | Balance < alarm_amount | Feishu alert |
| Auto-withdrawal balance circuit break | Checked during autoOut() deduction | Balance < stop_amount | Feishu alert + auto-close that currency's auto-withdrawal |
| Airstar Mandate exception | Scheduled status sync | Mandate status not OPEN but has withdrawal tasks | Feishu alert |
| CMB/CMBC callback exception | Callback processing | Callback code = -5 (timeout) or -6 (rejection) | Feishu alert |
Alert Handling Priority
When receiving alerts, handle in this priority order:
| Priority | Alert | Impact | Action |
|---|---|---|---|
| P0 | Queue event backlog | All withdrawal tasks stuck | Check if queue consumer processes are running, restart service |
| P0 | Auto-withdrawal balance circuit break | All BST withdrawals for that currency degrade to manual | "Top up" auto_settings balance + reopen switch |
| P1 | BST polling timeout | Single Airstar withdrawal status unknown | Manually query Airstar API to confirm bank-side status |
| P1 | CMB/CMBC callback -6 | Single withdrawal rejected by bank | Contact bank to confirm rejection reason, may need channel switch |
| P2 | Balance alarm | Balance approaching circuit breaker line | Monitor subsequent withdrawal volume, top up proactively if needed |
| P2 | Mandate exception | Affects all subsequent deposits/withdrawals for that user | Guide user to re-authorize |
Common Misconceptions
| Misconception | Fact |
|---|---|
| "User says money hasn't arrived means system fault" | Most cases are the approval flow still in progress — especially non-BST channels requiring ops to manually operate multiple steps. First follow the diagnosis flow chart to check task status |
| "BST callback timeout (-5) means withdrawal failed" | It does not. System will auto-switch to backup exit_server for retry, typically recovering in seconds. Only if retry also fails is manual intervention needed |
| "Auto-withdrawal conditions not met is a system fault" | It is a normal safety mechanism, not a fault. Ops can manually trigger execution after confirming amount and operation are reasonable |
| "After reversal, funds automatically return to user's bank card" | They do not. Reversal only reverses the "Completed" withdrawal within the system (status changes to REVERSE), funds return to the securities account. Returning to bank card is a separate operation |
What to Read Next
| I want to... | Go to |
|---|---|
| Understand the complete withdrawal flow (to determine where it's stuck) | Withdrawal Lifecycle |
| See detailed explanation of a specific rule | Withdrawal Rules Manual |
| See a specific channel's technical execution details | Channel Execution Manual |
| Look up callback codes, status code numbers | Withdrawal Data Dictionary |
| Deep dive into BST bank exception handling | BST Overview |