Withdrawal Approval Guide
About this page
What: What Operations needs to check, how to act, and how to handle common blockers at each step of the three-step withdrawal approval Audience: Operations staff responsible for withdrawal review Prerequisites: Withdrawal Lifecycle -- understand the three-step approval flow first Reading time: 3 minutes Owner: Withdrawal Operations Lead
Key takeaway: Withdrawal approval has three steps (Audit -> Confirm -> Remittance), each covering different dimensions. The most common blocker is method=null at the Confirm step -- the system cannot automatically select a channel, requiring manual selection.
CRM Navigation
| Function | CRM Path | Description |
|---|---|---|
| Withdrawal task list | Withdrawal Management -> Withdrawal Tasks | View all withdrawal tasks; filter by step / status / template |
| Audit pending review | Withdrawal Management -> Withdrawal Tasks -> Filter step=Audit | View only tasks requiring high-risk review |
| Confirm pending | Withdrawal Management -> Withdrawal Tasks -> Filter step=Confirm | View only tasks requiring channel confirmation |
| Remittance pending | Withdrawal Management -> Withdrawal Tasks -> Filter step=Remittance | View only tasks requiring transfer execution |
| Auto-withdrawal settings | Withdrawal Management -> Auto-Withdrawal Settings | View / modify auto_settings (BST bank-securities) |
Approval Flow at a Glance
Each withdrawal goes through up to three steps: Audit -> Confirm -> Remittance
| Step | When is manual action needed | Permission | Target SLA |
|---|---|---|---|
| Audit | Only for unusual templates (abnormal withdrawals) | PERMISSION_CASH_TASKS_OUT_AUDIT | 2 hours |
| Confirm | When method = null or bank card info needs confirmation | PERMISSION_CASH_TASKS_OUT_CONFIRM | 30 minutes |
| Remittance | When not all 6 auto-withdrawal conditions are met | PERMISSION_CASH_TASKS_OUT_REMIT | 30 minutes |
Most normal withdrawals use the default template (no Audit). When all auto-withdrawal conditions are met for the BST channel, Remittance also executes automatically -- Operations only needs to handle exceptions.
Runbook format
Each approval step below is organized in Runbook format: Trigger -> Checklist -> Action -> Verification.
Daily Withdrawal Processing Timeline
| Time | Event | Description |
|---|---|---|
| 08:30 | System auto-moves tasks to processing | Tasks submitted after 11:00 the previous day ("next-day processing") are automatically moved to "Processing" |
| 08:30~11:00 | Same-day batch processing window | Process the current batch (previous day 11:01 ~ today 10:59 submissions) |
| 11:00 | Batch cutoff | Tasks submitted after 11:00 go into the next-day batch |
| After 11:00 | Export transfer files | Export transfer files by withdrawal method |
| After 11:00 | Upload to online banking | Upload transfer files to each bank's corporate online banking |
| After upload | Dual-authorization approval | Two authorized signers approve the transfer separately in online banking (see details below) |
| After bank confirmation | Mark as processed | After confirming the bank has completed the transfer / cheque deposit, mark the day's withdrawal tasks as "Processed" in CRM |
| 15:55 | BST cutoff | BST bank-securities transfer daily cutoff; irreversible |
| Afternoon | Cheque deposit | Cheques are deposited at bank branches by staff in the afternoon |
Important restrictions
- Withdrawals are not supported to: third-party platforms, credit cards, or e-wallets (Alipay, WeChat Pay, etc.)
- Withdrawals may only be sent to the client's own bank account (including joint accounts in the client's name)
Dual-authorization approval instructions
Flow: Transfer file successfully imported into online banking -> First authorized signer approves -> Second authorized signer approves -> Transfer takes effect.
When an authorized signer is absent: Dual authorization is a hard requirement from the bank and cannot be completed by a single person. If an authorized signer is unavailable on a given day:
- Arrange a backup authorized signer in advance (must already have online banking approval rights set up with the bank)
- If no backup is available, that bank's withdrawal batch will be delayed until the next business day when both authorized signers are present
- Urgent withdrawals (e.g., client has a time-sensitive requirement) must be escalated to the Withdrawal Operations Lead for coordination
Step 1: Audit (High-Risk Review)
Trigger
The system defines 6 approval templates; only those with the unusual suffix include Audit:
| Template | Applicable scenario | Has Audit? |
|---|---|---|
default | Normal withdrawal | No |
unusual | Normal account, abnormal withdrawal | Yes |
omnibus | OM account, normal withdrawal | No |
om_unusual | OM account, abnormal withdrawal | Yes |
fund | Fund redemption withdrawal | No |
fund_unusual | Fund redemption, abnormal withdrawal | Yes |
Assessment
- User account status -- Any abnormal flags or freeze records
- Withdrawal destination -- Is the receiving bank card in the client's own name? Is it in a high-risk region?
- Amount reasonableness -- Is it proportionate to account asset size?
- Historical behavior -- Any pattern of frequent large withdrawals?
Action
- Approve -> Click NEXT; the task advances to the Confirm step
- Reject -> Select a rejection reason; notify the user
Step 2: Confirm (Instruction Confirmation)
All withdrawals pass through this step
The core task at Confirm is to determine "which channel the funds go out through."
Checklist
- Bank Card status -- Is the linked bank card valid and not expired?
- Withdrawal method -- Is the
methodfield set?- Already set (e.g.,
auto_bs,ebank) -> Verify it is appropriate method = null-> Operations must manually select a channel (this is the most common reason Confirm gets stuck)
- Already set (e.g.,
- BST channel additional validation -- If this is a bank-securities withdrawal, verify the Mandate status is OPEN
- Mandate is not OPEN -> Do not approve; guide the user to complete bank-securities authorization first
How to select a channel when method = null
When a task's method field is null, Operations must manually select a channel at the Confirm step. Decision logic:
Channel selection quick-reference (the selectable channel list in the CRM Confirm step comes from allSetMethod):
| User's Bank Card | Recommended Channel | Channel Key | Fee | Estimated SLA | Applicable Scenario |
|---|---|---|---|---|---|
| BOC | BOC FPS | boc_fps | Free | ~10 min | HKD preferred via FPS, amount < 1M |
| BOC | BOC same-bank | boc | Free | Hours | USD/CNH, or HKD >= 1M |
| HSBC | HSBC E-Banking | hsbc | Free | ~30 min | HKD/USD/CNH same-bank transfer |
| Hang Seng | Hang Seng E-Banking | hase | Free | ~30 min | HKD/USD/CNH same-bank transfer |
| SCB | SCB FPS | sc | Free | ~10 min | Local HKD/CNH < 1M |
| CGB | CGB FPS | cgb_fps_api | Free | ~10 min | Local HKD/CNH < 1M |
| ICBC | ICBC manual | manual | Free | Hours | HKD only; manually processed by Operations |
| CMB / CMBC / Airstar | BST Bank-Securities | auto_bs | Free | Minutes | Requires Mandate=OPEN; fastest channel |
| Overseas (BOC coverage) | Cross-border T/T | tele_transfer | Bank-dependent | 2~3 days | Cross-border withdrawal |
| Overseas (EWB) | EWB T/T | ewb | Bank-dependent | 2~3 days | Cross-border withdrawal (EWB coverage area) |
| Special cases | CHATS/RTGS | chats_rtgs | HKD/CNY 25 or USD 8 | Hours | Local cross-bank large-value or virtual bank USD |
| Special cases | Cheque | check | Free | 3~5 days | Rarely used; when no other channel qualifies |
SCB same-bank channel
The CRM channel list shows an "SCB same-bank" option, but this channel is not yet enabled. SCB withdrawals currently go through FPS (sc); do not select SCB same-bank.
Action
- All confirmed -> Click NEXT; the task advances to the Remittance step
- Confirm does not execute the transfer -- the actual transfer happens at the Remittance step
Step 3: Remittance (Fund Disbursement)
Automatic vs. Manual
For the BST channel, the system checks 6 conditions. If all are met, it automatically calls startTransfer():
| # | Condition | When not met |
|---|---|---|
| 1 | Channel is auto_bs (bank-securities) | Non-BST channels can only be processed manually |
| 2 | Auto-withdrawal switch is enabled | Check the auto_settings table |
| 3 | Request is within business hours | Off-hours tasks are queued; auto-executed the next business day |
| 4 | Amount does not exceed limits (Airstar HKD <= 3M / USD <= 500K) | Large amounts require manual confirmation |
| 5 | User's withdrawal count for the day <= 10 | Exceeding frequency requires manual confirmation |
| 6 | User's available balance >= withdrawal amount | Insufficient balance; notify the user |
Manual Trigger Scenarios
When not all conditions are met, Operations confirms there is no risk and clicks "Execute Transfer" to manually trigger startTransfer().
Note: Once executed, funds are frozen and the bank instruction is sent -- the operation is irreversible (can only be reversed after the fact).
Post-Manual-Trigger Verification
After executing startTransfer(), confirm the following:
| # | Verification Item | Expected Result |
|---|---|---|
| 1 | Task status | Updated to "Completed" or "Processing" (awaiting bank callback) |
| 2 | Fund freeze | Withdrawal amount has been frozen from available balance |
| 3 | Bank instruction | Sent to the bank (check task log) |
| 4 | User notification | "Withdrawal in progress" notification sent |
Six Withdrawal Methods Runbook
1. Bank-Securities Transfer (BST)
| Dimension | Description |
|---|---|
| Supported banks | CMB (HKD/USD), CMBC (HKD/USD) |
| Cutoff time | Same day 15:55; irreversible |
| Large-amount rules | HKD >= 3M / USD >= 500K: requires two withdrawal staff to click "Process," and accounting must be notified to monitor account balance |
| Steps | Confirm sufficient balance in the bank-securities account -> Batch process -> Funds are transferred out of the bank-securities account immediately |
Large BST withdrawals
When processing large BST withdrawals, two withdrawal staff members must confirm separately, and the accounting team must be notified simultaneously to monitor balance changes in the bank-securities account.
2. Same-Bank Transfer
| Dimension | Description |
|---|---|
| Supported receiving banks | ICBC (HKD only), BOC, Hang Seng (HASE), HSBC (HKD/USD/CNH) |
| Verification key points | Client name and account number must match the account-opening credentials |
| Information mismatch | Reject the task with reason; ask the client to provide correct information |
| Bank return | Reject the withdrawal instruction based on the bank's return reason |
3. FPS
| Dimension | Description |
|---|---|
| Scope | Local bank accounts other than ICBC / BOC / Hang Seng / HSBC |
| Supported currencies | HKD and CNH, amount < 1M |
| Channel | Via BOC FPS |
| Verification key points | Client name and account number must match credentials |
4. Cheque
| Dimension | Description |
|---|---|
| Scope | Tasks that do not qualify for same-bank transfer or FPS: HKD/CNH >= 1M; non-BOC/Hang Seng/HSBC USD withdrawals |
| Signature requirement | After printing, two authorized signers must sign |
| Deposit method | Staff deposit cheques at respective bank branches in the afternoon |
| Incorrect client info | Reject based on the bank's return reason |
5. CHATS / RTGS
| Dimension | Description |
|---|---|
| Virtual bank USD | Virtual banks do not support USD cheque deposit -> Use CHATS/RTGS; fee: USD 8 |
| HKD/CNH >= 1M | FPS does not support amounts over 1M -> Use CHATS/RTGS; fee: HKD/CNY 25 |
| Client confirmation | System pop-up informs the client of the fee; client must enter the trading password to confirm |
6. Cross-Border Telegraphic Transfer (T/T)
| Dimension | Description |
|---|---|
| Scope | Cross-border withdrawal tasks |
| NSS screening | Every cross-border withdrawal must pass NSS (Name Screening System) check on the beneficiary name |
| Action | After authentication, click "Batch Process" -> Task enters the cross-border T/T processing queue |
| Verification | Client name and account number must match credentials |
High-Risk Approval Flows
The system imposes additional approval requirements for high-risk clients and high-risk regions.
High-Risk Client Deposits
| Step | Description |
|---|---|
| System processing | High-risk client deposits are processed automatically by the system (non-blocking) |
| End-of-day notification | Daily at 16:00, the deposit/withdrawal team is notified via email / Feishu |
| Operations action | Staff register the entry in the "Deposit/Withdrawal Team Third-Party, Joint, High-Risk Table" (Feishu cloud doc) |
| Monthly spot check | Monthly spot check of suspicious client transaction records |
High-Risk Client Withdrawals
| Step | Description |
|---|---|
| Operations action | Staff first register in the Feishu spreadsheet, then approve the withdrawal |
| Monthly spot check | Monthly spot check of suspicious client transaction records |
High-Risk Region Deposits
A secondary review is required before deposit approval -- proactively contact the client with the following questions:
Client inquiry template
"Dear client, because the bank card you added requires special approval, please answer the following questions:
- Why are you depositing / withdrawing from [relevant region]?
- Has your address moved to [relevant region]? (If yes, please update your address in CRM)
- Is this a one-time transaction, or will you continue to deposit / withdraw from [relevant region]?"
High-Risk Region Withdrawals
| Step | Description |
|---|---|
| Before new bank card approval | The client must first be asked using the template above |
| Registration | Register in the Feishu spreadsheet |
| Monthly spot check | Spot check suspicious client transaction records |
Handling Unsatisfactory Client Responses
After contacting the client, Operations must assess whether the response is reasonable:
| Client Response | Assessment | Next Step |
|---|---|---|
| Clear, reasonable explanation | Pass | Register and proceed with normal approval |
| Vague answer but no obvious suspicion | Uncertain | Escalate to Risk Control & Compliance team for a go/no-go decision; Operations must not approve independently |
| Clearly suspicious (refuses to answer, contradictions) | Reject | Suspend approval + escalate to Risk Control & Compliance team + document detailed communication |
Key principle
Operations staff must not approve high-risk transactions on their own when uncertain. It is better to escalate than to mistakenly approve -- the consequences of a compliance issue far outweigh a processing delay.
Monthly Spot-Check Process
| Step | Details |
|---|---|
| 1. Pull data | Extract transaction records for high-risk clients / high-risk regions |
| 2. Line-by-line review | Confirm client behavior is consistent with declarations; check for abnormal transaction behavior from the high-risk month to the review date; check for abnormal deposit/withdrawal behavior |
| 3. Team review | Team members review and document; team lead performs secondary review |
| 4. Escalation | If suspicious activity is found, escalate to the Compliance team |
Highly suspicious indicators:
- Client deposit amount significantly deviates from declared assets
- Frequent deposits/withdrawals in a short period with no trading activity
Maximum Withdrawable Amount Calculation
The maximum amount a client can withdraw is the minimum of the following three values:
| Metric | Source | Description |
|---|---|---|
| Real-time net assets | Settlement system | Includes unsettled amounts |
| Minimum equity value (Min_ELV) | Risk Control system | Minimum net asset value calculated by Risk Control |
| Maximum credit limit | Risk Control system | Maximum credit line for margin accounts |
Formula: Max Withdrawable = MIN(Real-time Net Assets, Min_ELV, Max Credit Limit)
Large Withdrawal Thresholds and Service Hours
Airstar BST Large-Amount Thresholds
Airstar withdrawals exceeding the following thresholds follow a non-automatic flow:
| Currency | Large-Amount Threshold |
|---|---|
| HKD | 8M |
| USD | 2M |
| RMB | 8M |
Airstar BST Service Hours (Full-Day Market)
Margin accounts:
| Time Window | Auto-Withdrawal | Large Amount | Estimated Arrival |
|---|---|---|---|
| Trading day 09:00~10:55 | Auto | -- | Same day, within 5 min |
| Trading day 09:00~10:55 | Non-auto | > threshold | Next day before 15:55 |
| Trading day 09:00~10:55 | Non-auto | <= threshold | Same day before 15:55 |
| Other times | Auto | -- | Next day before 09:00 |
| Other times | Non-auto | -- | Next day before 15:55 |
Non-margin accounts:
| Time Window | Auto-Withdrawal | Large Amount | Estimated Arrival |
|---|---|---|---|
| Trading day 09:00~15:55 | Auto | -- | Same day, within 5 min |
| Trading day 09:00~15:55 | Non-auto | > threshold | Next day before 15:55 |
| Trading day 09:00~15:55 | Non-auto | <= threshold | Same day before 15:55 |
| Trading day 00:00~09:00 | Auto | -- | Same day before 09:05 |
| Other times | Auto | -- | Next day before 09:00 |
| Other times | Non-auto | -- | Next day before 15:55 |
Non-trading days
No withdrawals are processed on non-trading days.
Withdrawal Pre-Validation Checklist
The system automatically runs the following validations when a client initiates a withdrawal. If any validation fails, the request is rejected:
| Validation Item | Error Code | Error Message | Trigger Point |
|---|---|---|---|
| Authorization expired | 140670001 | Authorization expired; deposit/withdrawal not allowed | On submission |
| Authorized bank card does not exist | 140670002 | Authorized bank card does not exist; deposit/withdrawal not allowed | On submission |
| Risk Control restriction | 140670003 | Risk Control restriction; deposit/withdrawal not allowed | On submission |
| Account deficit | 140670004 | Account has outstanding debt; withdrawal not allowed | On submission |
| Insufficient balance | 140670005 | Securities account balance insufficient; withdrawal not allowed | On submission |
| Dormant account | 140670006 | Dormant account; deposit not allowed | On page load |
| Account closed | 140670007 | Securities account does not exist / has been closed | On page load |
| NSS incomplete | 140670008 | NSS questionnaire not completed; withdrawal not allowed | On confirmation |
| GDCA incomplete | 140670009 | GDCA not completed; deposit/withdrawal not allowed | On confirmation |
| Insufficient initial deposit | 140670011 | Online account user has not yet deposited over 10,000 | On confirmation |
| Review rejected | 140670012 | Review rejected the withdrawal request | After review |
| System error | 140670099 | System error; deposit/withdrawal not allowed | Any time |
Other business validations (no error codes)
| Validation Item | Description |
|---|---|
| Dormant account | Dormant / inactive account; withdrawal not supported |
| No linked bank card | Bank card does not exist |
| Bank not verified | Bank account has not been verified (except Airstar BST) |
| Blacklisted | Account is restricted from withdrawing funds |
| Mainland China bank card | Withdrawal to Mainland China bank accounts is not supported |
| A-Share Connect restriction | RMB funds in A-Share Connect accounts can only be withdrawn to Hong Kong bank accounts |
| Currency mismatch | Withdrawal currency does not match the bank account currency |
Four scenarios that trigger withdrawal rejection:
- Pre-validation failure
- Deduction failure (balance changed)
- Auto-withdrawal conditions not met; Operations manually rejects
- Bank transfer failure
Common Blockers
| Issue | Cause | Resolution |
|---|---|---|
| Task stuck at Audit for a long time | Queued or overlooked | Check the Risk Control flag reason; review and advance |
| Confirm cannot proceed | method = null | Manually select a withdrawal channel |
| Confirm shows Mandate error | BST authorization incomplete / expired | Guide the user to re-authorize |
| Remittance does not execute automatically | One of the 6 conditions is not met | Confirm and manually trigger |
| Bank callback failure | Bank-side rejection or timeout | Check the error code; switch channels and retry if necessary |
| Withdrawal rejection scenarios | Pre-validation / deduction failure / Operations rejection / bank failure | See the 4 scenarios in Withdrawal Pre-Validation Checklist above |
Required Permissions
| Permission | Purpose |
|---|---|
PERMISSION_CASH_TASKS_OUT_AUDIT | Audit step review |
PERMISSION_CASH_TASKS_OUT_CONFIRM | Confirm step confirmation |
PERMISSION_CASH_TASKS_OUT_REMIT | Remittance transfer execution |
If requirements change: Modifying the withdrawal approval flow
Code locations:
- Approval templates:
withdraw/src/app/Business/Task.php->$stepTemplates - Step logic:
withdraw/src/app/Business/Tasks/Step/{Audit,Confirm,Remittance}.php - Auto-withdrawal conditions:
withdraw/src/app/Business/Tasks/Step/Remittance.php->canAutoTransfer() - Channel selection:
withdraw/src/app/Business/CreatorBase.php->calcMethod()
Common change scenarios:
- Add an approval step (e.g., compliance review) -> Create a new Step class implementing the
IFStepinterface; add it to the corresponding template in$stepTemplates - Change channel recommendation when method=null -> Adjust the
calcMethod()routing logic or the CRM frontend display - Change auto-withdrawal conditions -> Modify the
canAutoTransfer()method inRemittance.php - Adjust auto_settings limits -> Modify the
auto_settingstable via the CRM backend, or modify the validation logic inAutoSetting.php
After Reading
| I want to... | Go to |
|---|---|
| Understand the full approval flow | Withdrawal Lifecycle |
| Check auto-withdrawal conditions and limits | Withdrawal Rules Handbook |
| Look up callback codes and status codes | Withdrawal Data Dictionary |
| Troubleshoot withdrawal issues | Withdrawal Troubleshooting |
| Learn about BST channel bank-side details | BST Overview |