Deposit Methods Overview
About This Page
What: Classification, experience differences, and selection recommendations for 10 deposit methods, plus the complete lifecycle of a deposit from application to crediting Audience: Product managers who need to understand the full landscape of deposit channels and help users choose the optimal method Prerequisites: Getting Started GuideReading time: 7 minutes Owner: Deposit Product Manager
Key Takeaways: There are 10 deposit methods, classified by automation level into three categories: Push (user-initiated transfer, most common), Pull (eDDA direct debit), and BST (Bank-Securities Transfer). A deposit goes through five steps from application to crediting: "Application -> Statement Collection -> Matching -> Crediting -> Reconciliation."
Deposit System Architecture
The diagram below shows the complete topology of the deposit system — from user action to fund crediting, with each node annotated with the corresponding documentation page. New PMs should spend 2 minutes understanding this diagram before diving into individual pages.
Documentation for each node in the diagram:
| Node | Page | Key Content |
|---|---|---|
| Apply Form | Deposit Quick Reference | Application status codes, sharding strategy, core fields |
| Statement Collection Service | Bank Statement Collection | Collection methods, protocols, and latency for 12 banks |
| Matching Engine | Matching & Auto-crediting | Five-dimension matching, bank-specific rules, tolerance design |
| Auto-credit Decision | Matching & Auto-crediting | Limits, 2412 rule, risk control checks |
| Operations OA Review | Manual Matching Guide | Operations workflow, approval permissions |
| eDDI Debit | eDDA Direct Debit Deposit | Authorization lifecycle, debit chain, error codes |
| BST Instruction | BST Bank-Securities Transfer | CMB/MSB/Airstar BST protocols |
| SBA Crediting | SBA Fund Orchestration | Procedure execution model |
| Exception Handling | Deposit Troubleshooting | 9 scenarios + Runbooks |
| Change Guide | Deposit Change Guide | Operational guides for 10 change scenarios |
| Reversal/Refund | Refund & Reversal | Three refund mechanisms, decision tree, failure recovery |
Three Deposit Modes
There are three fundamentally different "initiators" for transferring money from a bank to a securities account:
Push (User-initiated): The user operates the transfer in their banking app. After the money reaches the company account, the system needs the Matching Engine to identify "whose money is this." The advantage is no pre-authorization required and works with any bank; the cost is the need for matching and non-instant crediting.
Pull (System-initiated): The user operates with one click in the moomoo App, and the system directly debits from the user's bank account. Since the system initiates the debit itself, it inherently knows the fund ownership and completely skips the matching engine. Best experience, but requires the user to complete bank authorization (eDDA) in advance, and only HSBC and Hang Seng are supported.
Direct (Bank-Securities Link): A dedicated channel between the bank and securities company. The system initiates the debit through the BST protocol. Similar to Pull in that it doesn't need the matching engine, but uses a different technical protocol (SM2-encrypted dedicated line). Only CMB, MSB, and Airstar are supported.
10 Deposit Methods at a Glance
| Code | Method | Mode | Supported Banks | User Action | Crediting Time |
|---|---|---|---|---|---|
| 3 | FPS | Push | SCB, CGB, BOCHK, Hang Seng, ICBC | Transfer via banking app | 3~5 minutes |
| 9 | eDDA HSBC | Pull | HSBC | One-click in app | Minutes |
| 8 | eDDA Hang Seng | Pull | Hang Seng | One-click in app | Minutes |
| 1 | BST | Direct | CMB, MSB | One-click in app | ~10 minutes |
| 10 | Airstar BST | Direct | Airstar | One-click in app | ~10 minutes |
| 5 | Online Banking | Push | Almost all banks | Online banking transfer | 2 hours~3 days |
| 2 | ATM/Counter | Push | Most banks | Visit ATM/counter | 2 hours~next day |
| 4 | Bill Payment | Push | Banks supporting BP | Bank bill pay feature | 2 hours~next day |
| 6 | Cheque | Push | Banks that issue cheques | Write a cheque | 2~3 days |
| 7 | Overseas Remittance | Push | EWB, ZA, Singapore ICBC sub-account | Cross-border remittance | 3~5 days |
The table is sorted by user experience — methods higher up offer better experience and faster crediting. All methods support HKD and USD; FPS, online banking, ATM, and other Push methods additionally support CNH.
Deposit Volume Distribution (Product Priority Reference)
The pie chart below shows the deposit volume share by channel, helping determine priorities:
Key Conclusions:
- HSBC eDDA is the dominant channel (72%) — any change affecting eDDA should be prioritized, and regression testing must cover the HSBC channel
- Pull mode (eDDA) accounts for nearly 80% — validating the product judgment that "users prefer one-click deposits"
- ICBC is the second largest source (12.3%), but has the most system limitations — changes involving ICBC require extra caution
- BST (CMB + MSB + Airstar) accounts for about 4% combined, but is the only option for specific user groups
Data Notes
Deposit volume shares are based on recent business statistics and may fluctuate across different time periods. For product priority reference only; does not represent precise real-time data.
Processing Pipeline for Each Method
The three deposit modes follow completely different processing chains within the system. Details below.
Push Pipeline (FPS / Online Banking / ATM / BP / Cheque / Overseas Remittance)
Key Systems:
- Statement storage:
flows_{trans_type}_{month}sharded tables, partitioned by bank and month - Matching scheduler:
match:{bank}cron job, every 3 minutes per round - Matching result constants defined in
MatchResult.php, flow disposition results defined inBankFlow.php
See Bank Statement Collection and Matching & Auto-crediting for details.
Pull Pipeline (eDDA HSBC / Hang Seng)
Characteristics: The system initiates the debit itself, inherently knowing fund ownership, skipping the matching engine.
Key Data Tables:
- Deposit applications:
applys_{shard}(sharded by user ID) - HSBC eDDI:
hsbc_eddis; Hang Seng eDDI:hs_eddis - Authorization management:
setup_eddis
See eDDA Direct Debit Deposit for details.
Direct Pipeline (BST CMB / MSB / Airstar)
Characteristics: Uses the BST dedicated line protocol (SM2 encryption), also skipping the matching engine. CMB/MSB use Socket long connections; Airstar uses REST API.
See BST Bank-Securities Transfer for details.
Pull Mode: eDDA Deposit
eDDA (Electronic Direct Debit Authorization) offers the best deposit experience — users fill in the amount and confirm within the moomoo App, without switching to a banking app. For users who have linked HSBC or Hang Seng accounts, eDDA has the highest conversion rate among deposit methods.
Prerequisite: One-time authorization. Before first use, the user must complete eDDA authorization, allowing the system to debit from their bank account. Once authorized, it remains valid long-term and subsequent deposits don't require re-authorization.
Why does eDDA skip the matching engine? Because the debit is initiated by the system itself — when the system sends the debit request, it already knows which user and which application the money belongs to. There's no question of "whose money is this."
HSBC and Hang Seng eDDA differ significantly in protocol and authorization rules. See eDDA Direct Debit Deposit for details.
Why is eDDA only available for HSBC and Hang Seng?
eDDA is part of the HKMA (Hong Kong Monetary Authority) FPS system, with unified technical standards, but each bank's API implementation, review process, and commercial terms differ. Currently only HSBC and Hang Seng have completed full integration (commercial agreement + technical integration + production verification). Whether other banks support eDDA and when they can be onboarded depends on the bank's technical readiness and commercial willingness to cooperate. To evaluate the feasibility of adding new eDDA banks -> Deposit Change Guide - Adding eDDA Bank
Push Mode: FPS, Online Banking, and Others
Push mode's common characteristic: the user initiates a transfer on the bank side -> funds arrive at the company's bank account -> the system identifies ownership through the Matching Engine -> crediting.
FPS (Faster Payment System)
FPS offers the best experience among Push modes — transfers settle instantly, statements are pushed to the system in real-time, the matching engine runs every 3 minutes, and typically completes fully automatically in 3~5 minutes.
Why is FPS so fast? Two reasons: first, the FPS network itself settles instantly (unlike interbank transfers that require T+1 clearing); second, SCB and CGB push FPS statements in real-time via API, without waiting for batch files.
Online Banking Transfer
The most widely supported deposit method — almost all banks support it. However, crediting time varies significantly:
- Intra-bank transfer (sending bank = receiving bank): ~2 hours
- Interbank transfer (HKD): 2~3 business days
- Interbank transfer (foreign currency): 3~4 business days
Why the huge difference between intra-bank and interbank? Intra-bank transfers settle internally within the bank on the same day. Interbank transfers go through the interbank clearing system (CHATS), following batch clearing cycles.
Other Push Methods
| Method | Suitable For | Special Notes |
|---|---|---|
| ATM/Counter | Users preferring offline operations | Requires uploading transfer receipt; unclear receipts require resubmission |
| Bill Payment (BP) | Users familiar with bank bill pay | Matching additionally verifies BP number for higher precision |
| Cheque | Users preferring traditional methods | Clearing cycle 2~3 days |
| Overseas Remittance | Users with overseas bank accounts | Matched via sub-account number (not bank card number), wider tolerance due to uncontrollable intermediary bank fees |
Direct Mode: BST Bank-Securities Transfer
BST (Bank-Securities Transfer) is a dedicated channel between banks and securities companies. Like eDDA, the system initiates the debit, but BST uses the BST dedicated line protocol with national encryption algorithm communication.
| Bank | Deposit Method Key | Features |
|---|---|---|
| CMB | bst | Bidirectional BST link, event-driven |
| MSB | bst | Same as CMB |
| Airstar | bstAsb | Virtual bank, API integration |
Prerequisite: The user must complete BST account binding. Once bound, they can deposit with one click in the moomoo App.
Processing Hours: Monday 08:00 ~ Friday 16:00. Deposits outside business hours are queued for automatic processing on the next trading day.
Why is BST limited to CMB, MSB, and Airstar?
BST (Bank-Securities Transfer) is a China-specific bank-securities direct connection protocol, communicating via SM2 national encryption dedicated lines. Only mainland Chinese banks with branches in Hong Kong have BST capability. CMB and MSB were the first two banks to offer BST in Hong Kong, and Airstar Bank (virtual bank) adapted a similar protocol via API. Other foreign banks (HSBC, Hang Seng, SCB, etc.) do not use the BST protocol and use their own deposit channels.
From Application to Crediting: Complete Lifecycle
Regardless of the deposit method, every deposit goes through the following lifecycle:
| Status | Meaning | Typical Trigger |
|---|---|---|
| Pending (0) | User submitted, awaiting fund confirmation | User submits deposit application in App |
| Processing (1) | Funds confirmed, crediting in progress | Push: match success; Pull/Direct: bank debit callback success |
| Completed (2) | Deposit successful, funds credited | SBA Procedure execution complete |
| Rejected (3) | Application rejected | Auto-rejected after timeout / Operations manually rejected |
| Withdrawn (4) | User cancelled | User actively cancelled in App |
| Reversed (5) | Credited funds withdrawn | Bank refund, incorrect crediting correction |
The key difference between the three modes is in the "Pending -> Processing" step:
- Push: Must wait for bank statement to arrive + matching engine to match successfully, could take minutes to days
- Pull (eDDA): System initiates debit -> bank callback success, typically minutes
- Direct (BST): System initiates debit -> bank callback success, typically minutes
Detailed status codes and enum values -> Deposit Quick Reference
Deposit Types and Flow Templates
Each deposit is assigned a DepositType at creation, determining which flow template (i.e., which approval steps are required) it follows.
| Code | Type | Trigger Scenario | Manual Required | Flow Template |
|---|---|---|---|---|
| 1 | NORMAL | Statement matched + auto-credit | No | FLOW_NO_CONFIRM |
| 2 | PRE_APPROVAL | Online account opening first deposit | Depends | FLOW_PRE_CONFIRM |
| 3 | ABNORMAL | Operations manually created | Yes | FLOW_PRE_CONFIRM_ABNORMAL |
| 4 | TRANS_AUTO | Frontend exact match | No | FLOW_NO_CONFIRM |
| 5 | HIGH_RISK | Risk control triggered (blacklist/high-risk country) | Yes | FLOW_CONFIRM |
| 11 | NORMAL_HOLD | eDDI + fund DCA freeze | No | FLOW_NO_CONFIRM |
| 21 | STOCK_HOLD | eDDI + stock DCA freeze | No | FLOW_NO_CONFIRM |
| 31 | FUND_PURCHASE_HOLD | eDDI + fund purchase freeze | No | FLOW_NO_CONFIRM |
5 Flow Templates Explained
Each flow template defines the steps a deposit must go through from "Pending" to "Completed":
| Template | Steps | Scenario |
|---|---|---|
| FLOW_CONFIRM | [SBAConfirm] | Requires operations confirmation before SBA crediting, for high-risk deposits |
| FLOW_NO_CONFIRM | [BankPending] | Fully automatic, just wait for SBA to complete, most common template |
| FLOW_PRE_CONFIRM | [Confirm, AccountPending] | Online account opening users, requires operations confirmation + wait for account readiness |
| FLOW_PRE_NO_CONFIRM | [AccountPending] | Online account opening users, auto-credit + wait for account readiness |
| FLOW_PRE_CONFIRM_ABNORMAL | [Confirm, AccountPending, SBAConfirm] | Full process for abnormal scenarios, three checkpoints |
- Confirm: Operations confirm deposit compliance in the backend
- AccountPending: Wait for user's securities account to be fully opened (online account opening scenario)
- SBAConfirm: Call SBA Procedure to complete fund crediting
- BankPending: Wait for bank-side processing to complete, no manual intervention needed
Code Source: deposit/src/app/Business/Deposit.php:55-230, deposit/src/app/Business/Tasks/Deposit.php:68-80
How to Choose a Deposit Method
As a product manager, the priority for recommending deposit methods:
Core Principle: Pull/Direct > Push. Methods that avoid the matching engine provide better experience and certainty.
| Scenario | Recommended Method | Reason |
|---|---|---|
| New user first deposit | FPS (if supported) or Online Banking | No pre-authorization needed, lowest barrier |
| High-frequency depositor | eDDA or BST | One-click experience, no repeated operations |
| Large deposit (exceeds auto limit) | Any method | Manual confirmation required above limit regardless of method |
| Overseas user | Overseas Remittance | Only option, matched via sub-account |
Deposit Method Availability Logic
The system determines which deposit methods a user can see based on the following factors:
| Factor | Impact | Configuration Source |
|---|---|---|
| Linked bank cards | Determines available bank channels | bankcard_service database, written during card binding |
| eDDA authorization status | eDDA not shown if unauthorized | setup_eddis table, written after successful authorization |
| BST binding status | BST not shown if unbound | bst_bindcards table, written after BST sign-up |
| User location | Different methods shown for HK/Mainland/Overseas | User registration info + region rules in deposit config files |
| Selected currency | JPY, SGD only supported by some methods | deposit/config/trans_type.php currency-method mapping |
| Account opening method | Online/offline opening has different available methods | User account table account_type field |
Processing Hours and Suspension Windows
Not all deposit methods operate 24/7. Here are the precise processing hours for each method:
| Method | Processing Hours | Suspension Window | Behavior Outside Hours |
|---|---|---|---|
| eDDA HSBC/Hang Seng | Mon 07:00 ~ Sat 10:00 | 08:55~09:00, 16:05~16:10 | Queued for next trading day |
| BST CMB/MSB | Trading days 07:00 ~ next day 04:00 | 08:55~09:00, 16:05~16:10 | Queued for next trading day |
| BST Airstar | Trading days 08:00 ~ 22:00 | — | Queued for next trading day |
| FPS | Similar to BST | 08:55~09:00, 16:05~16:10 | Auto-credit suspended, assisted matching continues |
| Matching Engine | 24/7 (every 3 min) | 08:55~09:00, 16:05~16:10 | Matching continues, but auto-credit subject to time restrictions |
| Online Banking/ATM/Cheque | — | — | Waits for matching after statement enters system, no time restrictions |
16:00~16:10 suspension reason: After market close, the system reconciles securities account balances (2412 rule). During this window, all automatic deposits are paused to prevent fund movements from interfering with reconciliation.
If Requirements Change: Adding a New Deposit Method
Code Locations:
- Deposit method definition:
deposit/proto/server/cash_deposit.proto— add new deposit method enum value - Method configuration:
deposit/src/app/Common/DepositMethodConfig.php(if exists) ordeposit/config/directory - Frontend display: App-side deposit method list needs to be updated simultaneously
Steps:
- Define the new method's Key and code number (ensure no conflict with existing 1~10)
- Determine mode: Push/Pull/Direct — determines whether the matching engine is needed
- If Push mode -> need to add a new Match class (refer to
BocMatch.php) - If Pull/Direct -> need to add a new SBA orchestration service (refer to
sba_hase_eddi) - Configure processing hours, tolerance rules, timeout rejection days
- Add display conditions for the new method in the availability logic
If Requirements Change: Modifying Deposit Method Availability Rules
Code Location: deposit/src/app/Business/ directory, availability logic
Common Change Scenarios:
- A bank newly supports FPS -> Add that bank's TransType to the FPS available banks list
- Discontinue a deposit method -> Set the method's condition to false in the availability logic
- Modify online account opening restrictions -> Adjust
account_typerelated logic branches - Modify region restrictions -> Adjust
arearelated logic branches
If Requirements Change: Adjusting Deposit Processing Hours
Code Location: deposit/src/app/Business/DepositConfigNew.php
Key Configuration Items:
- Business hours start/end: approximately lines 34-50, defining Mon~Fri processing window
- Saturday special handling: closes at 09:55 (approximately line 498)
- Suspension window (2412 rule): 16:05~16:10 (approximately lines 603-641)
- USD special start time: 09:01 (approximately line 440)
Note: Modifying processing hours affects all deposit methods that depend on these hours (eDDA, BST, matching engine auto-credit decisions). Comprehensive impact assessment is required.
Role-Based Reading Paths
Different roles focus on different aspects. Recommended reading paths:
New PM (First Week)
| Order | Page | Goal | Est. Time |
|---|---|---|---|
| 1 | This page (Deposit Methods Overview) | Understand 3 modes + 10 methods | 7 min |
| 2 | Getting Started Guide | Walk through 3 scenario tours | 15 min |
| 3 | Matching & Auto-crediting | Understand matching engine core logic | 7 min |
| 4 | Deposit Troubleshooting - Scenarios 1 & 2 | Master 70% of daily issues | 5 min |
| 5 | Deposit Quick Reference | Know where to look up numbers | Browse 2 min |
PM Driving Changes
| Order | Page | Goal |
|---|---|---|
| 1 | Deposit Change Guide | Find the matching scenario, review impact chain and approval requirements |
| 2 | Deposit Quick Reference | Confirm current parameter values |
| 3 | Corresponding topic page | Understand the specific module involved in the change |
Operations Staff
| Order | Page | Goal |
|---|---|---|
| 1 | Deposit Troubleshooting | Master troubleshooting paths for 9 scenarios |
| 2 | Manual Matching Guide | Master daily matching operations |
| 3 | This page - Deposit Methods at a Glance | Understand crediting times for each method |
| 4 | Bank Statement Collection | Understand statement arrival mechanisms |
Common Misconceptions
| Misconception | Fact |
|---|---|
| "There's only one deposit method" | There are 10, split into Push/Pull/Direct modes with vastly different experiences and timeframes |
| "eDDA is related to withdrawals" | eDDA/eDDI is only used for deposit direct debit. Withdrawals go through corporate online banking transfers |
| "All deposits require the matching engine" | Only Push mode requires it. Pull (eDDA) and Direct (BST) skip the matching engine |
| "Deposit crediting time depends on our system" | Most waiting time is bank statement arrival delay, not our system processing speed |
| "BST and eDDA use the same technology" | Completely different. BST uses a dedicated BST line (SM2-encrypted Socket), eDDA uses the FPS system (HTTPS/SM2 HTTP) |
| "Auto-credit = instant" | Auto-credit still needs to wait for the matching engine's 3-minute cycle + SBA crediting time. Minimum 3~5 minutes |
After Reading
| I want to... | Go to |
|---|---|
| Understand how card binding and authorization enable deposit channels | Card Binding & Deposit Authorization |
| Understand how the matching engine works | Matching & Auto-crediting |
| Understand the complete eDDA direct debit flow | eDDA Direct Debit Deposit |
| See how bank statements enter the system | Bank Statement Collection |
| What to do when a deposit has problems | Deposit Troubleshooting |
| Look up limits, tolerances, timeout numbers | Deposit Quick Reference |
| Drive deposit change requirements | Deposit Change Guide |
| Understand refund and reversal mechanisms | Refund & Reversal |